一、初衷:
一般在cmdb裡會儲存一台伺服器的內網ip、管理ip、電信ip、聯通ip,我們在使用的時候只需要拿到其中乙個外網ip位址即可。那麼我們就需要判斷內網ip、管理ip並剔除掉,獲取第乙個外網ip。
例如三線機房伺服器:
10.20.0.111(內網ip),221.222.222.33, 8.8.8.8, 1114.114.144.114, 10.20.1.100(管理ip)
二、原理**:
內網ip可分為三類:
區域網在選取使用私有位址時,一般會按照實際需要容納的主機數來選擇私有位址段。常見的區域網由於容量小,一般選擇c類的192.168.0.0作為位址段使用,一些大型企業就需要使用b類甚至a類位址段作為內部網路的位址段。
實現**:
1defip_into_int(ip):2#
先把 192.168.1.13 變成16進製制的 c0.a8.01.0d ,再去了「.」後轉成10進製的 3232235789 即可。3#
(((((192 * 256) + 168) * 256) + 1) * 256) + 13
4return reduce(lambda x,y:(x<<8)+y,map(int,ip.split('.'
)))5
6def
is_internal_ip(ip):
7 ip =ip_into_int(ip)
8 net_a = ip_into_int('
10.255.255.255
') >> 24
9 net_b = ip_into_int('
172.31.255.255
') >> 20
10 net_c = ip_into_int('
192.168.255.255
') >> 16
11return ip >> 24 == net_a or ip >>20 == net_b or ip >> 16 ==net_c
1213
if__name__ == '
__main__':
14 ip = '
192.168.0.1'15
ip, is_internal_ip(ip)
16 ip = '
10.2.0.1'17
ip, is_internal_ip(ip)
18 ip = '
172.16.1.1'19
print ip, is_internal_ip(ip)
執行結果:
[root@ ubuntu]$ python p.py192.168.0.1true
10.2.0.1true
172.16.1.1 true
其中map和reduce函式的用法介紹:
>>> map(int, '12.34
'.split('.'
))[12, 34]
>>> reduce(lambda x,y:(x<<8)+y, [12, 34])
3106
#左移8位,相當於乘以256
>>> 12 * 256 + 34
3106
三、例項
1#!/usr/bin/python2#
-*-coding:utf8-*-
34 vid =
5 real_host ={}67
#判斷內網ip
8def
ip_into_int(ip):
9return reduce(lambda x,y:(x<<8)+y,map(int,ip.split('.'
)))10
11def
is_internal_ip(ip):
12 ip =ip_into_int(ip)
13 net_a = ip_into_int('
10.255.255.255
') >> 24
14 net_b = ip_into_int('
172.31.255.255
') >> 20
15 net_c = ip_into_int('
192.168.255.255
') >> 16
16return ip >> 24 == net_a or ip >>20 == net_b or ip >> 16 ==net_c
1718
ef get_ips(vid):
1920 t =len(vid)
21for i in
range(t):
22 host_ip =
23 ips_url = '
' %vid[i]
24 ips =urllib2.urlopen(ips_url)
25 ips_json =json.loads(ips.read())
2627 t2 = len(ips_json['
object'])
28for k in
range(t2):
29 flag =0
30 ip_list = ips_json['
object
'][k].split(','
)3132 t3 =len(ip_list)
33for m in
range(t3):
34if flag ==0 and is_internal_ip(ip_list[m]) ==false:
3536 flag = 1
3738 real_host[vid[i]] =host_ip
3940
ips.close()
41return real_host
其中ip_list = [10.20.0.111, 221.222.222.33, 8.8.8.8, 1114.114.144.114, 10.20.1.100],通過迴圈依次取ip位址,判斷後存第乙個ip到host_ip。並設定flag =1 說明已取到此機器的外網ip,可以去下乙個機器的了。
內網IP段分類 判斷ip是否是內網ip
在公網 連internet的 是看不到這些ip的,使用這些ip一定是你在公司或學校內網中,比如公司路由下。這些私有位址在公司 組織 內網中,可重複出現在不同公司組織內部。比如你在公司內部的使用分配到的內網ip192.168.1.12和另一家公司的朋友qq聊天,碰巧他的內網ip也是192.168.1....
判斷機器IP是公網ip還是內網ip
首先是恭喜開通blog ip位址分為五類。e類為保留為今後使用,d類為組播位址。用於主機網路位址的就是a類 b類 c類了。10.0.0.0 8 10.0.0.0 10.255.255.255 172.16.0.0 12 172.16.0.0 172.31.255.255 192.168.0.0 16...
如何判斷自己IP是內網IP還是外網IP
tcp ip協議中,專門保留了三個ip位址區域作為私有位址,其位址範圍如下 10.0.0.0 8 10.0.0.0 10.255.255.255 172.16.0.0 12 172.16.0.0 172.31.255.255 192.168.0.0 16 192.168.0.0 192.168.25...