ubuntuusers.de

Offene Ports

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Was ist ein Port?

Den meisten Benutzern ist sicherlich schon mindestens einmal der Begriff "Netzwerkport" unter die Augen gekommen, vor allem im Zusammenhang mit Computer-Sicherheit. Hier wird dann oft von "offenen Ports" gesprochen, die man per "Firewall" oder auf andere Art schließen müsse. Vielen ist dabei gar nicht so klar, was "Ports" eigentlich sind, wozu man sie genau braucht, wie sie funktionieren, was es bedeutet, wenn sie offen sind, und wie man sie schließt, wenn man sie nicht braucht.

Die Protokolle TCP und UDP

Die Dienste im Internet werden allgemein über zwei unterschiedliche Protokolle abgewickelt, TCP und UDP. Beide benutzen nummerierte sogenannte "Ports", um Netzwerk-Pakete zu den passenden Programmen zu leiten. Jedes dieser Protokolle verfügt über 65535 solcher Ports, die voneinancer unabhängig sind: Port "22/tcp" ist also ein anderer Port als "22/udp".

Um ein Durcheinander zu verhindern, wurde die Zuordnung von Diensten (Webserver, Mailserver, etc.) zu Portnummern standardisiert. Eine Liste dieser Zuordnungen befindet sich in der Datei /etc/services.

...
smtp            25/tcp          mail
...
http            80/tcp          www             # WorldWideWeb HTTP
...
https           443/tcp                         # http protocol over TLS/SSL
...

Client- und Server-Ports

Um eindeutig zu sein benötigt jede Netzwerkverbindung zwei Ports:

  • Quell-Port - Die Portnummer auf der Client-Seite ist meistens >= 1024.

  • Ziel-Port - Die Portnummer auf der Server-Seite ist in der Regel < 1024. Da diese Ports nur vom root-Benutzer geöffnet werden dürfen, bezeichnet man sie auch als privilegierte Ports. Der Grund dafür liegt darin, dass normale Benutzer auf einem Linux-System keine standardisierten Dienste (Webserver, Mailserver, etc.) anbieten sollten.

Ein sogenannter "Client" sendet von seinem Quell-Port Netzwerkpakete an den Ziel-Port des "Servers". Meist haben Serverdienste feste Ports, auf denen sie bekanntermaßen zu erreichen sind. So lauscht ein Webserver meist auf Port 80/tcp und SSH auf 22/tcp auf Verbindungsanfragen. Der Port des Clients ist variabel, er darf nur noch nicht bereits anderweitig auf dem Client aktuell verwendet werden. Der Server erfährt den Quell-Port des Clients bei der Verbindungsanfrage, und kann diese Netzwerkverbindung damit eindeutig identifizieren (Quell-Port + Ziel-Port).

Es gibt aber noch einen anderen Unterschied zwischen Server- und Client-Ports: Server-Ports sind "offen für alles" und warten darauf, dass andere Rechner sich mit ihnen verbinden. Client-Ports existieren nur für eine bereits bestehende Verbindung zum jeweiligen Server und nehmen keine Pakete von anderen Gegenstellen an.

Offen, Geschlossen, Gefiltert

Was heißt es nun, wenn ein Port "offen" oder "geschlossen" ist?

Ein Port ist "offen", wenn ein Dienst an einem Port nach Paketen lauscht, die an ihn geschickt werden, ohne dass diese Pakete vorher angefordert wurden.

Ein Port ist "geschlossen", wenn kein Dienst an diesem Port lauscht. Werden trotzdem Netzwerkpakete an diesen Port geschickt, so weist der Rechner diese Pakete sofort als "unzustellbar" zurück.

Es gibt noch einen dritten Zustand, der aber nur bei Verwendung eines Paketfilters auftritt: "gefiltert". Eine Firewall, die Pakete filtert, lässt keine Verbindung auf dem jeweiligen Port durch, schickt aber auch keine Fehlermeldung zurück. Das soll einem potentiellen Angreifer weniger Informationen über das Ziel liefern, aber der Nutzen ist umstritten.

Legitime Programme, die nur irrtümlich auf diesen Port zugreifen wollen, werden dagegen klar behindert. Anstatt sofort zu erfahren, dass sie die falsche Adresse kontaktiert haben, gehen sie davon aus, die Daten seien unterwegs verlorengegangen und senden noch ein paar Mal eine Kopie, während sie auf Antwort warten. Erst nach einiger Zeit geben sie auf. Es kommt so also zu einer merklichen Verzögerung von bis zu mehreren Minuten. Die meisten Firewalls können jedoch auch so eingestellt werden, dass sie korrekte Fehlermeldungen zurücksenden.

Ports öffnen

Wie öffnet man denn nun einen Port? Normalerweise braucht man nichts zu tun, um einen Port zu öffnen, da die einzelnen Dienste das bei Bedarf selber tun. Nur wenn man eine Firewall benutzt, muss man den Port dort bei Bedarf freischalten.

Client-Ports

