2016-08-10 2 views
4

複数のプレフィックスのサブネットへのネットワーク。たとえば、a/16をとり、X/23とY/24に分割します。分割私は<code>netaddr</code>モジュールを使用して、私は様々なプレフィックスのネットワークをサブネットに分割することができるかどうか/を把握しようとしている

subnet関数を使用して、与えられた接頭辞のX番号のネットワークを分割することができますが、接頭辞は1つのみです。

上記素晴らしいです/ 16のうち4/23Sをスライスだろうが、どのように私は、異なる接頭辞に残りのスペースやスライスを取るのですか?

ip = IPNetwork('172.24.0.0/16') 
subnets = list(ip.subnet(23, count=4)) 

私はnetaddrを使って何をしようとしていますか?

答えて

3

は以下

from netaddr import IPNetwork, cidr_merge, cidr_exclude 

class IPSplitter(object): 
    def __init__(self, base_range): 
     self.avail_ranges = set((IPNetwork(base_range),)) 

    def get_subnet(self, prefix, count=None): 
     for ip_network in self.get_available_ranges(): 
      subnets = list(ip_network.subnet(prefix, count=count)) 
      if not subnets: 
       continue 
      self.remove_avail_range(ip_network) 
      self.avail_ranges = self.avail_ranges.union(set(cidr_exclude(ip_network, cidr_merge(subnets)[0]))) 
      return subnets 

    def get_available_ranges(self): 
     return sorted(self.avail_ranges, key=lambda x: x.prefixlen, reverse=True) 

    def remove_avail_range(self, ip_network): 
     self.avail_ranges.remove(ip_network) 

あなたは以下のようにそれを使用することができます試してみてください。 1つのブロックからカウントが満たされていない場合、2つの異なるブロックからサブネットを切り取るなど、より効率的にすることができます。私の場合は

In [1]: from ip_splitter import IPSplitter 

In [2]: s = IPSplitter('172.24.0.0/16') 

In [3]: s.get_available_ranges() 
Out[3]: [IPNetwork('172.24.0.0/16')] 

In [4]: s.get_subnet(23, count=4) 
Out[4]: 
[IPNetwork('172.24.0.0/23'), 
IPNetwork('172.24.2.0/23'), 
IPNetwork('172.24.4.0/23'), 
IPNetwork('172.24.6.0/23')] 

In [5]: s.get_available_ranges() 
Out[5]: 
[IPNetwork('172.24.8.0/21'), 
IPNetwork('172.24.16.0/20'), 
IPNetwork('172.24.32.0/19'), 
IPNetwork('172.24.64.0/18'), 
IPNetwork('172.24.128.0/17')] 

In [6]: s.get_subnet(28, count=10) 
Out[6]: 
[IPNetwork('172.24.8.0/28'), 
IPNetwork('172.24.8.16/28'), 
IPNetwork('172.24.8.32/28'), 
IPNetwork('172.24.8.48/28'), 
IPNetwork('172.24.8.64/28'), 
IPNetwork('172.24.8.80/28'), 
IPNetwork('172.24.8.96/28'), 
IPNetwork('172.24.8.112/28'), 
IPNetwork('172.24.8.128/28'), 
IPNetwork('172.24.8.144/28')] 

In [7]: s.get_available_ranges() 
Out[7]: 
[IPNetwork('172.24.8.128/25'), 
IPNetwork('172.24.9.0/24'), 
IPNetwork('172.24.10.0/23'), 
IPNetwork('172.24.12.0/22'), 
IPNetwork('172.24.16.0/20'), 
IPNetwork('172.24.32.0/19'), 
IPNetwork('172.24.64.0/18'), 
IPNetwork('172.24.128.0/17')] 
+0

感謝 – alanwill

1

プレフィックスは完全に任意ではなく、彼らは常にさえ分割になります。例えば、/ 24の場合、私はいつも6/27と4/28を求め、23の場合は2/26、2/26、2/27、4/28を常に求めます。/24または/ 23のどちらかで始めるようにしてください。スキームはかなり予測可能です。

これは私が/ 23用/ 24と同様のためにつもりです:

ip = IPNetwork('10.40.72.0/24') 
network28s = list(ip.subnet(28, count=16)) 
presentation1 = list(network28s[0:1]) 
presentation2 = list(network28s[1:2]) 
database1 = list(network28s[2:3]) 
database2 = list(network28s[3:4]) 
internetlb1 = cidr_merge(list(network28s[4:6])) 
internetlb2 = cidr_merge(list(network28s[6:8])) 
internet1 = cidr_merge(list(network28s[8:10])) 
internet2 = cidr_merge(list(network28s[10:12])) 
application1 = cidr_merge(list(network28s[12:14])) 
application2 = cidr_merge(list(network28s[14:16])) 

私は唯一のためのスキームは非常に予測可能であるという事実をこの操作を行う可能性があり、予測可能で、私は意味それらの10のサブネットは常に要求され、それらは常に同じサイズになり、唯一の違いはCIDR自体です。

1

最初に数値を/23に分割してから、特定の数の数値を/24に分割することができます。クイックサンプルコードは私の頭の上から外します。その詳細かつ適切な対応のための

>>> from netaddr import * 
>>> ip = IPNetwork('172.24.0.0/16') 
>>> subnet_23 = list(ip.subnet(23)) 
>>> subnet_23[:6] 
[IPNetwork('172.24.0.0/23'), IPNetwork('172.24.2.0/23'), IPNetwork('172.24.4.0/23'), IPNetwork('172.24.6.0/23'), IPNetwork('172.24.8.0/23'), IPNetwork('172.24.10.0/23')] 
>>> len(subnet_23) 
128 
>>> final_subnets = [] 
>>> number_of_24s_wanted = 10 
>>> for s in subnet_23: 
... if len(final_subnets) < number_of_24s_wanted: 
...  final_subnets.extend(list(s.subnet(24))) 
... else: 
...  final_subnets.append(s) 
... 
>>> final_subnets[:20] 
[IPNetwork('172.24.0.0/24'), IPNetwork('172.24.1.0/24'), IPNetwork('172.24.2.0/24'), IPNetwork('172.24.3.0/24'), IPNetwork('172.24.4.0/24'), IPNetwork('172.24.5.0/24'), IPNetwork('172.24.6.0/24'), IPNetwork('172.24.7.0/24'), IPNetwork('172.24.8.0/24'), IPNetwork('172.24.9.0/24'), IPNetwork('172.24.10.0/23'), IPNetwork('172.24.12.0/23'), IPNetwork('172.24.14.0/23'), IPNetwork('172.24.16.0/23'), IPNetwork('172.24.18.0/23'), IPNetwork('172.24.20.0/23'), IPNetwork('172.24.22.0/23'), IPNetwork('172.24.24.0/23'), IPNetwork('172.24.26.0/23'), IPNetwork('172.24.28.0/23')] 
>>> len(final_subnets) 
133 
関連する問題