一、初衷:

  一般在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可分为三类:

  • A类地址:10.0.0.0--10.255.255.255
  • B类地址:172.16.0.0--172.31.255.255
  • C类地址:192.168.0.0--192.168.255.255
局域网在选取使用私有地址时,一般会按照实际需要容纳的主机数来选择私有地址段。常见的局域网由于容量小,一般选择C类的192.168.0.0作为地址段使用,一些大型企业就需要使用B类甚至A类地址段作为内部网络的地址段。
 
实现代码:
  

  1. def ip_into_int(ip):
  2. # 先把 192.168.1.13 变成16进制的 c0.a8.01.0d ,再去了“.”后转成10进制的 3232235789 即可。
  3. # (((((192 * 256) + 168) * 256) + 1) * 256) + 13
  4. return reduce(lambda x,y:(x<<8)+y,map(int,ip.split('.')))
  5.  
  6. def 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
  11. return ip >> 24 == net_a or ip >>20 == net_b or ip >> 16 == net_c
  12.  
  13. if __name__ == '__main__':
  14. ip = '192.168.0.1'
  15. print ip, is_internal_ip(ip)
  16. ip = '10.2.0.1'
  17. print ip, is_internal_ip(ip)
  18. ip = '172.16.1.1'
  19. print ip, is_internal_ip(ip)

运行结果:

  1. [root@ ubuntu]$ python p.py
  2. 192.168.0.1 True
  3. 10.2.0.1 True
  4. 172.16.1.1 True
其中map和reduce函数的用法介绍:
  1. >>> map(int, '12.34'.split('.'))
  2. [12, 34]
  3. >>> reduce(lambda x,y:(x<<8)+y, [12, 34])
  4. 3106
  5. # 左移8位,相当于乘以256
  6. >>> 12 * 256 + 34
  7. 3106

三、实例

 

  1. #!/usr/bin/python
  2. #-*-coding:utf8-*-
  3.  
  4. vid = []
  5. real_host = {}
  6.  
  7. #判断内网IP
  8. def ip_into_int(ip):
  9. return reduce(lambda x,y:(x<<8)+y,map(int,ip.split('.')))
  10.  
  11. def 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
  16. return ip >> 24 == net_a or ip >>20 == net_b or ip >> 16 == net_c
  17.  
  18. ef get_ips(vid):
  19.  
  20. t = len(vid)
  21. for i in range(t):
  22. host_ip = []
  23. ips_url = 'http://www.google.com/IP.do?versionId=%d ' % vid[i]
  24. ips =urllib2.urlopen(ips_url)
  25. ips_json = json.loads(ips.read())
  26.  
  27. t2 = len(ips_json['object'])
  28. for k in range(t2):
  29. flag = 0
  30. ip_list = ips_json['object'][k].split(',')
  31.  
  32. t3 =len(ip_list)
  33. for m in range(t3):
  34. if flag ==0 and is_internal_ip(ip_list[m]) == False:
  35. host_ip.append(ip_list[m])
  36. flag = 1
  37.  
  38. real_host[vid[i]] = host_ip
  39.  
  40. ips.close()
  41. return 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,可以去下一个机器的了。

python 判断内网IP方法及实例应用的更多相关文章

  1. Python判断内网IP

    def ip_into_int(ip): # 先把 192.168.1.13 变成16进制的 c0.a8.01.0d ,再去了"."后转成10进制的 3232235789 即可. ...

  2. Python获取内网IP

    Python 获取本机内网IP 本文记录使用Python获取本机IP的两种方法. 通过hostname来获取本机IP import socket print(socket.gethostbyname( ...

  3. php获取代理服务器真实内网IP方法

     功能:获取用户真实IP地址,代理服务器内网IP,防HTTP_CDN_FORWARDED_FOR注入 function getIP() { if (isset($_SERVER["HTTP_ ...

  4. Nginx 反向代理,流量转发到固定内网 IP 方法

    主配置文件: user nginx; worker_processes ; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pi ...

  5. 判断内网机器的真实外网IP或域名的方法总结

    在内渗透中有时需要在某台WEB服务器中留下后门,可以通过内网IP建立IPC连接,但还需要获知外网IP才能访问Wbshell,在无网关权限的情况下,我总结了有如下方法: nslookup myip.op ...

  6. 通过js获取内网ip和外网ip的简单方法 ...

    今天遇到了一个需求,需要获取用户当前的内网ip, 找了半天终于找到了方法,遂将找到的方法记录下来,留给需要的人. 1,获取内网ip function getIP(callback) { let rec ...

  7. 如何判断自己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- ...

  8. JAVA判断IP是否是内网IP

    /** * 私有IP: * A类  10.0.0.0-10.255.255.255   * B类  172.16.0.0-172.31.255.255   * C类  192.168.0.0-192. ...

  9. Dubbo_异常_Service启动时默认将方法注册到内网IP

    一.背景 一般Dubbo服务都是通过内网调用,Dubbo服务启动时默认会将服务注册到内网IP,消费端就无法从外网访问. 二.解决过程 1.Linux的hosts中设置外网IP a) 通过hostnam ...

随机推荐

  1. dump java

    http://www.gamlor.info/wordpress/2011/09/visualvm/ https://visualvm.java.net/zh_CN/gettingstarted.ht ...

  2. Wireshark-BPF过滤规则

    设置过滤规则就是让网络设备只是捕获我们感兴趣的网络数据包,如果没有设置过滤规则,即上面的 filter_app 是空字符串,那么网络设备就捕获所有类型的数据包,否则只是捕获过滤规则设置的数据包,此时过 ...

  3. 用margin还是用padding

    用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. 分类: Html/CSS | 转载请注明: 出自 海玉的博客 本文地址: http://www.hicss.net/use ...

  4. pip使用报错【cannot import name HTTPSHandler】

    python2.7,报错如下: Traceback (most recent call last): File "/usr/local/bin/pip", line 9, in & ...

  5. 20150906VS小知识

    .sln :解决方案管理文件.caproj:项目管理文件.cs:程序源代码文件项目文件目录下有个bin文件夹,里面的debug文件夹,里面存放生成后的程序. //注释一行/* */ 注释一段 alt ...

  6. 怎么用ABBYY创建属于自己的PDF

    怎么创建一份属于自己的PDF文档呢?由于PDF格式文件具有跨平台.支持超长文件.安全可靠性高等诸多优势,在日常办公学习中应用越来越广泛.而随着技术的发展,各种办公软件也对PDF提供越来越多的支持,但P ...

  7. c编码-2

    1.重设socket缓冲区 系统提供的socket缓冲区大小为8K,你可以将之设置为64K,尤其在传输实时视频时. [root@8A_3 src]# gcc socka.c[root@8A_3 src ...

  8. linux概念之时间与时区

    http://www.cnblogs.com/liuyou/archive/2012/07/29/2614338.html Linux时间基准 以上我们了解了RTC(实时时钟.硬件时钟)和OS时钟(系 ...

  9. 虚拟化之vmware-网络

    http://blog.sina.com.cn/s/blog_6b89db7a01012jtw.htmlESXI 5.0 虚拟机的网络适配器兼容性列表 就需要在vSphere标准交换机(vSphere ...

  10. maxsdk sample中3dsexp.rc点不开并提示specstrings.h中找不到sal.h解法

    在网上下载sal.h文件并拷贝到specstrings.h所在目录(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include)即可. sa ...