2008-09-16 3 views

Antwort

3

Ping das Ziel, allmählich die TTL erhöhen und beobachten, wo die "TTL überschritten" Antworten stammen.

+0

Klingt wie es funktioniert, ist aber ein bisschen kompliziert. – UnkwnTech

+2

Das ist tatsächlich, was Traceroute tut. – Ferruccio

+1

Wie erhöhen Sie die TTL, ohne rohe Sockets in C zu verwenden? – brian

1

Anstatt rohe Sockets zu verwenden, verwenden einige Anwendungen einen TCP- oder UDP-Port mit höherer Nummer. Indem Sie diesen TCP-Port an Port 80 auf einem bekannten Webserver anweisen, können Sie eine Traceroute zu diesem Server durchführen. Der Nachteil ist, dass Sie wissen müssen, welche Ports auf einem Zielgerät geöffnet sind, um es zu tappen.

+0

Ich habe versucht, ein einzelnes Tool zu finden, das dies ohne root getan hat. Ich war nicht in der Lage zu. Haben Sie ein Beispiel, das keine root benötigt, wo ich beispielsweise google.com ausfindig machen kann? –

0

Sie müssen keine Raw-Sockets zum Senden und Empfangen von ICMP-Paketen verwenden. Zumindest nicht unter Windows.

+0

Was ist mit Paketen mit einer benutzerdefinierten TTL? – brian

+0

99,99% falsch. Sie benötigen Raw-Sockets, um ICMP-Nachrichten zu fälschen und zu senden. Es gibt jedoch eine Ausnahme für ICMP-Echoanfragenachrichten auf einigen Linux-Systemen, die standardmäßig deaktiviert sind, sodass Sie nicht zu 100% falsch liegen. –

+0

@ jean-loup - Ich habe meinen Kommentar zu einem Netzwerk-Überwachungssystem gemacht, an dem ich vor Jahren gearbeitet habe und das ICMP intern implementiert hat, um Server im Auge zu behalten. Es hat keine rohen Sockets verwendet. Das wäre vor fast zehn Jahren gewesen, also könnten sich die Dinge geändert haben. Bedenken Sie auch, dass nicht alle Versionen von Windows tatsächlich rohe Sockets unterstützen.Ich kann mich nicht erinnern, wann Microsoft sie tatsächlich aktiviert hat, aber sie haben sie aus Sicherheitsgründen in XP SP2 deaktiviert. Ich weiß nicht, was sie seitdem gemacht haben. – Ferruccio

-1

Wenn Sie eine moderne Linux-Distribution haben, können Sie die Quelle für Traceroute (oder TracePath, die vor der Traceroute ging keine setuid kam) und tcptraceroute betrachten. Keiner von denen benötigt RAW-Sockets - überprüft auf Fedora 9, sie sind nicht gesetzt und arbeiten mit Standardoptionen für den normalen Benutzer.

Mit dem Code, den tcptraceroute tut, könnte es besonders sein. nützlich, da ICMP-Pakete zu einer Adresse nicht notwendigerweise am selben Ort enden, wie beispielsweise eine TCP-Verbindung zu Port 80.

eine strace von trace tun (als normaler Benutzer) zeigt es so etwas wie tun:


int opt_on = 1; 
int opt_off = 0; 

fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) 
setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &opt_off, sizeof int) 
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &opt_on, sizeof int) 
setsockopt(fd, SOL_IP, IP_RECVTTL, &opt_on, sizeof int) 

... und dann das Lesen der Daten aus den CMSG Ergebnisse.

+0

Der Quellcode von traceroute.c erwartet, dass der Benutzer root ist, um die TTL des Pakets neu zu schreiben - wenn Sie Ihre Distro betrachten, ist traceroute höchstwahrscheinlich setuid root. – brian

0

ping und Traceroute Verwenden Sie das ICMP-Protokoll. Wie bei UDP und TCP ist dies über die normale Socket-API möglich. Nur UDP- und TCP-Portnummern unter 1024 sind vor der Verwendung geschützt, außer durch root. ICMP ist für alle Benutzer frei verfügbar.

Wenn Sie wirklich sehen möchten, wie Ping und Traceroute funktionieren, können Sie eine Beispiel-C-Code-Implementierung für sie von CodeProject herunterladen.

Kurz gesagt, öffnen sie einfach einen ICMP-Sockel, und traceroute ändert die inkrementiert die TTL mit Setsockopt, bis das Ziel erreicht ist.