UFW (Uncomplicated Firewall) to firewall bezpośrednio wewnątrz VPS, którym sterujesz czytelnymi poleceniami. Skonfigurujesz go tak, aby z zewnątrz dostępne było tylko to, co chcesz, bez odcinania sobie SSH. Na końcu dowiesz się, dlaczego Docker omija UFW, a zaawansowani znajdą przykładową konfigurację nftables.
Czego potrzebujesz
- VPS w StormHost z Ubuntu 24.04 lub Debianem 13
- Połączenie SSH jako root (poradnik)
- Otwarta na wszelki wypadek konsola w przeglądarce
- Lista portów używanych przez Twoje usługi
- Około 20 minut
UFW w pigułce#
Linux filtruje pakiety w jądrze (podsystem netfilter, sterowany przez nftables lub iptables). Pisanie reguł bezpośrednio jest skomplikowane; UFW robi to za Ciebie: zamienia polecenie ufw allow 22/tcp na właściwe reguły zarówno dla IPv4, jak i IPv6.
UFW to jedna z dwóch opcji. Druga to firewall w strefie klienta, który filtruje ruch, zanim w ogóle dotrze do VPS. Jeśli używasz obu, port musi być otwarty w obu.
Instalacja i polityka domyślna#
Ubuntu 24.04
UFW jest zainstalowany, ale wyłączony. Sprawdź:
ufw statusWyjście Status: inactive oznacza, że firewall jeszcze niczego nie blokuje.
Debian 13
Zainstaluj UFW:
apt install ufwPo instalacji jest wyłączony (ufw status wypisuje Status: inactive).
Ustaw politykę domyślną, czyli co dzieje się z ruchem, o którym nie mówi żadna reguła:
ufw default deny incoming
ufw default allow outgoingufw default deny incoming– blokuj nowe połączenia przychodzące, chyba że zezwala na nie reguła.ufw default allow outgoing– zezwalaj na połączenia wychodzące z VPS (aktualizacje, DNS, pobieranie).
UFW jest stanowy: odpowiedzi na połączenia, które VPS sam otworzył, przechodzą nawet przy deny incoming.
Zezwól na SSH, zanim włączysz firewall#
Bez reguły SSH odetniesz się przy włączeniu
ufw enable z polityką deny incoming natychmiast blokuje wszystko, co nie jest dozwolone. Jeśli w tym momencie nie masz reguły dla SSH, połączenie pada. Do VPS dostaniesz się wtedy tylko przez konsolę w przeglądarce. Jeśli Twoje SSH działa na porcie innym niż 22, zezwól na tamten.
ufw allow 22/tcp comment 'SSH'ufw allow– dodaje regułę zezwalającą na ruch przychodzący.22/tcp– port 22, protokół TCP.comment 'SSH'– notatka widoczna na liście reguł.
Alternatywnie możesz użyć profilu aplikacji. ufw app list wypisuje profile (na przykład OpenSSH, a po instalacji Nginx także Nginx Full). Regułę dodajesz wtedy przez ufw allow OpenSSH.
Włączenie i kontrola#
Włącz firewall:
bash ufw enableUFW pyta
Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Jeśli masz regułę SSH, wpiszyi naciśnij Enter.Zobaczysz
Firewall is active and enabled on system startup. Firewall działa i startuje także po restarcie.W nowym oknie sprawdź, czy możesz połączyć się przez SSH.
Pokaż szczegółowy status:
bash ufw status verboseWyniktext Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere # SSH 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
| Linia | Znaczenie |
|---|---|
Status: active | Firewall działa. |
Logging: on (low) | Zapisuje zablokowane pakiety do logu, z limitem liczby wpisów. |
Default: deny (incoming) | Ruch przychodzący bez reguły jest odrzucany. |
allow (outgoing) | Ruch wychodzący jest dozwolony. |
disabled (routed) | UFW nie obsługuje ruchu przekazywanego (VPS jako router). |
New profiles: skip | Nowe profile aplikacji nie są dopuszczane automatycznie. |
22/tcp ALLOW IN Anywhere | Port 22/TCP jest dozwolony skądkolwiek przez IPv4. |
(v6) | Ta sama reguła dla IPv6. UFW tworzy ją automatycznie. |
Reguły dla usług#
| Czego chcesz | Polecenie |
|---|---|
| WWW (HTTP i HTTPS) | ufw allow proto tcp from any to any port 80,443 comment 'Web' |
| Minecraft Java | ufw allow 25565/tcp comment 'Minecraft' |
| Bedrock (Geyser) | ufw allow 19132/udp comment 'Geyser' |
| FiveM (TCP i UDP) | ufw allow 30120 comment 'FiveM' |
| Rust (gra i query) | ufw allow proto udp from any to any port 28015,28017 comment 'Rust' |
| Zakres portów | ufw allow proto tcp from any to any port 25565:25600 comment 'Game servers' |
| Port tylko z jednego adresu IP | ufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB from office' |
| Blokada adresu IP | ufw insert 1 deny from 198.51.100.25 comment 'Attacker' |
Jak czytać części poleceń:
25565/tcp– port i protokół. Bez protokołu (ufw allow 30120) reguła dotyczy zarówno TCP, jak i UDP.proto tcp– protokół w składni rozszerzonej. Zakres lub lista portów (80,443,25565:25600) wymaga protokołu.from any/from 198.51.100.25– skąd pochodzi połączenie: skądkolwiek albo z jednego adresu (może być też zakres198.51.100.0/24).to any port 3306– który adres i port VPS.any= wszystkie adresy VPS.insert 1– wstawia regułę na pierwsze miejsce. UFW ocenia reguły od góry i wygrywa pierwsze dopasowanie, więc blokada adresu musi być nad regułami zezwalającymi. Adres IPv6 blokujesz przezufw prepend deny from 2001:db8::/64, co umieszcza regułę na początku reguł IPv6.deny– po cichu odrzuć. Wariantrejectinformuje nadawcę, że połączenie odrzucono.
W komentarzach (comment) używaj tylko zwykłych liter bez znaków diakrytycznych, cyfr i spacji.
Ograniczanie liczby połączeń (limit)#
ufw limit 22/tcp comment 'SSH'ufw limit– zezwala na port, ale blokuje adres IP, który próbuje otworzyć 6 lub więcej połączeń w ciągu 30 sekund. Spowalnia to zgadywanie haseł.
Jeśli masz już regułę allow dla portu 22, najpierw ją usuń (zobacz następną sekcję), inaczej wygrałaby starsza reguła. Limit nie nadaje się do usług z wieloma legalnymi połączeniami (WWW, gry). Dla SSH lepszy jest fail2ban, bo reaguje na faktyczne nieudane logowania.
Reguły numerowane i usuwanie#
ufw status numbered To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere # SSH
[ 2] 25565/tcp ALLOW IN Anywhere # Minecraft
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6) # SSH
[ 4] 25565/tcp (v6) ALLOW IN Anywhere (v6) # MinecraftUsuwanie reguły według numeru:
ufw delete 2ufw delete 2– usuwa regułę numer 2. UFW prosi o potwierdzenie (y).
Po każdym usunięciu numery się przesuwają, więc przed usunięciem kolejnej uruchom ponownie ufw status numbered. Warianty IPv4 i IPv6 to dwie reguły. Obie usuniesz naraz, wypisując regułę: ufw delete allow 25565/tcp.
Inne przydatne polecenia:
| Polecenie | Co robi |
|---|---|
ufw reload | Ponownie wczytuje reguły (po ręcznej edycji plików w /etc/ufw/). |
ufw disable | Wyłącza firewall; reguły pozostają zapisane. |
ufw --dry-run allow 80/tcp | Pokazuje, co zrobiłoby polecenie, ale niczego nie zmienia. |
ufw reset | Wyłącza firewall i usuwa wszystkie reguły. Używaj tylko przy zaczynaniu od zera. |
IPv6#
UFW ma IPv6 domyślnie włączone: plik /etc/default/ufw zawiera linię IPV6=yes. Każda reguła bez konkretnego adresu IPv4 jest wtedy tworzona także dla IPv6 (linie (v6)). Nie ustawiaj IPV6=no. VPS ma publiczny adres IPv6 i bez reguł IPv6 ruch IPv6 nie byłby filtrowany Twoimi regułami.
Docker omija UFW#
Gdy publikujesz port w Dockerze (-p 8080:80 albo ports: w compose.yaml), jest dostępny z internetu nawet jeśli UFW go blokuje. Docker przekierowuje ruch do kontenera, zanim dojdzie do reguł UFW. Dokumentacja Dockera opisuje to jako niezgodność między Dockerem a UFW.
Jak tego uniknąć:
Publikuj porty tylko na
127.0.0.1. Są wtedy dostępne tylko wewnątrz VPS, a na zewnątrz wystawiasz je przez Nginx (zobacz Nginx i HTTPS):compose.yamlYAML services: app: ports: - "127.0.0.1:8080:80"127.0.0.1:8080:80– port 8080 na VPS, ale tylko na adresie lokalnym, przekazywany na port 80 w kontenerze.
Baz danych i usług wewnętrznych w ogóle nie publikuj. Kontenery rozmawiają ze sobą przez sieć Dockera; nie potrzebują portu na zewnątrz.
Użyj firewalla w strefie klienta. Filtruje ruch, zanim dotrze do VPS, więc łapie także porty opublikowane przez Dockera.
Nie używaj ustawienia Dockera "iptables": false; psuje sieć kontenerów. Zaawansowane filtrowanie ruchu do kontenerów (łańcuch DOCKER-USER) opisuje dokumentacja Dockera (otwiera się w nowym oknie). Więcej o Dockerze w poradniku Docker i Docker Compose.
Logowanie#
ufw logging lowlow– loguje zablokowane pakiety, z limitem liczby wpisów. Wyższe poziomy (medium,high,full) logują więcej i log szybko rośnie.ufw logging offwyłącza logowanie.
Gdzie znaleźć wpisy:
Ubuntu 24.04
tail -f /var/log/ufw.logtail -f– wypisuje na bieżąco nowe linie pliku. Wyjście przez Ctrl+C.
Debian 13
journalctl -k -f --grep "UFW"journalctl -k– komunikaty jądra (Debian domyślnie nie ma osobnego pliku/var/log/ufw.log).-f– wypisuj dalej nowe wpisy.--grep "UFW"– tylko linie z UFW.
Przykładowy wpis: [UFW BLOCK] IN=eth0 … SRC=198.51.100.25 DST=203.0.113.10 … PROTO=TCP SPT=51234 DPT=23. SRC to adres nadawcy, DST Twój VPS, PROTO protokół, a DPT port, z którym próbował się połączyć.
Dla zaawansowanych: nftables#
nftables to nowoczesne narzędzie do reguł firewalla w jądrze. Na Debianie jest domyślnym frameworkiem, a sam UFW używa go pod spodem (przez warstwę iptables-nft). Pisanie reguł bezpośrednio w nftables przydaje się, gdy potrzebujesz więcej, niż potrafi UFW.
Nie mieszaj UFW z własnym nftables
Używaj albo UFW, albo własnego /etc/nftables.conf. Przed przejściem na nftables wyłącz UFW (ufw disable). Poniższa konfiguracja zaczyna się od polecenia flush ruleset, które usuwa wszystkie reguły w jądrze, łącznie z regułami Dockera i fail2ban. Po każdym restarcie usługi nftables zrestartuj więc także Dockera i fail2ban. Z Dockerem na tym samym VPS lepiej zostać przy UFW albo firewallu w strefie klienta.
Przykładowy plik dla serwera z SSH i stroną WWW:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
meta l4proto { icmp, ipv6-icmp } accept
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}| Linia | Co robi |
|---|---|
flush ruleset | Usuwa wszystkie istniejące reguły, aby plik zawsze wczytywał się od czystego stanu. |
table inet filter | Tabela filter dla rodziny inet, czyli IPv4 i IPv6 naraz. |
type filter hook input … policy drop | Łańcuch ruchu przychodzącego. Wszystko, na co nie zezwala żadna reguła, jest odrzucane. |
ct state established,related accept | Przepuszcza odpowiedzi na już nawiązane połączenia. Bez tego nie działałoby nic, co VPS sam otwiera. |
ct state invalid drop | Odrzuca uszkodzone lub bezsensowne pakiety. |
iif "lo" accept | Zezwala na ruch wewnątrz VPS (loopback, 127.0.0.1). Bez tego lokalne bazy danych i usługi przestają działać. |
meta l4proto { icmp, ipv6-icmp } accept | Zezwala na ICMP: ping i komunikaty potrzebne do poprawnej pracy sieci. IPv6 nie działa bez ICMPv6 (neighbor discovery). |
tcp dport 22 accept | SSH. Jeśli używasz innego portu, zmień go. |
tcp dport { 80, 443 } accept | WWW. Zbiór portów w nawiasach klamrowych. Dla UDP użyj udp dport. |
chain forward … policy drop | VPS nie będzie przekazywać ruchu (nie jest routerem). |
chain output … policy accept | Ruch wychodzący bez ograniczeń. |
Wdrożenie (dotyczy zarówno Debiana 13, jak i Ubuntu 24.04):
Zainstaluj narzędzie:
apt install nftables.Wyłącz UFW, jeśli działa:
ufw disable.Zapisz konfigurację do
/etc/nftables.conf(nano /etc/nftables.conf).Sprawdź ją bez stosowania:
bash nft -c -f /etc/nftables.conf-c– tylko kontrola; nic się nie zmienia. Jeśli wszystko jest w porządku, nic nie wypisuje.-f– wczytaj reguły z pliku.
Włącz usługę, która wczytuje reguły od razu i po każdym starcie:
bash systemctl enable --now nftablesenable– wczytuj reguły przy starcie VPS (usługa jest domyślnie wyłączona).--now– i wczytaj je od razu.
Sprawdź SSH w nowym oknie.
nft list rulesetwypisuje bieżące reguły.
Weryfikacja#
ufw status verbosepokazujeStatus: activei reguły dla wszystkich Twoich usług.- Możesz połączyć się z komputera przez SSH, a usługi działają.
- Niedozwolony port nie odpowiada z zewnątrz (test z komputera: w Windows
Test-NetConnection <ADRES_IP_VPS> -Port 3306, w macOS i Linuxnc -vz -w 5 <ADRES_IP_VPS> 3306; zamknięty port kończy się przekroczeniem czasu).
Jeśli się odetniesz#
- Otwórz konsolę w przeglądarce i zaloguj się jako root.
- Zezwól na SSH:
ufw allow 22/tcp, albo tymczasowo wyłącz firewall:ufw disable. - Przy nftables:
systemctl stop nftables, a potemnft flush ruleset(usuwa wszystkie reguły; ruch będzie dozwolony). - Popraw reguły i włącz firewall ponownie.
Rozwiązywanie problemów#
ERROR: Must specify 'tcp' or 'udp' with multiple ports#
Zakres lub lista portów wymaga protokołu. Zapisz regułę tak: ufw allow proto tcp from any to any port 25565:25600. Dla TCP i UDP dodaj dwie reguły.
Reguła jest dodana, ale port nadal jest zamknięty#
- Sprawdź kolejność (
ufw status numbered). Nad nią nie może być regułydenyodrzucającej ten sam ruch. - Sprawdź, czy aplikacja nasłuchuje na porcie:
ss -tulpn | grep <PORT>. Adres127.0.0.1oznacza dostępność tylko wewnątrz VPS. - Sprawdź firewall w strefie klienta. Jeśli jest w trybie Blokuj wszystko poza dozwolonym, port musi być dozwolony także tam.
Port z Dockera jest otwarty, mimo że UFW go blokuje#
To oczekiwane zachowanie, zobacz sekcję Docker omija UFW.
ERROR: initcaps przy włączaniu#
UFW nie może użyć modułów jądra. Zwykle zaktualizowano jądro, a VPS jeszcze nie działa na nowym. Zrestartuj VPS i włącz UFW ponownie.
Po restarcie usługi nftables przestał działać Docker lub fail2ban#
flush ruleset usunął ich reguły. Zrestartuj je: systemctl restart docker fail2ban.
Podsumowanie
- Najpierw
ufw allow 22/tcp, dopiero potemufw enable. - Polityka domyślna:
deny incoming,allow outgoing; reguły działają od góry i wygrywa pierwsze dopasowanie. ufw status numberediufw delete <numer>do zarządzania regułami,ufw status verbosedo kontroli.- IPv6 jest włączone (
IPV6=yes); reguły powstają dla obu wersji. - Porty opublikowane przez Dockera omijają UFW: publikuj na
127.0.0.1albo użyj firewalla w strefie klienta. - nftables tylko dla zaawansowanych i nigdy razem z UFW.