Wie schützt man VPS richtig durch eine UFW-Firewall?

Wie schützt man VPS richtig durch eine UFW-Firewall?

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 iptablesoder 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/

verwandte Informationen