使用pytricia、ipaddress或任何其他库在Python中表示ip前缀列表

使用pytricia、ipaddress或任何其他库在Python中表示ip前缀列表,python,networking,Python,Networking,试图用pytricia或ip地址在python中表示ip前缀列表,但在检查前缀列表中是否存在前缀时,这两种方法都不能正常工作 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 im

试图用pytricia或ip地址在python中表示ip前缀列表,但在检查前缀列表中是否存在前缀时,这两种方法都不能正常工作

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
?!如果有别的办法,请


谢谢你的帮助!:)

我不是百分之百清楚pytricia是如何处理操作符中的
的,但是

如果希望pytricia查看另一个子网中是否存在子网,则。。。请注意,
0.0.0.0/0
是四路零路由,本质上是包含所有其他子网的子网

因此,如果
0.0.0/0
前缀列表中,并且
pytricia
正在检查给定子网(即
10.0.0.0/8
)是否完全包含在
pytricia
前缀列表中的任何子网中,则推测,包含四元零路由的任何前缀列表将自动包括所有其他子网,并始终返回
True

例如: 如果我创建一个较小的
前缀列表
,而不使用四元零路由,然后检查给定子网(即
172.16.0.0/13
)是否完全包含在该前缀列表中,那么我们会得到
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

您正在寻找的替代方案是
具有\u key()

从pytricia文档中:

has_key方法也是实现的,但需要注意的是in的行为不同于has_key。has_key方法检查网络前缀是否完全匹配


正如E.Ducateme正确地说的那样,
中的
操作符检查前缀是否在trie中“覆盖”。你要找的是
有_key()
,它可以检查是否完全匹配。

如果我没有把问题说清楚,很抱歉;我是在询问条件,第一种情况下没有在prefix_list True中填写>>>ip_网络(“10.0.0.0/8”),而第二种情况下在prefix_list False中填写>>>ip_网络(“10.0.0.0/8”)case@zigzag谢谢你的澄清。我完全修改了答案。请看一看,看看这是否提供了一些关于您的代码正在做什么的见解。感谢您的关注。我现在更清楚地了解了pytricia的行为,但这并不是前缀列表的逻辑过滤子网的方式,我正在研究写一些东西来表示前缀列表,然后我将前缀传递给它以检查它是否被允许或拒绝。你知道怎么做吗?再次感谢这里的帮助:)解决方案可能是从配置文件中读取行&对于任何“允许”规则,请在
pytricia
树中创建匹配的子网。因此,当
pytricia
检查子网是否属于已知良好子网列表时,任何匹配项都将通过>但是>如果配置文件列出了允许的
0.0.0/0
规则,这将破坏系统&基本上允许所有子网。注意:感觉这正在成为一个新问题。如果上述答案足以回答您的第一个问题,请接受答案并考虑提交一个新问题。每个IPv4地址在<代码> 0.0.0.0 / 0 网络中。每个IPv4网络都是
0.0.0.0/0
网络的子网。这就是为什么
0.0.0.0/0
路由表条目是默认路由(最后的路由),因为它将是最短的匹配,并且在路由表中首选较长的匹配,但是如果没有较长的匹配,则
0.0.0/0
将匹配任何地址。