2013-06-20 5 views
7

दो सीआईडीआर पते दिए गए हैं 1 9 2.168.2.0/14 और 1 9 .168.2.0/32जांचें कि क्या दो सीआईडीआर पते छेड़छाड़ करते हैं?

मैं कैसे जांचूं कि दो आईपी पते "python2.6" में ओवरलैप करते हैं ??

मैं netaddr माध्यम से चले गए और यह अगर 192.168.2.0 दो सीआईडीआर पते के लिए जाँच करने के लिए

from netaddr import IPNetwork, IPAddress 
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"): 

लेकिन यह कैसे द्वारा सीआईडीआर पता 192.168.2.0/14 में है की जांच करने के लिए अनुमति देता है ??

मैं एक संदर्भ :: How can I check if an ip is in a network in python

+0

FYI करें, 192.168.2.0/32 एक ही आईपी पते (192.168.2.0), नहीं एक सबनेट है। – slebetman

+0

क्या आप एक ऐसा उत्तर स्वीकार करेंगे जो पायथन विशिष्ट नहीं है? जानकारी के लिए – slebetman

+0

Thnx। मुझे इसे अजगर में चाहिए लेकिन आपकी व्याख्या उपयोगी हो सकती है। – AJRedDevil

उत्तर

8

ipaddr का उपयोग करना:

>>> import ipaddr 
>>> n1 = ipaddr.IPNetwork('192.168.1.0/24') 
>>> n2 = ipaddr.IPNetwork('192.168.2.0/24') 
>>> n3 = ipaddr.IPNetwork('192.168.2.0/25') 
>>> n1.overlaps(n2) 
False 
>>> n1.overlaps(n3) 
False 
>>> n2.overlaps(n3) 
True 
>>> n2.overlaps(n1) 
False 
+0

धन्यवाद पुस्तकालय वही करता है जो मैं चाहता हूं। – AJRedDevil

+0

क्या वही कोड आईपीवी 6 के लिए भी काम करता है या यह केवल आईपीवी 4 का समर्थन करता है? – AJRedDevil

+0

आईपीवी 6 के लिए काम करते हैं। 'ipaddr.IPNetwork (':: 1 9 2.168.0.0/120') ओवरलैप (ipaddr.IPNetwork (':: 192.168.0.0/121'))' सही और 'ipaddr.IPNetwork (':: 1 9 2.168.4.0/120 ')। ओवरलैप्स (ipaddr.IPNetwork (' :: 192.168.0.0/121 '))' झूठा – falsetru

1

तो पाया परीक्षण के लिए हाथ में netaddr की जरूरत नहीं है, लेकिन मुझे लगता है कि अगर पहले नेटवर्क का first और last पते के दोनों दूसरे में निहित हैं आप जांच कर सकता है:

net_1 = IPNetwork("192.168.2.0/14") 
net_2 = IPNetwork("192.168.2.0/32") 
if net_1.first in net_2 and net_1.last in net_2: 
    # do something 

Btw, IPNetworkline 1102 एक __contains__ विधि को परिभाषित करता है। लेकिन मुझे यकीन नहीं है कि line 1127 टूटा नहीं है? यदि आप हैं तो आपको एक बग का परीक्षण और रिपोर्ट करनी चाहिए।

5

मुझे लगता है कि आप वास्तव में सीआईडीआर दोनों श्रेणियों का प्रतिनिधित्व करना चाहते हैं, भले ही आपके उदाहरण में, 1 9 2.168.2.0/32 केवल एक ही पता का प्रतिनिधित्व करता है। यह भी ध्यान रखें कि 1 9 2.168.2.0/14 में, 2। अर्थहीन है, क्योंकि 14-बिट उपसर्ग तीसरे ऑक्टेट तक नहीं पहुंचता है।

वैसे भी, ऐसा करने के कई तरीके हैं। आप देख सकते हैं कि उन्हें ओवरलैप के लिए, एक हमेशा दूसरे की एक सबसेट होना चाहिए:

def cidrsOverlap(cidr0, cidr1): 
    return cidr0 in cidr1 or cidr1 in cidr0 

या आप नोटिस सकता है कि सीमाओं को ओवरलैप करने के लिए, पहली श्रेणी के न्यूनतम पते से कम या उसके बराबर होना चाहिए दूसरी श्रेणी का उच्चतम पता, और इसके विपरीत। इस प्रकार:

def cidrsOverlap(cidr0, cidr1): 
    return cidr0.first <= cidr1.last and cidr1.first <= cidr0.last 

print cidrsOverlap(IPNetwork('192.168.2.0/24'), IPNetwork('192.168.3.0/24')) 
# prints False 

print cidrsOverlap(IPNetwork('192.168.2.0/23'), IPNetwork('192.168.3.0/24')) 
# prints True 
+0

धन्यवाद सीमा तुलना काम करता है। एक और बात, क्या आप आईपी पते को ओवरलैप कर सकते हैं ?? – AJRedDevil

+2

ओवरलैप किए गए आईपी पते छोटी श्रेणी के साथ सबनेट है: यानी, '/' के बाद उच्च संख्या है। इसलिए, 1 9 2.168.2.0/23 और 1 9 2.168.2.0/24 के बीच ओवरलैप किए गए पते 192.168.2.0/24 हैं। याद रखें, सीआईडीआर सबनेट "ओवरलैप" नहीं कर सकता है। उनमें केवल एक छोटा सीआईडीआर सबनेट हो सकता है या नहीं। – slebetman

+0

@AJRedDevil चूंकि एक हमेशा दूसरे का उप-समूह होता है, ओवरलैप केवल छोटी सी सीमा होती है। ओवरलैप (छोटी रेंज) में पहला पता 'अधिकतम (cidr0.first, cidr1.first) 'है। अंतिम पता 'min (cidr0.last, cidr1.last)' है। –

संबंधित मुद्दे