2016-04-04 19 views
3

Wie kann ich eine manuelle MTU-Erkennung mit Python implementieren?Senden von Raw-IP-Verkehr mit Python: Erkennen von MTU

Von: https://networkengineering.stackexchange.com/a/28988/23983

senden einen Ping zu einem Ziel, in meinem Beispiel, werde ich die Google-DNS-Server (8.8.8.8) verwenden. Setzen Sie Ihr DF-Bit in Ihrem Ping auf on, um zu verhindern, dass Ihr Ping fragmentiert wird. Stellen Sie Ihre Paketgröße auf eine große Anzahl oder die Standard-MTU von 1500 ein. Beachten Sie, dass bei einigen Ping-Implementierungen nur die Größe der Nutzlast festgelegt wird. Dies bedeutet, dass Sie den 8-Byte-ICMP-Header und den 20-Byte-IP-Header berücksichtigen müssen.

Antwort

1

Ich mag würde hinzufügen, dass Sie dies könnte mit rohen Sockeln auch.
scapy ist eine nette Abstraktionsschicht, die viel von der Magie für Sie tut, aber bei aller Fairness, wenn Sie tief gehen, könnten Sie den ganzen Weg für die Lernerfahrung gehen. (Beachten Sie, dass Raw Sockets erhöhten Berechtigungen in den meisten modernen OS'es benötigen und wie Sie tiefer Implementierungen gehen von Windows und Linux kann variieren.)

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

Dies wird Ihnen ein rohes Paket-basierten Buchse, die buchstäblich liefert alle Rahmen für dich. Es variiert ein wenig zwischen Windows und Linux, aber ich bleibe bei Linux in dieser Antwort. Beachten Sie auch, dass alle ausgehenden Pakete möglicherweise nicht von diesem Socket abgeholt werden. Wenn Sie diese Funktionalität benötigen (Sniffing-Kram), ziehen Sie in Betracht, nach ähnlichen Treffern zu suchen.

Alles, was Sie jetzt tun müssen, ist jedes Paket wie die Segmente behandeln sie kommen oder gehen in, zum Beispiel - eine Ethernet- und IP-Frame Auspacken würde wie folgt aussehen:

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) 

Auslastbarkeit wäre „easy "In Anbetracht der Tatsache, dass Sie die Pakete selbst erstellen.
Alles, sei es die konventionellste Methode oder der anfänglich schnellste Weg, aber Sie könnten implementieren, was immer Sie wollten.

sendet genauso einfach, struct verwenden und einen Blick auf die vielen ICMP Beispiele haben da draußen, auch mit Prüfsumme Berechnungen:

In Bezug auf MTU, Das ist Logik, die Sie selbst implementieren müssten, da es keine vorgefertigte Bibliothek gibt, die das tut, was mir bewusst ist.

Aber das ist mein Beitrag zum Senden rohen IP-Verkehr mit Python.

1

Senden Sie alles, was roh in Python, Sie verwenden bei der Verwendung von scapy.

Für Informationen darüber, wie Ping-Nachrichten senden:

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

den DF-Flag zu setzen:

IP(flags='DF') 

Wie Sie die bestimmte Größe anpassen, so dass Sie die Fragmentierung simulieren:

Adding payload in packet (scapy)

Dass sie alle zusammen:

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

Wenn Sie sind nicht wirklich daran interessiert diese Dinge roh zu schaffen, ist diese Frage ein dup von: How to find mtu value of network through code(in python)?