使用pytricia、ipaddress或任何其他库在Python中表示ip前缀列表
试图用pytricia或ip地址在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
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
将匹配任何地址。