Internetprotokolle

Dieser Text befindet sich in der neusten Version auf http://www.eggdrop.ch/texts/inet/index.htm.

05.02.04: Version 1.2
17.12.03: Version 1.1
27.07.03: Version 1.0

Inhalt

1 Telnet
1.1 Was ist Telnet?
1.2 Wie kann ich selber eine Telnetverbindung aufbauen?
1.3 Was sind die Nachteile von Telnet?
2 Einige einfache Protokolle, die auf Telnet basieren
2.1 Chargen
2.2 Daytime
2.3 Discard
2.4 Echo
3 SSH
3.1 Was ist SSH?
3.2 Wie baue ich mit SSH eine Verbindung auf?
3.3 Wie funktioniert SSH?
4 HTTP
4.1 Was ist HTTP?
4.2 Wie sieht ein HTTP-Request aus?
4.3 Erweiterter HTTP-Request
5 FTP
5.1 Was ist FTP?
5.2 Eine passive FTP-Session
5.3 Eine aktive FTP-Session
5.4 Dateien austauschen
5.5 Weitere FTP-Befehle

1 Telnet

1.1 Was ist Telnet?

Telnet ist eine auf TCP basierende textorientierte Software, mit der man zwei entfernt liegende Rechner miteinander verbinden kann. Telnet wurde früher dazu verwendet, mehrere Terminals an einem Zentralrechner anzuschliessen. Dadurch konnten sich über ein Netzwerkkabel mehrere Anwender gleichzeitig über mehrere Terminals zugang zum Zentralrechner verschaffen. Dabei machte es keinen Unterschied, ob man direkt vor dem Zentralrechner sass, oder sich an einem sehr weit entfernten Terminal befand. Über so eine Telnetverbindung können Befehle ausgefürt werden und Prozesse gestartet werden, sodass sich so ein System aus der Ferne administrieren lässt. Ebenso können Programme mit einer Telnet-Verbindung Daten untereinander austauschen, wodurch man z.B. einen Chat machen kann, aber auch eine HTTP-Verbindung ist im Grunde genommen nichts anderes, als eine Telnet-Verbindung, die eine Anfrage zum Webserver sendet, der dann über Telnet die Internetseite verschickt. Um zwischen den verschiedenen Diensten zu unterscheiden, verwendet man sogenannte Ports. Die Ports gehen von 1-65535. HTTP benutzt z.B. den Port 80, eine normale Telnetverbindung den Port 23.

1.2 Wie kann ich selber eine Telnetverbindung aufbauen?

Dazu benötigt man einen Telnet-Client. Der ist aber meistens schon im Betriebssystem installiert. Unter Unix startet man ihn mit telnet <host> [port] und unter Windows mit Start -> Ausführen -> telnet <host> [port]. Wenn kein Port angegeben wird, wird 23 verwendet. Man kann eine Telnetverbindung entweder mit CTRL+C oder mit CTRL+] (Escape character is '^]'.), dann quit eingeben, abbrechen.

1.3 Was sind die Nachteile von Telnet?

Die Übertragung der Daten läuft bei Telnet unverschlüsselt. Bei einer Internetseite kann das noch nicht so fatale Folgen haben, aber wenn man ein System administriert, können Leute unter Umständen Daten und Passwörter ausspionieren, wodurch man sich meistens root-Zugriff auf dem Rechner verschaffen kann. Deshalb verwendet man heute für sichere Übertragungen das Protokoll SSH.

2 Einige einfache Protokolle, die auf Telnet basieren

2.1 Chargen

Chargen läft über den TCP bzw. UDP Port 19. Es ist ein auf Telnet basierendes Protokoll, das zu Testzwecken Ascii-Zeichen sendet. Mehr macht es eigentlich nicht. Auf manchen Unix-Systemen ist es standardweise eingerichtet. Ich würde es aber in der /etc/inetd.conf auskommentieren und den Inetd dann neu starten (bei Debian mit /etc/init.d/inetd restart), denn wenn jemand eine Telnetverbindung zu Chargen aufbaut kann es Lag geben.