Verbindungen nach außen sind bei den meisten Firewalls standardmäßig erlaubt. Deswegen braucht man nichts weiter zu unternehmen. Da die Client-Ports ja auch nur die Antworten der selbst gewählten Gegenstelle beachten, ist eine Filterung auch ziemlich unnötig, es sei denn, man will seine Benutzer aus bestimmten Gründen beschränken.

Server-Ports

Auch Serverdienste öffnen ihre Ports selbständig, sofern sie nicht durch eine Firewall blockiert werden. Das einzige, was in bestimmten Fällen noch aktiviert werden muss, ist eine sogenannte Portweiterleitung.

Wer einen handelsüblichen Router (oder auch einen Linux-Rechner als Router) an einer gängigen Einwähl- oder DSL-Leitung betreibt, benutzt mit Sicherheit die sogenannte "Network Address Translation (NAT)", auch "Masquerading" genannt. Erkennbar ist das daran, dass die IP-Adressen der eigenen Rechner aus einem der privaten Adressbereiche stammen.

In diesem Fall sind die Rechner nicht direkt aus dem Internet erreichbar, was sich schon mal positiv auf die Sicherheit im lokalen Netz auswirkt. Wer aber dennoch einen Server im lokalen Netz platzieren will, muss dafür sorgen, dass die gewünschten Ziel-Ports vom Router explizit weitergeleitet werden. Informationen dazu findet man sicherlich im Handbuch des Routers.

Wer also keine Personal Firewall auf seinem Rechner installiert hat, braucht auf dem Ubuntu-Rechner nichts weiter zu unternehmen um Ziel-Ports zu öffnen, außer die entsprechenden Dienste zu starten.

Ports schließen

Dienst beenden

Der einfachste Weg ist der naheliegendste. Hat man einen Computer, auf dem ein oder mehrere Dienste an verschiedenen Ports lauschen, man aber nicht möchte, dass dieser Rechner Dienste im Netzwerk anbietet, sollte man diese Dienste beenden. Wenn kein Dienst mehr an Ports lauscht, ist auch kein Port mehr offen. Informationen zu einzelnen Diensten und deren Verwaltung findet man hier im Wiki.

Dienst auf bestimmte Schnittstellen beschränken

Nicht immer möchte man Dienste gleich ganz abschalten. Hat man beispielsweise zu Hause einen Rechner stehen, der als Router und Webserver zum Testen von Webseiten fungieren soll, so wäre es nicht sinnvoll, den Webserver einfach zu beenden. Man möchte ihn ja für Testzwecke aus dem lokalen Netz benutzen. Er soll nur nicht aus dem Internet erreichbar sein.

In solchen Fällen kann man Dienste an eine bestimmte Netzwerkschnittstelle binden. Eine Verbindung in das Internet wird beispielsweise oft über eine Einwahlverbindung (also über ein analoges oder DSL-Modem) realisiert. Diese Netzwerkschnittstellen nennen sich immer "ppp0". Netzwerkschnittstellen für das lokale Netzwerk haben folgende Namenskonventionen:

  • "eth0", "eth1", "eth2", ...

  • "enp1s0", "enp2s0", "enp3s0", ...

  • "enp5s0f0", "enp5s0f1", ...

  • "wlan0", "wlan1", "wlan2", ...

  • "wlp5s0", "wlp5s1, "wlp5s2", ...

Eine Liste aller Netzwerkschnittstellen erhält man mit "ip link". Für die meisten Dienste kann man die zu nutzende Netzwerkschnittstelle in der jeweiligen Konfigurationsdatei festlegen. Netzwerkanfragen, die nicht über diese Schnittstelle am Server-Dienst ankommen, werden dann gar nicht erst beachtet.

Dienst auf bestimmte Adressbereiche beschränken

Über die Konfigurationen der meisten Dienste kann man IP-Adressbereiche bestimmen, auf die der Dienst reagieren soll, bspw. das eigene lokale Netz. Erreichen Pakete aus einem IP-Bereich außerhalb der spezifizierten Adressen den Dienst, so reagiert dieser nicht darauf.

TCP-Wrapper

Da es überflüssige Arbeit wäre, wirklich in jedem Dienst eigene derartige Konfigurationsmöglichkeiten einzubauen, wurde die TCP-Wrapper-Bibliothek erfunden, die inzwischen von vielen Diensten genutzt wird. Wie man diese konfiguriert, steht hier.

Paketfilter

Letztendlich bleibt immer noch ein Paketfilter, oder in der Umgangssprache eine Firewall. Solch ein Paketfilter sitzt vor den Diensten und kontrolliert, ob Pakete an bestimmte Netzwerkports geschickt werden dürfen oder nicht. Existiert eine Regel, dass auf einem bestimmten Port Pakete empfangen werden dürfen, so leitet der Paketfilter diese Pakete an den Dienst weiter. Wird ein Port explizit gesperrt, so werden alle Pakete an diesen fallen gelassen, auch wenn ein Dienst auf diesem Port im Netzwerk lauschen würde.

