
Ich habe einen neuen VPS auf DO eingerichtet und versuche nun, meinen Server mit einer UFW-Firewall zu schützen. Aber ich bin ein wenig verwirrt.
Mein Ziel ist es also, nur die SSH-, HTTP/HTTPS-bezogenen Ports zuzulassen. Der Rest sollte geschlossen werden. Was ich getan habe, um dies zu erreichen:
# ufw allow ssh
# ufw allow http
# ufw allow https
# ufw enable
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)
Wie Sie sehen, ist hier alles in Ordnung: Der gesamte eingehende Datenverkehr wird wie erwartet mit Ausnahme der Ports 22, 80 und 443 abgelehnt.
Ich verwende übrigens Docker für meine PHP Laravel Anwendung. Zum Starten von Containern verwende ich den Befehl: „docker-compose up -d“.
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
app docker-php-entrypoint php-fpm Up 9000/tcp
database docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp, 33060/tcp
web nginx -g daemon off; Up 0.0.0.0:81->80/tcp
Auf dem Hostcomputer sind einige Ports verfügbar: 3307, 81.
Um sicherzustellen, dass die Firewall ordnungsgemäß funktioniert, verwende ich nmap:
$ nmap -Pn [server ip]
Starting Nmap 7.70 ( https://nmap.org ) at 2018-09-13 12:17 EEST
Nmap scan report for [server host] ([server ip])
Host is up (0.054s latency).
Not shown: 995 filtered ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp closed smtp
80/tcp open http
81/tcp open hosts2-ns
443/tcp closed https
Nmap done: 1 IP address (1 host up) scanned in 5.59 seconds
Hier sind mir zwei Dinge nicht klar:
25/tcp closed smtp
Warum ist das hier?
81/tcp open hosts2-ns
Warum ist dieser Port geöffnet?
Wahrscheinlich muss ich den Webcontainer aufrufen und die IP-Adresse 127.0.0.1 im Abschnitt „Nginx-Server“ explizit angeben. Soweit ich weiß, ist MySQL standardmäßig nur für den lokalen Host (my.conf) geöffnet, daher sehen wir den MySQL-Port in der Liste unten nicht. Aber warum blockiert UFW die von Docker freigegebenen Ports nicht?
Danke schon mal an alle die mir erklären können woran das liegt.
Antwort1
Wahrscheinlich ufw
zeigt nur die UFW-Konfiguration an und alle Regeln, die direkt in Ihre Firewall-Konfiguration eingefügt werden (mit iptables
oder einem anderen Tool wie Docker), ohne über UFW zu gehen, werden NICHT angezeigt.
25/tcp closed smtp
Warum ist das hier?
Ein häufiger Grund ist, dass viele (Privat-)ISPs und Organisationen ausgehenden SMTP-Verkehr blockieren.
81/tcp open hosts2-ns
Warum ist dieser Port geöffnet?
Nicht nur, dass Port 81 offen ist, nmap hat auch das Scannen von Port 1024 gestoppt und ich gehe davon aus, dass bei weiterer Überprüfung auch Port 3307 offen ist.
Es wird vom Docker geöffnet, da Ihr Docker angewiesen wird, die Ports 81 und 3307 zu veröffentlichen und sie Ihren Docker-Instanzen zuzuordnen …
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
app docker-php-entrypoint php-fpm Up 9000/tcp
database docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp, 33060/tcp
web nginx -g daemon off; Up 0.0.0.0:81->80/tcp
Überprüfen Sie dietatsächlich aktive Firewall-Konfigurationohne die benutzerfreundliche ufw-Schnittstelle mit beispielsweise iptables-save
oder mit iptables -L -v -n -t nat
(die meisten interessanten Docker-Sachen passieren in den NAT- und Routing-Abschnitten) und vielleichtiptables -L -v -n
Relevante Einträge wären etwa:
# Generated by iptables-save v1.6.0 on Thu Sep 13 13:50:12 2018
*nat
:PREROUTING ACCEPT [21796:1434198]
:INPUT ACCEPT [9101:666864]
:OUTPUT ACCEPT [20943:1960461]
:POSTROUTING ACCEPT [118496:7063513]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 3307 -j DNAT --to-destination 172.17.0.3:33060
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 81 -j DNAT --to-destination 172.17.0.8:80
Wenn Sie die Ports 81 und 3307 nicht im gesamten Internet veröffentlichen möchten, müssen Sie wahrscheinlich die Art und Weise ändern, wie Sie sie in Docker veröffentlichen. https://docs.docker.com/config/containers/container-networking/