zoukankan      html  css  js  c++  java
  • 2.python IP/DNS地址处理之IPy/Dnspython模块

     1.IPy模块

    在IP地址规划中,涉及到计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等,即便是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工具,可以帮助实现计算子网掩码、网络掩码、广播地址、子网数、IP类型等。

    github模块下载地址:https://github.com/autocracy/python-ipy

    我这里使用windows10,采用pip install IPy 安装

    在日常使用中,常见的IP操作包括IP类型判断,IP转换,反向解析,输出网段地址等。

    基本使用:

    1.获取IP地址的版本(IPV4 or IPV6)

    >>> import IPy
    >>> from IPy import IP
    >>> IP('10.0.0.1').version()
    4
    >>> IP('::1').version()
    6

    #4 表示IPv4,6 表示IPv6

    2.获取子网IP地址的个数

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/27')
    >>> ip.len()
    32
    # 排除网络地址和广播地址,所以可用地址是30个

    3.获取IP地址的类型(私有IP or 公有IP)

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.iptype()
    'PRIVATE'
    >>> ip1 = IP('8.8.8.8')
    >>> ip1.iptype()
    'PUBLIC'
    # PRIVATE 表示私有地址,PUBLIC 表示公有地址

    ---------------------------------------------------

    4.把IP地址转换成整数格式

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.int()
    167772161

    5.把IP地址转换成十六进制/二进制格式

    >>> from IPy import IP
    >>> ip = IP('10.0.0.1')
    >>> ip.strHex()  #转换成十六进制
    '0xa000001'
    >>> ip.strBin()   #转换成二进制
    '00001010000000000000000000000001'

    6.把十六进制/二进制格式转换成IP

    >>> from IPy import IP
    >>> print(IP('0xa0000001'))
    10.0.0.1
    >>> print(IP(167772161))
    10.0.0.1

    -------------------------------------------------

    7.网络地址的转换,根据IP和子网掩码生成网段格式:

    >>> print (IP('192.168.100.0').make_net('255.255.255.0'))
    192.168.100.0/24
    >>> print (IP('192.168.100.0/255.255.255.0',make_net=True))
    192.168.100.0/24
    >>> print (IP('192.168.100.0-192.168.100.255',make_net=True))
    192.168.100.0/24

    8.反向解析地址格式

    >>> IP('8.8.8.8').reverseNames()
    ['8.8.8.8.in-addr.arpa.']

    9.判断网段大小

    >>> IP('10.0.0.0/24') > IP('10.0.0.0/16')
    True

    10.判断IP是否在网段内

    >>> '192.168.1.100' in IP('192.168.1.0/24')
    True

    11.判断网段是否在网段内

    >>> IP('192.168.1.0/24') in IP('192.168.0.0/16')
    True

    12.判断网段是否重叠

    >>> IP('192.168.0.0/16').overlaps('192.165.1.0')
    0
    >>> IP('192.168.0.0/16').overlaps('192.168.1.0')
    1
    #0 表示不重叠,1表示重叠

    13.获取的网段的子网掩码,以及广播地址

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/30')
    >>> ip.netmask()
    IP('255.255.255.252')
    >>> ip.broadcast()
    IP('10.0.0.3')

    14.对于网段的地址,可以利用for循环,得到其包含的所有的IP地址

    >>> from IPy import IP
    >>> ip = IP('10.0.0.0/30')
    >>> for i in ip:
        print(i)
        
    10.0.0.0
    10.0.0.1
    10.0.0.2
    10.0.0.3

    2.Dnspython模块

    dnspython模块中最常用的域名查询,它提供了一个DNS解析器类–resolver,使用resolver的query方法来实现域名的查询功能。query方法的定义如下:

    query(self, qname, rdtype=1, rdclass=1, tcp=False, source=None, raise_on_no_answer=True, source_port=0)
    其中,qname表示待查询的域名;rdtype用来指定待查询的类型,如A记录、MX记录、NS记录等;rdclass用来指定网络类型,如IN、CH、HS等,
    默认为IN;tcp用来指定查询时是否使用TCP协议,默认为False;source和source_port用于指定查询源地址与端口,默认为查询设备IP和0端口;
    raise_on_no_answer用来指定当查询无应答时是否触发异常。

    常见的DNS解析类型包括A,MX,NS,CNAME等。利用dnspython的dns.resolver.query方法可以简单实现这些DNS类型的查询,为后面要实现的功能提供数据来源,比如对一个使用DNS轮循业务的域名进行可用性监控,需要得到当前的解析结果。

    1.A记录/CNAME记录

    import dns.resolver
    domain = input('please input an domain: ') #请输入域名地址
    A = dns.resolver.query(domain,'A')
    for i in A.response.answer:
        for j in i.items:
            if isinstance(j, dns.rdtypes.IN.A.A): ##如果是A记录类型,则输出地址
                print('A记录: %s' % j.address) 
            if isinstance(j, dns.rdtypes.ANY.CNAME.CNAME): ##如果是CNAME记录,则直接输出
                print('CNAME: %s' % j)

    2.MX记录查询

    import dns.resolver
    domain = input('please input an domain:  ')    
    MX = dns.resolver.query(domain,'MX')          #指定查询域名以及MX类型
    for i in MX:
        print("MX preference =%d,mail exchanger=%s" %(i.preference,i.exchange))

    3.NS记录查询

    import dns.resolver
    domain = input('please input an domain:  ')    
    NS = dns.resolver.query(domain,'NS')          #指定查询域名以及MX类型
    for i in NS.response.answer:
         for j in i.items:
              print(j.to_text()) ##输出结果

     

  • 相关阅读:
    漂亮灵活设置的jquery通知提示插件toastr
    C# 对List<T>取交集、连集及差集
    查看sqlserver被锁的表以及如何解锁.
    javascript的setTimeout()用法总结,js的setTimeout()方法
    日志插件 log4net 的使用
    Log4NET简介
    解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接
    也说Autofac在MVC的简单实践:破解在Controller构造函数中的实例化
    Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现
    Asp.net mvc中整合autofac
  • 原文地址:https://www.cnblogs.com/bmjoker/p/10560027.html
Copyright © 2011-2022 走看看