Auf jeder Ubuntu-Installation läuft von Haus aus der Paketfilter iptables. Allerdings werden bei der Installation keinerlei Regeln für den Filter gesetzt. Warum auch, denn dort, wo keine Dienste im Netzwerk auf Pakete hören, braucht man auch keine Ports zu filtern. Weitere Informationen zum Thema Ubuntu und Firewalls findet man hier im Wiki.

„Keine-offene-Ports“-Philosophie von Ubuntu

Die Entwickler von Ubuntu hatten sich zu Beginn der Entwicklung die Strategie „Keine offene Netzwerkports“ (siehe DefaultNetworkServices) vorgenommen. Damals war es üblich, dass beispielsweise auf fast jeder Linux-Installation ein SSH-Server lief, um sich aus dem Netzwerk auf dem Rechner anmelden zu können, egal ob das der Nutzer nun braucht oder nicht.

Dies ist bei Ubuntu nicht der Fall. Man kann dies über den Befehl [1]

sudo netstat -tulpen | grep -v '127.0.0.1'  | grep -v '::1:' 

selber überprüfen. Weitere Informationen zum Befehl netstat liefert die gleichnamige Wiki-Seite.

Ausnahmen

Ohne gewisse Dienste gibt es aber auch kein einfach zu nutzendes Netzwerk. Daher existieren zum heutigen Zeitpunk genau drei Ausnahmen von dieser Regel. Diese Ausnahmen dienen ausschließlich dazu, andere Dienste im Netzwerk zu entdecken und um diese Dienste nutzen zu können. Ohne diese Ausnahmen müsste eine Ubuntu-Installation erst für das Netzwerk tauglich gemacht werden.

Dhclient

Netzwerkgeräte beziehen heutzutage üblicherweise über DHCP von einem DHCP-Server ihre Konfiguration, also IP-Adresse, Gateway usw. So braucht man diese Konfiguration nicht von Hand einzutragen und kann das Gerät auch in verschiedenen Netzwerken (also zuhause, im Büro usw.) nutzen, ohne dass man die Netzwerkeinstellungen ändern muss. Solch ein DHCP-Server ist mittlerweile auch in allen gängigen DSL-Hardware-Routern eingebaut, so dass man auch zuhause in den Genuss dieser bequemen Art der Netzwerkkonfiguration kommt.

DHCP funktioniert jedoch nur, wenn der Rechner in der Lage ist, die für ihn bestimmten Informationen zu empfangen. Dafür öffnet die DHCP-Client-Anwendung "dhclient" einen Port

udp   0   0 0.0.0.0:68      0.0.0.0:*   100   20370   6086/dhclient       

Alle Pakete, die nicht von einem DHCP-Server des lokalen Netzwerks stammen bzw. nicht vom dhclient erwartet werden, werden von diesem aber ebenfalls verworfen, so dass dieser Port zwar offen ist, aber real nicht für Angriffe genutzt werden kann.

Avahi

Ein zweiter Dienst, der von Haus aus zwei Ports öffnet, ist Avahi. Avahi (oder auch Zeroconf) ist eine Technik zur Vernetzung von Geräten in einem lokalen Netzwerk, ohne dass diese konfiguriert werden müssen. So ist es möglich, zwei Rechner über ein Netzwerkkabel zu verbinden und sofort Daten auszutauschen. Man kommt also theoretisch sogar ohne DHCP-Server aus.

udp   0   0 0.0.0.0:32768   0.0.0.0:*   105   19889   5996/avahi-daemon:  
udp   0   0 0.0.0.0:5353    0.0.0.0:*   105   19888   5996/avahi-daemon:  

Dabei verarbeitet Avahi prinzipiell nur Daten aus dem lokalen Netzwerk. Der Dienst ist also nicht zum Internet hin offen, falls der Rechner beispielsweise über ein DSL-Modem direkt im Internet hängt. Es gilt aber auch hier dasselbe wie für dhclient: Wer diesen Dienst nicht benötigt, kann ihn natürlich trotzdem abschalten, was u.a. auf der Wiki-Seite Avahi erklärt wird. Genauere Angaben zu den Sicherheitsvorkehrungen im Avahi-Daemon liefert die Seite Avahi Security Considerations, die eigens erstellt wurde, um die Ubuntu-Macher von der Ungefährlichkeit dieses Dienstes zu überzeugen.

cups-browsed

Der dritte Dienst empfängt Bonjour- und CUPS-Meldungen um Netzwerkdrucker lokal zur Verfügung zu stellen.

udp     1536      0 0.0.0.0:631             0.0.0.0:*                           0          18899      585/cups-browsed

Wer keine Netzwerkdrucker verwendet, sollte den Dienst abschalten:

sudo systemctl stop cups-browsed
sudo systemctl disable cups-browsed 

Diese Revision wurde am 1. Mai 2019 21:08 von Beforge erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Sicherheit, System, Netzwerk