Представление списка префиксов ip в Python с использованием pytricia, ipaddress или любой другой библиотеки - PullRequest
0 голосов
/ 06 октября 2019

Попытка представить список префиксов ip в python, используя pytricia или ip address, но ни один из них не ведет себя должным образом, когда дело доходит до проверки, существует ли префикс в списке префиксов или нет

ip prefix-list PFXLST seq 10 permit 0.0.0.0/0
ip prefix-list PFXLST seq 20 permit 172.16.0.0/12
ip prefix-list PFXLST seq 30 permit 192.168.0.0/16

представлять и проверять, как это ...

>>> from ipaddress import ip_network
>>> from pytricia import PyTricia
>>>
>>> prefix_list = PyTricia()
>>> [prefix_list.insert(subnet, "permit") for subnet in ["0.0.0.0/0", "172.16.0.0/12", "192.168.0.0/16"]]
[None, None, None]
>>> ip_network("10.0.0.0/8") in prefix_list
True

С другой стороны

>>> [prefix_list.insert(subnet, "permit") for subnet in ["172.16.0.0/12", "192.168.0.0/16"]]
[None, None]
>>> ip_network("10.0.0.0/8") in prefix_list
False

Любая идея, почему условие возвращает True в первом случае ?! и если есть альтернатива этому, пожалуйста!

Благодарим за помощь! :)

1 Ответ

1 голос
/ 06 октября 2019

Я не уверен на сто процентов о том, как pytricia обрабатывает оператор in, однако ...

, если ожидается, что pytricia увидит, присутствует ли подсеть в другой подсети, тогда... имейте в виду, что 0.0.0.0/0 является маршрутом с четырьмя нулями и по сути является подсетью, которая содержит все остальные подсети.

Таким образом, если 0.0.0.0/0 находится в prefix_list и если pytricia проверяет, включена ли данная подсеть (то есть 10.0.0.0/8) полностью в какую-либо из подсетей в pytricia prefix_list, то, предположительно, любой список префиксов, который содержит нулевой маршрут Quad, будет автоматически включать все другие подсети и всегда будет возвращать True.

Как пример:

Если я создаю меньшийprefix_list без Quad Zero Route и затем проверьте, полностью ли содержится данная подсеть (то есть 172.16.0.0/13) в этом prefix_list, тогда мы получим True, как и ожидалось, поскольку данная подсеть содержится в 172.16.0.0/12.

>>> for subnet in ["172.16.0.0/12", "192.168.0.0/16"]:
    prefix_list.insert(subnet, "permit")

>>> ip_network("172.16.0.0/13") in prefix_list
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...