Beispiel einer Chargen-Verbindung:

debian:~# telnet localhost 19
Trying 127.0.0.1...
Connected to debian.
Escape character is '^]'
.!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs
-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst
debian:~#

2.2 Daytime

Daytime läuft über den TCP bzw. UDP Port 13. Es ist ein auf Telnet basierendes Protokoll, das die Systemzeit sendet. Alle weiteren eingehenden Daten werden vom Server nicht verarbeitet und die Verbindung wird nach dem Senden der Zeit getrennt. Auf manchen Unix-Systemen ist es standardweise eingerichtet. Wer es nicht braucht, dem würde ich empfehlen es in der /etc/inetd.conf auskommentieren und den Inetd dann neu starten, da man keine unnötigen Dienste anbieten sollte.

Beispiel einer Daytime-Verbindung:

debian:~# telnet localhost 13
Trying 127.0.0.1...
Connected to debian.
Escape character is '^]'.
Wed Oct  9 09:35:52 2002
Connection closed by foreign host.
debian:~#

2.3 Discard

Discard läuft über den TCP bzw. UDP Port 9. Es ist ein auf Telnet basierendes Protokoll, das gar nichts sendet. Es verwirft alle eingehenden Daten, sendet keine Empfangsbestätigung und eignet sich nur zum testen einer Verbindung, ohne eine grosse Netzlast zu erzeugen. Auf manchen Unix-Systemen ist es standardweise eingerichtet. Wer es nicht braucht, dem würde ich empfehlen, es in der /etc/inetd.conf auskommentieren und den Inetd dann neu starten, da man keine unnötigen Dienste anbieten sollte.

Beispiel einer Discard-Verbindung:

debian:~# telnet localhost 9
Trying 127.0.0.1...
Connected to debian.
Escape character is '^]'.
Hallo
blah
asdfsdf
debian:~#

2.4 Echo

Echo läuft über den TCP bzw. UDP Port 7. Es ist ein auf Telnet basierendes Protokoll, das alles was man sendet zurücksendet. Dies erfolgt solange, bis der anrufende Rechner die Verbindung unterbricht. Auf manchen Unix-Systemen ist Echo standardweise eingerichtet. Wer es nicht braucht, dem würde ich empfehlen, es in der /etc/inetd.conf auskommentieren und den Inetd dann über /etc/init.d/inetd restart neu starten, da man keine unnötigen Dienste anbieten sollte.

Beispiel einer Echo-Verbindung:

debian:~# telnet localhost 7
Trying 127.0.0.1...
Connected to debian.
Escape character is '^]'.
Hallo
Hallo
Wie gehts?
Wie gehts?
Gut und dir?
Gut und dir?
Mir auch.
Mir auch.
debian:~#

3 SSH

3.1 Was ist SSH?

SSH ersetzt das Protokoll Telnet, welches sämtliche Verbindungsdaten (insbesondere Passwörter und vertrauliche Daten) im Klartext über das Netzwerk transportiert. Das heisst, man könnte die Daten über einen Sniffer abhören und missbrauchen. SSH dagegen bietet eine sichere, verschlüsselte Verbindung an. Es läuft standardmässig über den Port 22.

3.2 Wie baue ich mit SSH eine Verbindung auf?

Unter Linux sollte standardmässig ein SSH-Client installiert sein. Dann kann man mit ssh [-l <login>] <host> <port> eine Verbindung aufbauen. Unter Windows geht das mit dem Programm PuTTY.

3.3 Wie funktioniert SSH?

Der SSH Server hat zwei Schlüsselpaare: Den Hostkey und den Serverkey. Diese Paare bestehen aus einem Privatekey und einem Publickey. Man kann die Daten nur mit dem Publickey verschlüsseln und nur mit dem Privatekey wieder entschlüsseln.

