Wie kann ich mit HTTP-Port 80 telneten?

16

Nach der Suche in Google habe ich herausgefunden, dass wir über telneteinen Webserver auf seinen http-Port zugreifen und GETeine HTML-Seite abrufen können.

Zum Beispiel:

$ telnet web-server-name 80

Aber ich verstehe nicht, wie das möglich ist?

Ich dachte, wenn Port 80 für HTTP-Server ist, dann wird Port 80 nur auf httpAnfragen warten. Aber wie komme ich telnetan einen HTTPHafen?

Ist nicht telnetund HTTPzwei verschiedene Protokolle?

sps
quelle
2
Zum Herumalbern im 'net ist der Befehl netcat ( nc(1)) wesentlich flexibler. Es kann eine Verbindung zu SSL / TLS-verschlüsselten Diensten herstellen und auch als Server verwendet werden und sogar Daten weiterleiten.
Vonbrand

Antworten:

25

Herzlichen Glückwunsch, Sie haben sich gerade mit dem Konzept der Netzwerkebenen befasst und festgestellt, dass Ports und Protokolle nicht direkt miteinander verbunden sind. Wie bereits erwähnt, kann mit telnet eine Verbindung zu einem beliebigen TCP-Port hergestellt werden. Um zu verstehen, warum dies möglich ist, müssen Sie sich jedoch mit Netzwerkebenen auskennen. Wenn Sie jemals vom OSI 7-Schichtenmodell gehört haben, können Sie mit Telnet eine Verbindung zu einem anderen Port herstellen. Obwohl sie im Internet sind, beschäftigen sie sich nur mit 4 der Schichten und der sogenannten Internet Protocol Suite. Ohne Netzwerkschichten müsste jedes Programm nicht nur sein eigenes Protokoll verstehen, sondern auch sein eigenes IP-Adressierungsschema und Port-System definieren, was bedeutet, dass jeder Router verstehen muss, wie diese Schemata weitergeleitet werden, und dass verschiedene Protokolle sehr umfangreich sind schwerer zu lernen und zu diagnostizieren. Einfach gesagt, das Internet würde ohne Schichten nicht annähernd so gut funktionieren.

Es geht Ihnen um die Transportschicht und die Anwendungsschicht. Auf der Transportebene gibt es Internetprotokolle wie TCP und UDP mit Portnummern zwischen 1 und 65535. Auf der Anwendungsebene gibt es Protokolle wie HTTP, SMTP und DNS. Normalerweise gibt jedes Internet-Standarddokument, das ein Protokoll definiert, einen Standard-TCP- oder UDP-Port an, den das Protokoll standardmäßig verwenden soll. Zum Beispiel TCP-Port 80 für HTTP, TCP-Port 25 für SMTP, UDP-Port 53 für DNS und TCP-Port 23 für Telnet. Das Telnet-Programm spricht tatsächlich das TELNET-Protokoll, das ein Standardprotokoll ist, aber meistens ein altes für heutige Verhältnisse. Da die Protokollsequenzen aus 8-Bit-Zeichen bestehen, sehen Sie das Protokoll selbst selten und es ist im Vergleich zu anderen moderneren Protokollen wie HTTP und SMTP, die für den Menschen sichtbare Wörter in ASCII verwenden, wie GET, POST, HELO, LOGIN, etc.

Da das Protokoll im Allgemeinen nicht sichtbar ist, ist Telnet ein gutes Tool, um eine Verbindung zu anderen TCP-Ports herzustellen und dem Benutzer die manuelle Eingabe von Protokollen zu ermöglichen. Einige Netzwerkadministratoren verwenden diese Technik, um Probleme mit Servern zu diagnostizieren. Da das Telnet-Programm jedoch immer noch über ein eigenes Protokoll verfügt und manchmal zusätzliche Datenbits sendet, können weiterhin Probleme mit dieser Technik auftreten. Wenn Sie Telnet verwenden, "stellen Sie wirklich eine Verbindung her" sowohl auf der Anwendungsebene als auch auf der Transportebene. Es kommt nur vor, dass andere Protokolle der Anwendungsschicht für die meisten Diagnosen einwandfrei funktionieren und das Telnet-Protokoll nicht beeinträchtigen. Dafür gibt es ein besseres Programm namens nc (Net Cat. Der Name stammt von einer netzwerkbasierten Version des Befehls cat).

$ nc www.stackexchange.com 80

Das nc-Programm spricht kein Anwendungsschichtprotokoll, und wenn Sie eine Verbindung herstellen, stellen Sie eine Verbindung nur auf der Internetschicht (IP-Adresse) und der Transportschicht (TCP oder UDP) her. Dies bedeutet, dass Sie steuern, welches Anwendungsschichtprotokoll verwendet wird. Fast alles ist faires Spiel, sogar binäre Protokolle. Auf diese Weise können Sie auch nützliche Dinge wie das Übertragen von Dateien ausführen, ohne dass diese beschädigt werden, und Ports auf eingehenden Datenverkehr überwachen:

nc -l 9000 < movie.mp4  (Your friend runs this)

nc friends.computer.hostname 9000 > movie.mp4  (you run this)

Und dann wird movie.mp4 über das Netzwerk übertragen, ohne dass ein Protokoll auf Anwendungsebene (z. B. FTP) verwendet wird. Das Anwendungsprotokoll ist tatsächlich Ihr Freund, der Ihnen mitteilt, dass er bereit ist, Ihren Befehl auszuführen.

nc kann auch UDP-Pakete und UNIX-Domain-Sockets verarbeiten. Es kann auch interessant sein, damit zuzuhören.

nc -l 12345

