Serwer wystawiony do internetu bez firewalla? Da się tak żyć. Tylko po co.

Jeśli chcesz, żeby z zewnątrz widać było wyłącznie te porty, których faktycznie używasz, sięgnij po UFW (Uncomplicated Firewall). Nazwa nie kłamie - to naprawdę jest nieskomplikowane, bo UFW to po prostu nakładka na iptables, która tłumaczy ludzkie polecenia na tamtejsze zaklęcia.

Na Mikrusie#

Tu sprawa jest banalna. W NOOBS-ie mamy gotowy skrypt, który ustawia domyślne polityki, otwiera SSH i trzy standardowe porty Twojego Mikrusa, a na deser dokłada ochronę przed skanowaniem portów.

NOOBS-a jeszcze nie masz? Proszę bardzo:

curl -s https://noobs.mikr.us | bash

A potem już tylko:

sudo /opt/noobs/scripts/chce_firewall.sh

Skrypt sam wyłuskuje numer Mikrusa z nazwy hosta i na tej podstawie otwiera porty 10000+ID, 20000+ID oraz 30000+ID. Jeżeli w panelu masz wyklikane jeszcze jakieś dodatkowe porty, podaj je jako argumenty:

sudo /opt/noobs/scripts/chce_firewall.sh 8080 2222

Koniec. Serio. Od teraz wszystko, co przychodzi z zewnątrz, jest odbijane, chyba że jawnie na to pozwoliłeś.

Na dowolnym serwerze (Ubuntu/Debian)#

Wolisz wiedzieć, co się dzieje pod maską? Albo siedzisz na VPS-ie u kogoś innego? Poniżej to samo ręcznie. Na Mikrusie działa identycznie.

UFW najczęściej już siedzi w systemie (przyjeżdża razem z openssh-server), tyle że uśpiony. Sprawdź:

sudo ufw status

Status: inactive? W porządku, lecimy dalej. A gdyby UFW w ogóle nie było:

sudo apt update && sudo apt install ufw

Teraz haczyk, na który łapie się sporo osób. Na standardowym obrazie Ubuntu, z którego korzysta Mikrus, domyślna polityka dla ruchu przychodzącego to ACCEPT, nie DENY - czyli “wchodźcie wszyscy”. Samo ufw enable niczego więc nie zablokuje. Politykę trzeba ustawić jawnie:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Zanim włączysz firewall, otwórz SSH. Bez dyskusji. Inaczej zamkniesz drzwi, stojąc po złej stronie:

sudo ufw allow 22/tcp

Na Mikrusie dorzuć od razu trzy standardowe porty (112 zamień na numer swojej maszyny):

sudo ufw allow 10112/tcp
sudo ufw allow 20112/tcp
sudo ufw allow 30112/tcp

Chwila, moment. Czemu SSH to 22, skoro łączysz się na 10112? Bo reguły UFW dotyczą portu, na którym usługa nasłuchuje wewnątrz kontenera, a ten nie musi się pokrywać z numerem widocznym z zewnątrz. Ruch na 10112 przekierowujemy u siebie na 22 w Twoim kontenerze. Z pozostałymi dwoma portami (20000+ID i 30000+ID) jest prościej, bo przekierowanie idzie 1:1 i numery się zgadzają.

Teraz można już spokojnie:

sudo ufw enable

Podstawowe komendy#

Strona WWW? Otwierasz 80 i 443:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Blokada portu. Przydaje się zaskakująco często, bo niejedna aplikacja po instalacji ochoczo wystawia się na cały świat, choć nikt jej o to nie prosił:

sudo ufw deny 8080/tcp

Dostęp tylko z jednego adresu IP, na przykład do panelu admina wyłącznie z domowego łącza:

sudo ufw allow from 81.15.20.33 to any port 8080

I moja ulubiona komenda, czyli rate limiting. Szczerze mówiąc, przy SSH to całkiem sensowny zamiennik fail2ban dla leniwych: 6 prób połączenia w ciągu 30 sekund i adres ląduje na 30 sekund w karnym kącie.

sudo ufw limit 22/tcp

Na koniec IPv6, o którym ludzie notorycznie zapominają. Każdy Mikrus ma prawdziwy, publiczny adres IPv6, bez żadnego NAT-u. Ruch po IPv6 trafia więc prosto do kontenera i nie przechodzi przez te trzy przekierowane porty. Brzmi groźnie, ale UFW ogarnia to bez Twojego udziału: każda reguła dostaje bliźniaczkę dla IPv6, oznaczoną w statusie jako (v6).

Sprawdzanie stanu firewalla#

sudo ufw status verbose

Wersja z numerkami, która przyda się za moment przy usuwaniu:

sudo ufw status numbered

Usuwanie reguły#

Można podać regułę dokładnie tak, jak przy dodawaniu:

sudo ufw delete allow 8080/tcp

Można też po numerze z ufw status numbered:

sudo ufw delete 3

UFW upewni się jeszcze pytaniem Proceed with operation (y|n)?. Wciskasz y.

Najczęstsze błędy#

Odcięcie samego siebie. Klasyka gatunku. ufw enable przy polityce deny incoming, a wcześniej zabrakło ufw allow 22/tcp, i SSH milknie w ułamku sekundy. Na Mikrusie z opresji wyciągnie Cię MARIAN z panelu - za jego pomocą odpalisz na serwerze ufw disable, nawet gdy SSH już nie wpuszcza.

Reguła niby jest, ale nie działa. W dziewięciu przypadkach na dziesięć chodzi o pomylenie portu zewnętrznego z panelu z wewnętrznym, na którym usługa faktycznie słucha. Wróć do przykładu z SSH.

UFW plus ręczne reguły iptables. Nie róbcie tego. UFW zarządza w iptables własnymi łańcuchami, a dokładanie do nich ręcznych reguł kończy się zachowaniem, którego nie przewidzi nikt, łącznie z autorem tych reguł.