Nachdem der SSH-Client eine Verbindung zum SSH-Server aufgebaut hat, schickt der Server seine beiden Publickeys, also den öffentlichen Hostkey und den öffentlichen Serverkey. Wenn es der erste Verbindungsaufbau mit diesem Server ist, trägt der Client die Schlüssel in eine Liste ein. Bei den nächsten Verbindungen überprüft der Client die Keys mit denen in der Liste. Wenn sie übereinstimmen schickt der Client eine von ihm erzeugte Zufallszahl zum Server, die mit den beiden Schlüsseln verschlüsselt worden ist. Mit dieser Zahl (sogenannter Sessionkey) wird der Rest der Verbindung verschlüsselt. Dazu muss der Server die Zahl mit den Privatekeys entschlüsseln (spätestens hier könnte ein Hacker nicht mehr weitermachen, da er die Zahl nur mit den Private entschlüsseln kann). Jetzt kann der Client den Benutzernamen und Passwort mit der Zufallszahl verschlüsselt angeben.

4 HTTP

4.1 Was ist HTTP?

HTTP steht für Hypertext Transfer Protocol. Mit diesem Protokoll ist wahrscheinlich jeder Internet-Benutzer schon in Kontakt gekommen. Wenn eine Webseite aufgerufen wird, wird eine Verbindung zum HTTP-Server hergestellt, welcher dem Benutzer die Seite sendet. Ein HTTP-Client wird auch Browser genannt. Der Server teilt dem Client neben dem Senden der Seite mit, ob es eine Internetseite, ein Bild, ein Film oder sonst irgend etwas ist. Wissen, wie HTTP geht kann für Testzwecke (z.B. um zu testen was der HTTP-Server jetzt dem Client genau sendet, oder ob die Verbindung verschlüsselt wird oder nicht) wichtig sein. HTTP benutzt den Port 80.

4.2 Wie sieht ein HTTP-Request aus?

Ein Einfacher HTTP 1.1 Request sieht z.B. folgendermassen aus:

GET / HTTP/1.1
Host: www.eggdrop.ch

Dieser Text wird nach einem Aufbau einer Verbindung zu einem HTTP-Server gesendet. Der Server schickt daraufhin das entsprechende Dokument zum Client. / ist hierbei das Hauptdokument. Der angegebene Host dient zur Unterscheidung von verschiedenen Webseiten. So kann ein Webhoster mehrere Webseiten unter einer IP-Adresse betreiben (auch "VirtualHosts" genannt). Nach dem Request muss unbedingt noch eine leere Zeile folgen, damit der Webserver weiss, dass jetzt der komplette Request übertragen wurde. Um eine andere Datei anzufordern, wird die entsprechende Datei angegeben. Beispielsweise wird hier die Seite http://localhost/test abgefragt:

[tom@server www]$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test.htm HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Date: Thu, 11 Dec 2003 12:07:09 GMT
Server: Apache
X-Powered-By: PHP/4.2.3
Transfer-Encoding: chunked
Content-Type: text/html

9e 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>test</title>
</head>
<body>
<h1>test</h1>
<p>Ein TEST</p>
</body>
</html>

0

Connection closed by foreign host.
[tom@server www]$ 

Hier sehen wir, dass zuerst ein Server-Header gesendet wird. HTTP/1.1 200 OK zeigt an, dass das Dokument korrekt übertragen wurde (Code 200). Content-Type gibt den Typ des Inhalts an. Hier ist es also eine HTML Seite. Ohne das könnte der Browser nicht unterscheiden, ob er es mit einer Grafik, oder mit einem Sound etc. zu tun hat.

4.3 Erweiterter HTTP-Request

