inetd
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Ein inetd, auch Internet-Superserver genannt, verwaltet die Netzwerkverbindungen bestimmter Dienste. Je nach Konfiguration öffnet der Inetd verschiedene Ports und wartet auf Verbindungsanfragen. Erst wenn eine Anfrage eintrifft, wird der betreffende Serverprozess gestartet und seine Ein- und Ausgabe mit dem Datenstrom verknüpft.
Das hat mehrere Vorteile:
Es läuft nur ein Server ständig im Hintergrund, anstatt mehrere verschiedene nur selten benutzte.
Es ist geradezu trivial, einen eigenen Serverdienst zu programmieren. Man braucht sich nicht um Sockets, etc. zu kümmern, sondern benutzt einfach die Standardein- und -ausgabe.
Man kann das tcpd-Paket benutzen, um auf einfache Art mächtige Zugriffskontrollen zu implementieren.
Leider gibt es auch ein paar Nachteile:
Bei jeder neuen Verbindung den Serverdienst neu zu starten kostet Ressourcen.
Man kann nicht jeden beliebigen regulären Serverdienst über den Inetd betreiben, da diese in der Regel eigene Netzwerk-Sockets öffnen (was fehlschlägt, wenn der Port schon vom Inetd belegt ist).
Daraus ergeben sich folgende Konsequenzen:
Der Inetd eignet sich besonders für kleinere, eher selten benutzte Dienste, z.B. Konfigurations-Weboberflächen. Für stark ausgelastete Web- oder Mailserver ist er denkbar ungeeignet.
Serverdienste sind meistens entweder für den alleinstehenden Betrieb oder für den Betrieb mit Inetd ausgelegt und müssen dann dementsprechend verwendet werden. Einige Server, bei denen das sinnvoll ist, wie z.B. diverse FTP-Server, lassen sich durch eine Konfigurationsoption auf beide Arten einsetzen (aber nicht gleichzeitig).
Dieser Artikel gilt für beide inetd Varianten inetutils-inetd und openbsd-inetd.
Eine Alternative mit mehr Optionen und damit auch höherer Komplexität ist xinetd.
Installation¶
Der Original-Inetd stammte aus einer alten BSD-Version. Inzwischen gibt es aber zahlreiche Neuimplementierungen von anderen Leuten oder Projekten, von denen mehrere in den Ubuntu-Paketquellen vorhanden sind. Es kann also nur eines der folgenden Pakete installiert zu werden [1]:
openbsd-inetd (universe)
inetutils-inetd (universe)
Inkompatible Varianten (völlig andere Konfiguration):
Folgende Pakete werde als Abhängigkeit mitinstalliert
tcpd (Zugriffsbeschränkungen über TCP-Wrappers s.u. )
update-inetd (Konfiguration des inetd (/etc/inetd.conf) durch andere Konfigurationsskripte anderer Pakete)
Befehl zum Installieren der Pakete:
sudo apt-get install tcpd update-inetd
Oder mit apturl installieren, Link: apt://tcpd,update-inetd
Die meisten Inetds unterscheiden sich nur unter der Haube und benutzen dieselbe Konfigurationsdatei /etc/inetd.conf. Logs werden nach /var/log/syslog geschrieben.
Etwas anders verhält es sich mit dem Abkömmling xinetd, der tatsächlich einige mächtigere Fähigkeiten besitzt als die traditionellen Vertreter dieses Genres. Diese Vorteile werden jedoch mit einer abweichenden Syntax der Konfiguration erkauft, die mehr Optionen bietet und dafür etwas komplexer ist. Die folgenden Informationen beziehen sich jetzt erstmal auf herkömmliche Inetds. Des Weiteren sei auf den Artikel xinetd verwiesen.
Konfiguration¶
Die Konfiguration des Inetd geschieht über die Datei /etc/inetd.conf. Jede Zeile in dieser Datei beschreibt einen Service. Leerzeilen und solche, die mit einem # beginnen, werden ignoriert. Nach jeder Änderung an dieser Datei muss der Inetd neugestartet werden [4], z.B. so [2]:
sudo service inetutils-inetd restart #bei inetutils-inetd sudo service inetd restart # bei openbsd-inetd
Viele Dienste, die den Inetd benötigen, tragen bei der Installation selber eine passende Zeile in die Datei /etc/inetd.conf ein. Sollte das einmal nicht der Fall sein, oder wenn man einen eigenen Service installieren will, muss man dies mit Hilfe eines Texteditors und Root-Rechten selber erledigen [4]. Dabei besteht jede Zeile aus sieben Spalten, die jeweils durch Leerzeichen bzw. Tabulatoren voneinander getrennt sind. Diese werden im Folgenden beschrieben.
/etc/inetd.conf | ||
Spalte | Eintrag | Funktion |
1: Service-Name | Name oder Portnummer | Dies ist der Name des Service, wie er in der Datei /etc/services vorkommt. Über diesen Namen und diese Datei ermittelt der Inetd den Port, den er mit diesem Dienst verknüpfen soll. Man kann stattdessen auch einfach die Portnummer verwenden. Namen sind aber meistens übersichtlicher. |
2: Socket-Typ | stream oder dgram | Meistens stream (kontinuierlicher Datenstrom), manchmal aber auch dgram (einzelne Datenpakete). |
3: Protokoll | tcp , tcp6 , udp oder udp6 | Bei tcp muss die vorhergehende Option stream gewählt werden, bei udp dgram . tcp6 bzw. udp6 lauschen bei inetutils-inetd auf IPv4 und IPv6, tcp und udp nur auf IPv4, bei openbsd-inetd lauschen tcp6 und udp6 nur auf IPv6, daher sind mehrere Zeilen für einen Dual-Stack-Betrieb erforderlich |
4: wait/nowait | wait oder nowait | wait bedeutet, dass auch alle weiteren Pakete an diesen Port an denselben Prozess weitergeleitet werden. nowait bedeutet, dass der Prozess abgetrennt und der Port für neue Verbindungen wieder frei gemacht wird.TCP-(Stream-)Dienste sollten immer die Option nowait haben, wenn inetd ihnen Verbindungen übergeben soll, d.h. jeweils einen Client Socket, mit dem der Dienst per Standardein- und ausgabekanal kommunizieren kann.TCP mit "wait" führt dazu, dass der Dienst stattdessen den Serverkanal ("master socket") übergeben bekommt. Analogie: Wenn ein Anruf reinkommt, startet inetd den Dienst, übergibt ihm das gesamte Telefon, und der Dienst muss dann selbst den Hörer abnehmen. Bei Dgram-Diensten hängt das von der Funktionsweise ab. |
5: Benutzerkonto | z.B. root oder nobody | Unter dieser Benutzerkennung wird der Dienst gestartet. Damit kann man den Service mit niedrigeren Rechten als unter Root starten, was der Sicherheit zugute kommt. Optional kann man abgetrennt durch einen Punkt auch eine Gruppe angeben. |
6: Server-Programm | Pfad/zum/Programm | Hier muss der volle Pfad des Programmes stehen, das den Serverdienst bereitstellt. Im Falle eines internen Dienstes des Inetd (s.u.) muss hier die Zeichenkette internal stehen. |
7: Kommandozeilen-Argumente | Programmname , ggf. Optionen | Hier gehören die Argumente hin, die man dem Server-Programm übergeben möchte. Diese Spalte erstreckt sich in jedem Fall bis zum Ende der Zeile, und es sind auch Leerzeichen erlaubt.Achtung!Das erste Argument muss der Programmname sein. Erst dann kommen die eigentlichen Argumente. internal stehen. |
Interne Dienste¶
Einige triviale Dienste, die traditionell zu Testzwecken auf Unix-Servern liefen, sind direkt in den Inetd eingebaut und können in der Konfigurationsdatei über das Schlüsselwort internal
referenziert werden. Da diese Dienste wenig praktischen Nutzen haben und in der Vergangenheit öfter für Denial-of-Service-Angriffe missbraucht wurden, trifft man sie heutzutage nur noch sehr selten in aktiviertem Zustand an. Alle diese Dienste sind stream/tcp
-Dienste.
Man kann auf diese Dienste mit einem Telnet-Client zugreifen. Um sie zu beenden, muss man
Strg +
] drücken und den Befehl quit
absenden.
telnet ::1 7
Ausgabe:
Trying ::1... Connected to ::1. Escape character is '^]'. Dies ist ein Test des echo-Protokolls Dies ist ein Test des echo-Protokolls ^] telnet> quit Connection closed.
Beenden mit Strg + ] und
quit
Interne Dienst für inetd | ||
Dienst | Port | Funktion |
echo | Port 7 | Dieser Dienst schickt immer genau die Zeichenketten zurück, die man an ihn sendet. |
discard | Port 9 | Dieser Dienst verschluckt alle Eingaben und sendet nie etwas zurück. |
daytime | Port 13 | Dieser Dienst antwortet mit der genauen Zeit, die auf dem Server gilt, und beendet daraufhin die Verbindung. |
chargen | Port 19 | Dieser Dienst antwortet mit einem endlosen Strom von ASCII-Zeichen, der erst endet, wenn man selber die Verbindung abbricht. |
time | Port 37 | Dieser Dienst liefert ebenfalls die Serverzeit, allerdings in einem maschinenlesbaren Format. |
Der interne auth-Dienst ist weder in inetutils-inetd noch in openbsd-inetd implementiert.
Beispielkonfiguration¶
#Bei inetutils-telnetd laufen diese Dienste sowohl auf IPv4 als auch IPv6, bei '''openbsd-inetd''' nur auf IPv6, hier müssen daher für IPv4 und IPv6 getrennte Einträge erstellt werden. # Legende: # Service Typ Proto Wait User Programm Argumente # Interne Dienste echo stream tcp6 nowait nobody internal discard stream tcp6 nowait nobody internal chargen stream tcp6 nowait nobody internal daytime stream tcp6 nowait nobody internal time stream tcp6 nowait nobody internal telnet stream tcp6 nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd #Telnet-Server mit telnetd #zusätzlich bei openbsd-inetd für IPv4 erforderlich echo stream tcp nowait nobody internal discard stream tcp nowait nobody internal chargen stream tcp nowait nobody internal daytime stream tcp nowait nobody internal time stream tcp nowait nobody internal telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd #Telnet-Server mit telnetd # Ein trivialer eigener "Dienst", der auf Port 3000 antwortet: 3000 stream tcp6 nowait nobody /bin/echo echo Hallo Welt!
Telnet-Server¶
telnetd (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install telnetd
Oder mit apturl installieren, Link: apt://telnetd
Hierbei wird der Dienst installiert und ein passender Eintrag für inetd erstellt, ggf. ist ein Neustart von inetd erforderlich. Jedoch ist IPv6 standardmäßig nicht aktiv, ersetzt man tcp
durch tcp6
lauscht der Dienst auch auf IPv6. Für openbsd-inetd muss eine separate Zeile mit tcp6
erstellt werden, sonst wird nur auf IPv6 gelauscht.
telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
FTP-Server¶
ftpd (universe)
Befehl zum Installieren der Pakete:
sudo apt-get install ftpd
Oder mit apturl installieren, Link: apt://ftpd
Auch hier wird ein passender Eintrag erstellt, ggf. ist ein Neustart von inetd erforderlich. Jedoch ist IPv6 standardmäßig nicht aktiv, ersetzt man tcp
durch tcp6
lauscht der Dienst auch auf IPv6.
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd
TCP-Wrapper¶
TCP-Wrapper ist eine Bibliothek, mit der man Zugriffskontrollen für TCP-Verbindungen implementieren kann. Mit Hilfe des Inetds und des tcpd
kann man diese Kontrollen praktischerweise für jeden inetd-fähigen Service implementieren. Nebenbei wird auch noch jeder Zugriffsversuch im syslog und daemon.log festgehalten.
Um einen inetd-Service über TCP-Wrapper zu schützen, muss man nur den Pfad des tcpd-Programms eintragen. Das eigentliche Server-Programm wird mit vollem Pfad als erstes Argument eingetragen, z.B. so:
# tcp-wrapper-geschützte Dienste telnet stream tcp6 nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd 3000 stream tcp6 nowait nobody /usr/sbin/tcpd /bin/echo Hallo Welt!
Hinweis:
Auch einige Stand-alone-Dienste wie z.B. openssh
und portmap
nutzen die TCP-Wrapper-Bibliothek, die sich im Paket libwrap0 befindet. In diesen Fällen gilt der folgende Abschnitt also auch.
hosts_access-Dateien¶
Geregelt wird der Zugriff auf tcp-wrapper-geschützte Dienste durch die Dateien /etc/hosts.allow und /etc/hosts.deny (auch als hosts_access-Dateien bezeichnet). Diese können beliebig viele Regeln beinhalten, je eine pro Zeile. TCP-Wrapper geht bei jeder eingehenden Verbindung erst die hosts.allow- und dann die hosts.deny-Datei durch und stoppt, wenn eine Regel passt. Hierbei wiegt eine Erlaubnis per hosts.allow höher als ein Verbot per hosts.deny, und weiter oben stehende Regeln haben höhere Priorität. Passt keine einzige Regel, so wird die Verbindung ebenfalls zugelassen.
Am sichersten ist man, wenn man ALL: ALL
in der hosts.deny einträgt und dann die Ausnahmen in der hosts.allow aufführt.
Achtung!
Wie erwähnt, benutzt auch der OpenSSH-Server diese Dateien. Man sollte also bei entfernten Rechnern Vorkehrungen treffen, damit man sich nicht selber aussperrt. Da diese Sperre nur neue Verbindungen betrifft, kann man nach einer Änderung der hosts_access-Dateien in einem weiteren Terminal testen, ob ein Login noch möglich ist, während man die ursprüngliche Shell offen hält. Am besten trägt man erstmal folgende Zeile in die hosts.allow-Datei ein:
sshd: ALL
Syntax¶
Beide Dateien benutzen dieselbe Syntax, nur dass eben die Logik entgegengesetzt funktioniert. Leerzeilen und Kommentarzeilen (mit # am Anfang) werden ignoriert.
Achtung!
Am Ende der jeweiligen Dateien muss unbedingt ein Zeilenvorschub stehen. Steht am Ende der Datei eine Regel ohne abschließenden Zeilentrenner, so wird diese nicht korrekt verarbeitet.
Jede Zeile besteht aus dem Namen des Services, einem Doppelpunkt und einer Liste der berechtigten oder unberechtigten Clients.
Servicename¶
Hier muss der Name des Programms eingetragen werden, nicht der Name des Ports, auf dem der Dienst lauscht! Das spezielle Wort ALL
bezeichnet alle Dienste.
Client(s)¶
Hier gibt es verschiedene Formen, die betreffenden Clients festzulegen. Die wichtigsten zeigt die folgende Tabelle:
Clients | |
Client | Funktion |
ALL | Passt auf alle Hosts |
LOCAL | Passt auf alle Hosts, deren Name keinen Punkt enthält |
host.domain.tld | Hostname |
w.x.y.z | IP-Adresse |
.domain.tld | Domain |
x.y.z. | Adress-Bereich, dessen IPs mit x.y.z. anfangen |
w.x.y.z/n | Netzmaske in CIDR-Notation |
Beispiel¶
/etc/hosts.deny:
# Alles verbieten, was nicht explizit erlaubt wird ALL: ALL
/etc/hosts.allow:
# Alle Verbindungen vom selben Rechner erlauben: ALL: localhost # Telnet für eine bestimmte IP erlauben in.telnetd: 10.0.0.77 in.telnetd: [::1] #IPv6-localhost (1 Adresse) in.telnetd: [2001:db8:1234:56ab::]/64 #ganzes IPv6-Netz # Dies kann auch kombiniert werden in.ftpd: 10.0.0.0/24, [2001:8db:123:4565::]/56 # Unseren Hallo-Welt-Service für zwei bestimmte Rechner und ein Subnetz freigeben: echo: 192.168.0.0/24 10.2.3.4 testserver.woauchimmer.de
Experten-Info:
Die hosts_access-Sprache ist noch viel mächtiger und besitzt noch viel mehr Optionen als hier dargestellt. Weitere Informationen findet man in den Manpages hosts_access (5) und hosts_options (5).
Links¶
xinetd - komplexere Alternative zu inetd
Serverdienste Übersichtsseite