"tcpserver"Dieses Dokument befasst sich mit dem Einsatz von "tcpserver", ein von Dan J. Bernstein entwickelter TCP-Daemon der "inetd" ersetzt. Dieses Dokument ist urheberrechtlich geschützt. Copyright (c) 2002 - 2012 Dirk Prösdorf Die Webseiten von Dan J. Bernstein. Warum "tcpserver" verwenden und nicht "inetd"?Für den Einsatz von "tcpserver" anstelle von von "inetd" gibt es verschiedene Gründe:
"tcpserver" installieren"tcpserver" ist Bestandteil einer Toolsammlung "UNIX Client-Server Program Interface (UCSPI)". Bei der Installation wird die gesamte Toolsammlung installiert. Einzelne dieser Tools werden für die Konfiguration von "tcpserver" benötigt. Als erstes muss die Software herunter geladen und entpackt werden: Danach muss die Software kompiliert werden: Nun muss mit Root-Rechten die Software installiert werden: Die Tools liegen nun unter /usr/local/bin/ und der Installationsprozess ist abgeschlossen. "tcpserver" konfigurierenAufruf von "tcpserver"An einigen Beispielen wird nun die Konfiguration von "tcpserver" erklärt. Der Aufruf von "tcpserver" lautet: Bei host handelt es sich um die um die IP-Adresse, auf der "tcpserver" Verbindungen annehmen soll. Alternativ kann auch der Rechnernamen angegeben werden, dann wird die erste IP-Adresse dieses Servers verwendet, oder 0, dann werden Verbindungen auf allen IP-Adressen des Servers angenommen. Beispiele zur Nutzung von "tcpserver"Für die von "tcpserver" benötigten Zugriffsregeln sollte eine eigenes Verzeichnis angelegt werden, welches Root gehört und 0755 Zugriffsrechte hat: Nun zum ersten Beispiel, ein Telnet-Zugang: #!/bin/sh Dies ist die einfachste Form des Aufrufs von "tcpserver". Es wird hierbei der Dienst "telnet" (aufgerufen als /usr/sbin/in.telnetd, da in Skripten immer absolute Pfadangaben verwendet werden) an den Port "telnet" (also Port 23 in /etc/services) und allen IP-Adressen gebunden. Dies bedeutet aber auch, dass nun von überall aus, von wo aus der Rechner erreicht werden kann, dieser Dienst genutzt werden kann. Im nächsten Beispiel soll dieser Telnet-Zugang auf einem Router nur an die interne Netzwerkkarte gebunden werden. Wir nehmen dafür an, dass 10.0.0.1 die Adresse der internen Netzwerkkarte ist. Es ist unter Sicherheitsgesichtspunkten nicht sinnvoll, einen Telnet-Dienst in einem Netzwerk zur Verfügung zu stellen, da alle Daten unverschlüsselt übertragen werden. Hier ist OpenSSH wesentlich besser geeignet (eigentlich sollte man dann gleich ganz auf Telnet verzichten, aber wir nehmen jetzt mal an, dass dies aus irgend welchen Gründen nicht möglich ist). #!/bin/sh Nun werden nur noch Verbindungsanfragen auf der Netzwerkkarte, an die die IP-Adresse 10.0.0.1 gebunden ist, angenommen. Dort ist aber der "Telnet-Dienst" von allen Rechnern, die diese IP-Adresse erreichen können, aus nutzbar. In einem nächsten Schritt soll nun der Zugriff auf den "Telnet-Dienst" für alle gesperrt und nur für einzelne Rechner anhand der IP-Adresse frei gegeben werden. Außerdem sollen nicht mehr als 3 Verbindungen zur gleichen Zeit angenommen werden. #!/bin/sh Nun kommen die Aufrufoptionen von "tcpserver" ins Spiel. Der Aufruf von "tcprules" lautet: :deny In der Ersten Zeile wird jeglicher Zugriff verhindert. In der zweiten Zeile wird Zugriff für die IP-Adressen 10.0.0.1-10.0.0.20 gewährt und in der dritten Zeile wird Zugriff für die IP-Adressen 10.0.1.0-10.0.1.255 gewährt. # tcprules telnet.cdb telnet.tmp < telnet.vorlage Im nächsten Beispiel soll für den "Unix to Unix copy (UUCP) Dienst" Verbindungen angenommen werden. Im Gegensatz zu "Telnet" benötigt dieser Dienst keine Root-Rechte sondern kann mit seinen eigenen User- und Gruppen-IDs gestartet werden. Außerdem sollen alle Meldungen in eine Log-Datei geschrieben werden. Standardmäßig schreibt "tcpserver" seine entsprechenden Meldungen auf auf den Fehlerkanal (STDERR). #!/bin/sh Hier sind nun die folgenden Aufrufoptionen interessant: Somit ruft hier, bei bis zu maximal 10 gleichzeitigen Verbindungsanfragen auf allen IP-Adressen, "tcpserver" den "UUCP file transfer daemon" mit der User- und Gruppen-Id von UUCP auf und schreibt alle Meldungen in sein Logfile. Die obigen Skripte sind zwar in Lage, den jeweiligen Dienst zu starten, aber um diese Dienste auch bei einem Systemstart oder einen Wechsel des Runlevels zur Verfügung zu haben, muss daraus ein Start/Stopp-Skript gemacht werden. Eine Vorlage hierfür ist bei den meisten Distributionen unter /etc/rc.d/init.d/skeleton zu finden. Diese verwenden aber zum Beenden des jeweiligen Dienstes meistens den Befehl killproc. Dieser würde nun aber nicht nur den jeweiligen Dienst beenden, sondern alle mittels "tcpserver" gestarteten Dienste, da killproc über den absoluten Pfadnamen geht und der ist bei allen Diensten /usr/local/bin/tcpserver. #!/bin/sh Hier wird "tcpserver" als Hintergrundprozess gestartet, so dass das Skript weiter ablaufen kann. Dann wird mittels des Befehls echo $! die PID dieses Hintergrundprozesses in die Datei /var/run/telnet.pid geschrieben. Diese PID wird nun beim Beenden aus dieser Datei ausgelesen und kill beendet so den entsprechenden Dienst. Eine weitere Alternative wären die "daemontools"-Seite von Dan J. Bernstein. |