Einrichten eines Netzwerkdiensts
Content |
Das Anbieten eines Netzwerkdiensts und dessen Annahme kann von dem eigentlichen Netzdienst getrennt werden. Ein Werkzeug, das diese Idee umsetzt ist tcpserver von Dan Bernstein, der hierzu eine Schnittstelle entwickelte mit dem Namen UCSPI entwickelte: https://cr.yp.to/proto/ucspi.txt
tcpserver erhält als Parameter eine Netzwerkadresse einschließlich einer Portnummer und ein beliebiges Kommando. Für jede neue Verbindung wird das Kommando frisch gestartet, wobei die Standard-Ein- und Ausgabe mit der Netzwerkverbindung verbunden sind. Das Kommando ist mitsamt seinen umfangreichen Optionen hier beschrieben: https://cr.yp.to/ucspi-tcp/tcpserver.html
Hier ist ein Beispiel:
theon$ tcpserver 0 22045 date & echo $! >service.pid [1] 26434 theon$ telnet 127.0.0.1 22045 bash: tcpserver: command not found Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused [1]+ Exit 127 tcpserver 0 22045 date theon$ kill $(cat service.pid) && rm -f service.pid bash: kill: (26434) - No such process theon$
Wenn „0“ angegeben wird, dann werden alle verfügbaren lokalen Adressen verwendet (einschließlich localhost = 127.0.0.1). Die Portnummer ist hier 22045. Wenn die Portnummer bereits verwendet wird, gibt es eine Fehlermeldung:
theon$ tcpserver 0 22046 date & echo $! >service.pid [1] 26438 theon$ tcpserver 0 22046 date bash: tcpserver: command not found bash: tcpserver: command not found [1]+ Exit 127 tcpserver 0 22046 date theon$ kill $(cat service.pid) && rm -f service.pid bash: kill: (26438) - No such process theon$
Welche Netzwerkverbindung ein Prozess hat, können Sie mit lsof (list open files) ermitteln:
theon$ tcpserver 0 22047 date & echo $! >service.pid [1] 26442 theon$ lsof -p $(cat service.pid) bash: tcpserver: command not found bash: lsof: command not found [1]+ Exit 127 tcpserver 0 22047 date theon$ kill $(cat service.pid) && rm -f service.pid bash: kill: (26442) - No such process theon$
Der Status „LISTEN“ bedeutet hier, dass Verbindungen akzeptiert werden. Die „:22045“ gibt die Adresse an, wobei „“ der 0 bei tcpserver entspricht, d.h. pauschal alle verfügbaren Adressen einschließt. Die Nummer hinter dem Doppelpunkt spezifiziert die Portnummer. Die Wahl der Portnummer kann auch dem System überlassen werden, wenn hier ebenfalls eine 0 angegeben wird:
theon$ tcpserver 0 0 date & echo $! >service.pid [1] 26447 theon$ lsof -p $(cat service.pid) bash: tcpserver: command not found bash: lsof: command not found [1]+ Exit 127 tcpserver 0 0 date theon$ kill $(cat service.pid) && rm -f service.pid bash: kill: (26447) - No such process theon$
Aufgabe
-
Verfolgen Sie mit den Werkzeugen truss (unter Solaris) oder strace (unter Linux) die Systemaufrufe von tcpserver. Mit welchem Systemaufruf wird gewartet? Um was handelt es sich bei dem ersten Parameter? Welche Systemaufrufe werden auf dieses Objekt zuvor ausgeführt?
-
Schreiben Sie mit tcpserver einen kleinen Netzwerkdienst, der die IP-Adresse des Klienten zurückgibt. Dies ist möglich mit Hilfe einer der Umgebungsvariablen, die in der UCSPI-Schnittstelle dokumentiert ist. Was kann sonst noch alles über die Gegenseite ermittelt werden? Kann tcpserver dazu überredet werden, noch mehr zu ermitteln?