Besuchen Sie jetzt in Ihrem Webbrowser http: // localhost: 12345 / und in Ihrer NC-Sitzung sollten Sie die GET / HTTP/1.1Anforderung des Browsers sehen . An dieser Stelle können Sie etwas eingeben und drücken. Ctrl-DEs sollte in Ihrem Browser im Klartext angezeigt werden. (Wenn HTML angezeigt werden soll, müssen Sie die richtige HTTP-Protokollantwort gefolgt von HTML-Code zurücksenden.)

Manchmal können Programme, die von Haus aus ein Protokoll wie HTTP sprechen, Verbindungen zu anderen Ports herstellen, die für ein anderes Protokoll bestimmt sind. Normalerweise können Sie dies in einem GUI-Browser nicht mehr tun, da sie die Verbindung zu einigen Ports eingeschränkt haben. Wenn Sie jedoch ein Programm wie curl verwenden, um eine Verbindung zu Port 25 (SMTP zum Senden von E-Mails) herzustellen, werden wahrscheinlich einige angezeigt Fehler beim Brechen des Protokolls.

$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.

Dies geschieht, weil curl normalerweise das HTTP-Protokoll spricht. Nachdem ein TCP-Handshake eingerichtet wurde, werden folgende Daten gesendet:

GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl

Was der SMTP-Server jedoch erwartet, ist SMTP.

HELO myhomecomputername.local

An diesem Punkt sendet der Server seine Identifikationszeile zurück:

250 yourispsmtpserverhost.com

Sie sehen also, dass nichts daran hindert, eine Transportschicht-Verbindung mit dem SMTP-Server herzustellen. Das Protokoll kann einfach nicht gesprochen werden. Aber Sie können das Protokoll selbst mit einem Programm wie Telnet oder besser nc sprechen.

DeltaRay
quelle
curlbraucht ein -vArgument, um eine ausführliche Ausgabe in OS X zu zeigen.
Hamid Rohani
6

telnet ist ein Tool, das eine Verbindung zu jedem TCP-Port herstellen kann.

Standardmäßig wird eine Verbindung zum Telnet-Port (23) hergestellt, Sie können jedoch festlegen, dass stattdessen eine Verbindung zum HTTP-Port (80) oder zum SMTP-Port (25) hergestellt werden soll.

Sie müssen jedoch wissen, wie das Protokoll "gesprochen" wird, auf das der Remote-Server an diesem Port wartet.

Wenn Sie beispielsweise die Header einer Website abrufen möchten (Domainnamen usw. wurden geändert, um die Schuldigen zu schützen):

$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Connection closed by foreign host.

Die HEADLinie ist das, was ich in die Verbindung eingegeben habe. Beachten Sie, dass Sie nach dem http-Protokoll eine leere Zeile senden müssen, um das Ende Ihres HEAD- oder GET-Vorgangs oder einer beliebigen Anforderung anzuzeigen. Dies ist die leere Zeile unmittelbar nach der HEAD-Anforderung.

cas
quelle
3

Die anfängliche Aushandlung für beide Protokolle verwendet Textbefehle, sodass Sie eine Verbindung herstellen und mit der Eingabe von Befehlen beginnen können. Dies gilt auch für andere alte Protokolle wie SMTP, und Telnet wird seit langem zur Fehlerbehebung bei Verbindungen zu den jeweiligen Diensten verwendet.

Beispielsweise

Die Protokolle sind unabhängig von dem Port, an dem sie kommunizieren. Fast alle Implementierungen können so konfiguriert werden, dass sie jeden Port überwachen.

Einige Protokolle (z. B. HTTPS) verwenden keine Textbefehle für die Aushandlung. Sie können sich jedoch (normalerweise) mit dem Port verbinden, auf dem der Server lauscht, aber nichts Nützliches tun.

Thomas Dickey
quelle
3

Ein Teil Ihres Verständnisses ist richtig und ein anderer Teil nicht. Port 80 ist im Allgemeinen für HTTP reserviert, aber das ist nur eine Konvention. Jedes Programm kann jeden offenen Port des Systems überwachen. Wenn auf dem System, zu dem Sie eine Verbindung herstellen, ein Webserver Port 80 überwacht, müssen Sie HTTP verwenden, um mit ihm zu kommunizieren.

telnetist überhaupt kein Protokoll, sondern ein Programm, mit dem Sie unformatierten Text an jeden Host an jedem Port senden können. Der Remote-Host hat keine Ahnung, welches Programm eine Verbindung zu ihm herstellt. Alles, was es sehen kann, sind die Pakete, die an es gesendet werden. Jedes Programm, das Pakete sendet, die dem vom Remotehost erwarteten Protokoll entsprechen, funktioniert, sodass Sie telnetüber jedes textbasierte Protokoll kommunizieren können.

Sie haben etwas in der Art von gesendet. Dies GET /path/to/a/file HTTP/1.1ist ein gültiger HTTP 1.1-Befehl und sieht genauso aus wie eine Anfrage, die von einem Webbrowser gesendet wird. Das funktioniert also einwandfrei.

Michael Mrozek
quelle
1
telnet ist ein Protokoll RFC 854 . Es ist nur so, dass normale telnetClients nicht versuchen, das telnetProtokoll zu verwenden , es sei denn, sie stellen eine Verbindung her tcp/21. Aus der Manpage: "Wenn eine Verbindung zu anderen Ports als dem Telnet-Port hergestellt wird, versucht Telnet nicht, Telnet-Protokollverhandlungen durchzuführen. Auf diese Weise können Verbindungen zu Diensten hergestellt werden, die das Telnet-Protokoll nicht unterstützen, ohne dass es zu Problemen kommt. Die Protokollverhandlung kann durch erzwungen werden einen Bindestrich vor die Portnummer setzen. "
user4556274