Der oben beschriebene Request war der einfachste mögliche HTTP 1.1 Request. Die meisten Browser verschicken aber noch zusätzliche Informationen, beispielsweise welche Sprache(n) der Benutzer versteht. So kann ein Webserver bei mehrsprachigen Dokumenten das Passendste dem Client schicken. Ausserdem wird mitgeteilt, welche Kodierungen der Client versteht. Die meist verbreitete Kodierung ist gzip. Bei gzip werden die Daten komprimiert an den Client gesendet, sodass Bandbreite gespart wird. Die Daten werden automatisch vom Browser entpackt, der Benutzer braucht also kein anderes Entpackungsprogramm zu installieren. Hier ein Beispielrequest vom Browser Mozilla (http://www.mozilla.org/), abgehört mit einem Netzwerksniffer.

GET /test HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/
plain;q=0.8,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: de,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Hier sieht man genau, was der Browser alles sendet. Mit der Zeile User-Agent kann der Webserver erkennen, welcher Browser die Seite haben will. So wäre es möglich für ältere Browser oder Textbrowser entsprechende Versionen der Seite zu schicken. In der Accept-Zeile, sehen wir, was der Browser für Dateiformate am Liebsten hat. Bei Accept-Language ist - wie sicher schon vermutet -, die Sprache. de ist die Lieblingssprache, danach folgt Englisch. Hat der Server also sowohl eine Englische, als auch eine Deutsche Version, schickt der die Deutsche. Accept-Encoding gibt die Kodierungen an, die der Browser versteht. Keep-Alive sagt ausserdem, dass der Server die Verbindung zum Client nicht unterbrechen soll, damit der Client weitere Seiten anfordern kann, ohne erneut eine Verbindung mit dem Webserver aufbauen zu müssen.

Ist eine Seite nicht auf dem Server nicht vorhanden, reagiert dieser mit Statuscodes. Die bekanntesten sind:

Code Name Beschreibung
200 OK Die angeforderten Daten werden gesendet
301 Moved Permanently Die angeforderte Datei befindet sich jetzt an einer neuen Stelle
307 Moved Temporarily Die angeforderte Datei befindet sich vorübergehend an einer neuen Stelle
401 Unauthorized Du hast keine Rechte, um diese Datei anzufordern (z.B. bei falscher Passworteingabe)
403 Forbidden Du hast keine Rechte, um diese Datei anzufordern (z.B. bei falsch gesetzten Zugriffsrechten auf dem Server)
404 Not Found Die angeforderte Datei wurde nicht gefunden.
500 Internal Server Error Die Datei kann wegen eines Server-Fehlers nicht übertragen werden.

Die genauen Spezifikationen zu HTTP 1.1 finden sich im RFC 2616

5 FTP

5.1 Was ist FTP?

FTP steht für File Transfer Protocol und ist, wie der Name schon sagt, ein Protokoll zum übertragen von Dateien. FTP sollte heutzutage allerdings nicht mehr verwendet werden, weilsämtliche Daten (inkl. Passwörter) im Klartext übertragen werden. Trotzdem wird FTP immer noch bei bekannten Webspace-Provider verwendet. Eine bessere Alternative zu FTP ist SFTP, welches über eine SSH-Verbindung abläuft und deshalb auch denselben Port wie SSH benutzt (22). FTP benutzt verschiedene Ports, was wir noch sehen werden, die erste Verbindung wird standardmässig zu Port 21 hergestellt.

5.2 Eine passive FTP-Session

Eine FTP-Verbindung wird begonnen, indem man eine Verbindung zum Port 21 herstellt. Hier eine Beispielverbindung (das Fette stellt wie immer das Gesendete dar):

[tom@ws tom]$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 FTP
USER anonymous
331 Anonymous access allowed, send your complete e-mail address as password.
PASS mein@mail.ch
230 Anonymous user logged in.

anonymous ist übrigens ein spezieller Benutzer, welcher ohne Passwort (bzw. mit E-Mail-Adresse als Passwort) auf den FTP zugreifen kann. Dieser kann jedoch meistens keine Dateien raufladen, sondern hat nur eingeschränkten Zugriff.

Nun wechseln wir in den passiven Modus und lassen uns den Inhalt des Verzeichnisses ansehen:

PASV
227 Entering Passive Mode (127,0,0,1,67,154).
LIST

Wo bleibt denn nun der Inhalt? Wir müssen nun uns nochmal zum FTP-Server verbinden! Dazu sehen wir uns nochmal die Zeile an, die der Server zurückgeschickt hat und zwar die Ziffern in Klammern: 127,0,0,1,67,154.

Die ersten vier Zahlen stellen die IP-Adresse dar (hier 127.0.0.1). Die zwei nächsten Zahlen die Portnummer, welche wir folgendermassen bekommen: 67*256 + 154 = 17306

Also verbinden wir uns jetzt dorthin:

[tom@ws tom]$ telnet localhost 17306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
-rw-r--r--   1 1000     10            30 Feb  3  2004 README
drwxr-xr-x   2 1000     10           512 Feb  3  2004 pub
Connection closed by foreign host.
[tom@ws tom]$ 

In unserer ersten FTP-Verbindung werden wir über die Übertragung informiert:

150 Opening ASCII mode data connection.
226 Transfer complete.

Mit QUIT loggen wir uns wieder aus:

QUIT
221 Goodbye.
Connection closed by foreign host.
[tom@ws tom]$ 

5.3 Eine aktive FTP-Session

Eine aktive FTP-Session unterscheidet sich dadurch von einer passiven, dass hierbei nicht der Client zum Server eine Verbindung aufbauen muss, sondern der Client auf einem Port lauscht und von dort aus die Daten vom Server empfangen kann. Und so wird eine aktive FTP-Verbindung aufgebaut:

[tom@ws tom]$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 FTP
USER anonymous
331 Anonymous access allowed, send your complete e-mail address as password.
PASS mein@mail.ch
230 Anonymous user logged in.
PORT 127,0,0,1,54,24
200 PORT command successful.

Nun müssen wir nur noch auf dem Port 54*256 + 24 = 13848 lauschen, was z.B. mit dem Aufruf netcat -lp 13848 geschehen kann. Anschliessend liefert uns ein LIST den Verzeichnisinhalt.

5.4 Dateien austauschen

Um eine Datei herunterzuladen tippen wir RETR datei ein:

RETR README
[tom@ws tom]$ telnet localhost 17306
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Willkommen auf dem FTP-Server
Connection closed by foreign host.
[tom@ws tom]$ 
150 Open data connection.
226 File transfer complete.

Verzeichnisse wechseln können wir mit CWD:

CWD pub
250 CWD command successful.

Möchten wir eine Datei heraufladen, benutzen wir den Befehl STOR gefolgt von dem Dateinamen. Wir müssen hierbei eine Verbindung zum Server aufbauen (oder bei einer Aktiven Session umgekehrt) und den Inhalt der Datei senden. Anschliessend trennen wir die Verbindung zum Server wieder.

5.5 Weitere FTP-Befehle

Der Befehl SYST zeigt das System an, auf welchem der FTP-Server läuft:

SYST
215 UNIX

Die vollständigen FTP-Spezifikationen finden sich im RFC 959.


Zurück zur Hauptseite
 
Letzte Änderung: 05.02.04
Copyright (C) 2003, 2004 by Thomas "tom" S. <tom at eggdrop.ch>
Valid HTML 4.0!

Dieser Text gehört zu www.eggdrop.ch und ist urheberrechtlich geschützt. Das Weitergeben und Kopieren dieses Textes ist erwünscht unter folgenden Bedingungen: 1. Der Text muss so sein wie er ist und darf in keiner Weise verändert oder in die eigene Homepage integriert werden. 2. Es muss ein deutlicher Hinweis auf die Herkunft (www.eggdrop.ch) vorhanden sein. 3. Der Text sollte wenigstens alle 3 Monate auf Updates überprüft werden (siehe die Versionsnummer ganz am Anfang des Textes!)