Welche Ports hat mein Server offen?

Eine der wichtigsten Aufgaben eines Serveradmins ist es sein System zu kennen. Und einige der kritischten Faktoren sind die offenen Ports…

Theoretisch ist die Sache ganz einfach: Jeder offene Port ist eine Gefahr und sollte vermieden werden!
Praktisch ist es aber nicht ganz so einfach, denn wenn mein Server keine Ports offen hat kann er auch keine Dienste anbieten.

Also kommt man nicht drum rum doch den einen oder anderen Port aufzumachen.
Was nun aber wichtig ist: Man sollte exakt wissen welches Programm einen Port offen hat und dieses so aktuell wie möglich halten.

Manchmal wache ich nachts schweißgebadet auf und denke mir „Hat mein Datenbankserver eigentlich einen Port für die ganze Welt offen, und tausende Hacker sind gerade mit dem User ‚test‘ und Passwort ‚test123′ auf meiner Datenbank unterwegs?“!

Die Lösung dagegen?
Selber nachsehen!

Das Kommando ’netstat -tapen‘ hilft hier weiter, gucken wir uns das auf meinem System (Ubuntu 16.04) an:
(Mein System hat die IP: 176.30.32.128 und mein Computer der gerade per SSH drauf ist hat die 103.20.30.40)

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      111        20505       1155/mysqld

tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      0          16734       1234/dovecot

tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      0          16748       1234/dovecot

tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      0          20559       1435/master

tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      0          19550       1119/sshd

tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      0          16750       1234/dovecot

tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      0          16736       1234/dovecot

