2016-04-04 4 views
3

Pythonで手動MTU検出を実装するにはどうすればよいですか?Pythonでraw IPトラフィックを送信する:MTUを検出する

から:

https://networkengineering.stackexchange.com/a/28988/23983がターゲットにPINGを送信し、私の例では、私はGoogleのDNSサーバー(8.8.8.8)を使用します。あなたのpingが断片化されないように、あなたのpingのDFビットをオンに設定してください。パケットサイズをいくつかの大きな値に設定するか、標準のMTUを1500に設定します。いくつかのping実装ではペイロードだけのサイズが設定されます。つまり、8バイトのICMPヘッダーと20バイトのIPヘッダーを考慮する必要があります。

答えて

1

生のソケットも同様です。
scapyは、あなたのために多くの魔法を行う素敵な抽象レイヤーですが、あなたが低くなると公平に学習経験を得ることができます。 (rawソケットは、最も近代的なOS'esで上昇権限を必要とすることに注意してください、とあなたがより深く実装を行くようにWindowsとLinuxは異なる場合があります。)

import socket 
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) 

これはあなたに文字通り実現し、生のパケットベースのソケットを提供しますあなたのためのすべてのフレーム。これはWindowsとLinuxの間で少し変わりますが、私はこの答えでLinuxに固執します。また、もしあなたがその機能(スニッフィングのもの)を必要とするならば、すべての発信パケットがこのソケットによって受け取られないかもしれないことに注意してください。promiscuous mode関連ヒットの検索を検討してください。

あなたが今やらなければならないことは、彼らが来るセグメントとして、各パケットを扱うかで行くあり、例えば - イーサネットとIPフレームを開梱すると、次のようになります。

frame, meta = s.recvfrom(65565) 
print(frame, meta) 

ethernet = frame[0:14] 
ethernet_segments = struct.unpack("!6s6s2s", ethernet) 

mac_source, mac_dest = (binascii.hexlify(mac) for mac in ethernet_segments[:2]) 

ip = frame[14:34] 
ip_segments = struct.unpack("!12s4s4s", ip) 

ip_source, ip_dest = (socket.inet_ntoa(section) for section in ip_segments[1:3]) 

print('MAC Source:', b':'.join(mac_source[i:i+2] for i in range(0, len(mac_source), 2))) 
print('MAC Dest:', b':'.join(mac_dest[i:i+2] for i in range(0, len(mac_dest), 2))) 
print('IP Source:', ip_source) 
print('IP Dest:', ip_dest) 

Payloadingは「簡単だろう"、自分でパケットを構築していると考えます。
すべての方法や方法が最も一般的ではありませんが、必要なものを実装することができます。

チェックサム計算のものを含め、同じように簡単に、そこに多くのICMPの例でstructを使用して顔をしているされて送信:

、これは私が知っているこれを行う事前に構築されたライブラリがないので、自分で実装する必要があるロジックです。

しかしこれは、で生のIPトラフィックを送信するのに貢献しました。

1

pythonでrawを送信すると、scapyを使用しています。 pingメッセージを送信する方法についての情報は

http://www.secdev.org/projects/scapy/doc/usage.html#icmp-ping

DFフラグを設定するには:あなたは、断片化をシミュレートすることができるように特定のサイズを調整する方法については

IP(flags='DF') 

を:

Adding payload in packet (scapy)

はすべて一緒にそれを置く:

data = "x" * 1473 
ans,unans = sr(IP(dst="<target_ip>", flags='DF')/ICMP()/Raw(load=data)) 

をあなたが実際に生のこれらの事の作成にその興味を持っていない場合は、この質問はのDUPである:私はこれにあなたができると追加したいHow to find mtu value of network through code(in python)?

関連する問題