mtu探测

 

 

# -*- coding: UTF-8 -*-
from scapy.layers.inet import IP, ICMP, TCP
from scapy.layers.l2 import Ether
import sys
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)  # 清除报错
from scapy.all import *  # 导入scapy模块


def mtu_one(mtu, dst):
    data = b'a' * (mtu - 28)

    # result = sr1(Ether(dst='48-bd-3d-22-77-e0') / IP(flags='DF', dst=dst) / ICMP() / data,
    #              timeout=0.2, iface='Intel(R) Dual Band Wireless-AC 3168')

    # result = sr1(IP(flags='DF',dst=dst) / ICMP() / data, timeout=0.2,
    #             iface='Intel(R) Dual Band Wireless-AC 3168')  # 发送第三层数据包

    result = sr1(IP(flags='DF', dst=dst) / ICMP() / data, timeout=0.2)  # 发送第三层数据包
    # print(result.show())
    try:

        # 如果返回数据包ICMP层的type==3,code==4则表明数据包已经超过了MTU
        if result.getlayer(ICMP).type == 3 and result.getlayer(ICMP).code == 4:
            return 1

        # 如果返回数据包ICMP层的type==0,code==0则表明数据包可以成功发送,大小没有超过MTU
        elif result.getlayer(ICMP).type == 0 and result.getlayer(ICMP).code == 0:
            return 2
    except:
        return None
# -*- coding: UTF-8 -*-
from scapy.layers.inet import IP, ICMP, TCP
from scapy.layers.l2 import Ether
import sys
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)  # 清除报错
from scapy.all import *  # 导入scapy模块


def mtu_one(mtu, dst):
    data = b'a' * (mtu - 28)

    # result = sr1(Ether(dst='48-bd-3d-22-77-e0') / IP(flags='DF', dst=dst) / ICMP() / data,
    #              timeout=0.2, iface='Intel(R) Dual Band Wireless-AC 3168')

    # result = sr1(IP(flags='DF',dst=dst) / ICMP() / data, timeout=0.2,
    #             iface='Intel(R) Dual Band Wireless-AC 3168')  # 发送第三层数据包

    result = sr1(IP(flags='DF', dst=dst) / ICMP() / data, timeout=0.2)  # 发送第三层数据包
    # print(result.show())
    try:

        # 如果返回数据包ICMP层的type==3,code==4则表明数据包已经超过了MTU
        if result.getlayer(ICMP).type == 3 and result.getlayer(ICMP).code == 4:
            return 1

        # 如果返回数据包ICMP层的type==0,code==0则表明数据包可以成功发送,大小没有超过MTU
        elif result.getlayer(ICMP).type == 0 and result.getlayer(ICMP).code == 0:
            return 2
    except:
        return None


if __name__ == "__main__":
    ipaddr = "8.8.8.8"
    mtu = 1500
    while mtu > 0:
        res = mtu_one(mtu, ipaddr)
        if res == 1 or res is None:
            mtu -= 1
        elif res == 2:
            print('mtu: %d' % mtu)
            break

if __name__ == "__main__":
    ipaddr = "8.8.8.8"
    mtu = 1500
    while mtu > 0:
        res = mtu_one(mtu, ipaddr)
        if res == 1 or res is None:
            mtu -= 1
        elif res == 2:
            print('mtu: %d' % mtu)
            break

 

[root@bogon ~]# python icmp_pro.py 
Begin emission:
...........................................Finished sending 1 packets.
...........................................
Received 86 packets, got 0 answers, remaining 1 packets
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
mtu: 1499

 

posted on 2021-05-25 14:45  tycoon3  阅读(146)  评论(0编辑  收藏  举报

导航