tcp        0    280 176.30.32.128:1234      103.20.30.40:12032      ESTABLISHED 0          20008       1738/sshd: heinz [priv

tcp        0      0 176.30.32.128:1234      103.20.30.40:11569      ESTABLISHED 0          19648       1486/sshd: heinz [priv

tcp6       0      0 :::110                  :::*                    LISTEN      0          16735       1234/dovecot

tcp6       0      0 :::143                  :::*                    LISTEN      0          16749       1234/dovecot

tcp6       0      0 :::80                   :::*                    LISTEN      0          14074       1284/apache2

tcp6       0      0 :::25                   :::*                    LISTEN      0          20560       1435/master

tcp6       0      0 :::443                  :::*                    LISTEN      0          14078       1284/apache2

tcp6       0      0 :::1234                 :::*                    LISTEN      0          19552       1119/sshd

tcp6       0      0 :::993                  :::*                    LISTEN      0          16751       1234/dovecot

tcp6       0      0 :::995                  :::*                    LISTEN      0          16737       1234/dovecot

Und jetzt gehen wir das Zeile für Zeile durch 🙂
(Leider sind die Zeilen hier umgebrochen)

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      111        20505       1155/mysqld

Mein Mysql-Server horcht auf IPv4 Port 3306, aber nur auf der IP 127.0.0.1. Somit horcht er nur lokal. Seine Prozess-ID ist 1155.

tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      0          16734       1234/dovecot

Mein Dovecot Server horcht auf dem IPv4 Port 110, aber auf der lokalen IP-Adresse 0.0.0.0 was soviel heißt wie ‚weltweit‘ -> Das ist also ein Dienst der auch von extern aufgerufen werden kann!
Der Port 110 ist POP3 – das will ich ja auch weltweit zur Verfügung stellen!

tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      0          16748       1234/dovecot

tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      0          20559       1435/master

tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      0          19550       1119/sshd

tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      0          16750       1234/dovecot

tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      0          16736       1234/dovecot

Die nächsten Zeilen zeigen weiterhin meinen Dovecot der wieder weltweit horcht (lokale Adresse 0.0.0.0) und zwar für die IPv4 Ports 143 + 993 + 995. Das ist IMAP, IMAP-S und POP3-S. Auch das will ich zur Verfügung stellen!
Sonst haben wir hier noch das Programm ‚master‘ auf IPv4 Port 25 – das ist SMTP und somit mein Postfix. Der soll ja SMTP machen, also darf er horchen.
Zuletzt haben wir noch das Programm ’sshd‘ (den SSH-Server) auf Port 1234. Den hab ich da hingesteckt, also alles wie gewünscht!

tcp        0    280 176.30.32.128:1234      103.20.30.40:12032      ESTABLISHED 0          20008       1738/sshd: heinz [priv

tcp        0      0 176.30.32.128:1234      103.20.30.40:11569      ESTABLISHED 0          19648       1486/sshd: heinz [priv

Diese beiden Freunde sind zwei SSH-Verbindungen die gerade nicht horchen (LISTEN) sondern aufgebaut sind (ETABLISHED).
Da ich gerade zwei Puttys zu meinem Server offen habe ist das so erwartet.
Der lokale Port ist 1234 (also mein SSH) und der entfernte Port ist einmal 12032 und 11569 – das ist ein nicht-priviligesierter Port meines Windows Computers auf dem Putty läuft.

Die nächsten Zeilen sind wieder alle horchenden Programme nur für IPv6.
Das einzige was mich noch stutzig gemacht hat ist das hier:

tcp6       0      0 :::80                   :::*                    LISTEN      0          14074       1284/apache2

tcp6       0      0 :::443                  :::*                    LISTEN      0          14078       1284/apache2

Es sieht so aus als würde mein Apache nur auf IPv6 horchen.
(Port is 80 für http und 443 für https, also wie erwartet!)
Aber warum sehen wir ihn nicht im IPv4?
Das liegt daran dass Apache unter Ubuntu mit Parameter ‚enable-v4-mapped‘ kompiliert wird.
Heißt also er horcht scheinbar nur auf einem IPv6 Port, wenn aber was über IPv4 kommt kann er das trotzdem über den IPv6 Socket annehmen.

Zusammenfassend also:
Alle die als Status ‚LISTEN‘ und als lokale Adresse entweder 0.0.0.0 (IPv4) oder ::: (IPv6) haben, sind Programme die man sich näher ansehen sollte.

Und da man -gerade bei Computern- grundsätzlich nichts aufs erste Mal glauben soll prüfen wir unsere Ergebnisse nochmal mit dem Programm ‚lsof -i‘ nach. ‚lsof‘ zeigt eigentlich die Dateien die ein Programm im Zugriff hat. Da aber ein Netzwerksocket in Linux auch nur eine Datei ist, kann das Programm auch alle hörenden Verbindungen anzeigen:

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

dhclient 1004     root    6u  IPv4  11988      0t0  UDP *:bootpc

sshd     1119     root    3u  IPv4  19550      0t0  TCP *:1234 (LISTEN)

sshd     1119     root    4u  IPv6  19552      0t0  TCP *:1234 (LISTEN)

mysqld   1155    mysql   21u  IPv4  20505      0t0  TCP localhost:mysql (LISTEN)

dovecot  1234     root   24u  IPv4  16734      0t0  TCP *:pop3 (LISTEN)

dovecot  1234     root   25u  IPv6  16735      0t0  TCP *:pop3 (LISTEN)

dovecot  1234     root   26u  IPv4  16736      0t0  TCP *:pop3s (LISTEN)

dovecot  1234     root   27u  IPv6  16737      0t0  TCP *:pop3s (LISTEN)

dovecot  1234     root   38u  IPv4  16748      0t0  TCP *:imap2 (LISTEN)

dovecot  1234     root   39u  IPv6  16749      0t0  TCP *:imap2 (LISTEN)

dovecot  1234     root   40u  IPv4  16750      0t0  TCP *:imaps (LISTEN)

dovecot  1234     root   41u  IPv6  16751      0t0  TCP *:imaps (LISTEN)

apache2  1284     root    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1284     root    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

apache2  1343 www-data    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1343 www-data    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

apache2  1344 www-data    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1344 www-data    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

apache2  1345 www-data    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1345 www-data    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

apache2  1346 www-data    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1346 www-data    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

apache2  1347 www-data    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1347 www-data    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

master   1435     root   12u  IPv4  20559      0t0  TCP *:smtp (LISTEN)

master   1435     root   13u  IPv6  20560      0t0  TCP *:smtp (LISTEN)

sshd     1486     root    3u  IPv4  19648      0t0  TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:11569 (ESTABLISHED)

sshd     1572       heinz 3u  IPv4  19648      0t0  TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:11569 (ESTABLISHED)

apache2  1737 www-data    4u  IPv6  14074      0t0  TCP *:http (LISTEN)

apache2  1737 www-data    6u  IPv6  14078      0t0  TCP *:https (LISTEN)

sshd     1738     root    3u  IPv4  20008      0t0  TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:12032 (ESTABLISHED)

sshd     1770       heinz 3u  IPv4  20008      0t0  TCP myhostname.de:1234->40-30-20-103.ip-addr.inexio.net:12032 (ESTABLISHED)

Wir sehen dass sich hier alles mit netstat deckt – bis auf:

dhclient 1004     root    6u  IPv4  11988      0t0  UDP *:bootpc

Das scheint ein DHCP-Client zu sein. Warum haben wir den in netstat nicht gesehen? -> Weil wir netstat nicht gesagt haben dass wir auch gerne UDP sehen wollen.

’netstat -tapen‘ bedeutet:

  • t: TCP-Verbindungen
  • a: Zeige Verbindungen im Status ‚LISTEN‘ und ‚ESTABLISHED‘ (sonst nur established!)
  • p: Programm-ID und PID anzeigen
  • e: Ausführliche Informationen anzeigen
  • n: Zeige Port-Nummern, nicht Namen (wie http, ssh…)

Und damit wissen wir auch wie unser (mein) Lieblingskommando geht:

netstat -tulpen
  • t: Zeige auch TCP-Verbindungen
  • u: Zeige auch UDP-Verbindungen
  • l: Zeige nur Verbindungen im Status LISTEN
  • p: Programm-ID und PID
  • e: Erweiterte Informationen anzeigen (Besitzer des Sockets z.B.)
  • n: Port-Nummern anzeigen

Mit „netstat -tulpen“ finden wir nun auch unseren DHCP-Client der auf Port 68 horcht:

udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          11988       1004/dhclient

Wenn man ganz geschickt ist passt man das Kommando noch so an dass man nur die anzeigt die auch weltweit horchen. Dazu muss man nur die mit IP-Adresse ‚127.0.0.1‘ (IPv4) und „::1“ (IPv6) ausschließen:

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

Und das letzte was wir jetzt noch benötigen ist die Verifizierung von außen. Also nehmen wir einen anderen Computer und starten

nmap myhostname.de -p-

Dabei bedeutet „-p-“ das wir wirkliche alle Ports des Zielcomputers „myhostname.de“ scannen wollen – nicht nur die bekannten!
(nmap ist in den Paketquellen von Ubuntu beinhaltet und kann mit „apt-get install nmap“ installiert werden!)
Das Ergebnis ist wie erwartet:

PORT     STATE SERVICE
25/tcp   open  smtp
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
443/tcp  open  https
993/tcp  open  imaps
995/tcp  open  pop3s
1234/tcp open  unknown

Warum ist unser DHCP-Client nicht dabei?
Ganz einfach, nmap scannt normalerweise nur TCP!
Es kann auch UDP-Dienste scannen, aber da ein UDP-Dienst nicht antworten muss (und der DHCPClient tut das nicht!) bringt einem das nichts.
Das Kommando um also den Port 68 per UDP zu scannen wäre:
„nmap myhostname.de -p68 -sU“.
Leider ist (wie erwartet) die Antwort nichts sagend:

PORT   STATE         SERVICE
68/udp open|filtered dhcpc

So, und wenn ich noch Lust finde dann gehen wir demnächst mal ein paar Firewall-Grundlagen durch 🙂

 

 

Eine Antwort auf „Welche Ports hat mein Server offen?“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.