Przejdź do treści
Aktualny kupon:10% zniżkiUżyj w zamówieniu

Firewall wewnątrz VPS: UFW (i nftables dla zaawansowanych)

Skonfiguruj firewall UFW bezpośrednio w VPS bez odcinania sobie dostępu: polityka domyślna, reguły dla usług, ograniczanie według adresu IP, limit, IPv6, logi. Dlaczego Docker omija UFW i jak użyć nftables.

  • zaawansowany
  • ~20 min
  • Zaktualizowano 9.10.2026

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ź:

bash
ufw status

Wyjście Status: inactive oznacza, że firewall jeszcze niczego nie blokuje.

Debian 13

Zainstaluj UFW:

bash
apt install ufw

Po 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:

bash
ufw default deny incoming
ufw default allow outgoing
  • ufw 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.

bash
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#

  1. Włącz firewall:

    bash
    ufw enable
  2. UFW pyta Command may disrupt existing ssh connections. Proceed with operation (y|n)?. Jeśli masz regułę SSH, wpisz y i naciśnij Enter.

  3. Zobaczysz Firewall is active and enabled on system startup. Firewall działa i startuje także po restarcie.

  4. W nowym oknie sprawdź, czy możesz połączyć się przez SSH.

  5. Pokaż szczegółowy status:

    bash
    ufw status verbose
    Wyniktext
    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
LiniaZnaczenie
Status: activeFirewall 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: skipNowe profile aplikacji nie są dopuszczane automatycznie.
22/tcp ALLOW IN AnywherePort 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 chceszPolecenie
WWW (HTTP i HTTPS)ufw allow proto tcp from any to any port 80,443 comment 'Web'
Minecraft Javaufw 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ówufw allow proto tcp from any to any port 25565:25600 comment 'Game servers'
Port tylko z jednego adresu IPufw allow proto tcp from 198.51.100.25 to any port 3306 comment 'DB from office'
Blokada adresu IPufw 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ż zakres 198.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 przez ufw prepend deny from 2001:db8::/64, co umieszcza regułę na początku reguł IPv6.
  • deny – po cichu odrzuć. Wariant reject informuje 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)#

bash
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#

bash
ufw status numbered
Wyniktext
     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)              # Minecraft

Usuwanie reguły według numeru:

bash
ufw delete 2
  • ufw 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:

PolecenieCo robi
ufw reloadPonownie wczytuje reguły (po ręcznej edycji plików w /etc/ufw/).
ufw disableWyłącza firewall; reguły pozostają zapisane.
ufw --dry-run allow 80/tcpPokazuje, co zrobiłoby polecenie, ale niczego nie zmienia.
ufw resetWyłą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ąć:

  1. 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.
  2. 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.

  3. 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#

bash
ufw logging low
  • low – loguje zablokowane pakiety, z limitem liczby wpisów. Wyższe poziomy (medium, high, full) logują więcej i log szybko rośnie. ufw logging off wyłącza logowanie.

Gdzie znaleźć wpisy:

Ubuntu 24.04

bash
tail -f /var/log/ufw.log
  • tail -f – wypisuje na bieżąco nowe linie pliku. Wyjście przez Ctrl+C.

Debian 13

bash
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:

/etc/nftables.conftext
#!/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;
    }
}
LiniaCo robi
flush rulesetUsuwa wszystkie istniejące reguły, aby plik zawsze wczytywał się od czystego stanu.
table inet filterTabela 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 acceptPrzepuszcza odpowiedzi na już nawiązane połączenia. Bez tego nie działałoby nic, co VPS sam otwiera.
ct state invalid dropOdrzuca uszkodzone lub bezsensowne pakiety.
iif "lo" acceptZezwala 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 } acceptZezwala na ICMP: ping i komunikaty potrzebne do poprawnej pracy sieci. IPv6 nie działa bez ICMPv6 (neighbor discovery).
tcp dport 22 acceptSSH. Jeśli używasz innego portu, zmień go.
tcp dport { 80, 443 } acceptWWW. Zbiór portów w nawiasach klamrowych. Dla UDP użyj udp dport.
chain forward … policy dropVPS nie będzie przekazywać ruchu (nie jest routerem).
chain output … policy acceptRuch wychodzący bez ograniczeń.

Wdrożenie (dotyczy zarówno Debiana 13, jak i Ubuntu 24.04):

  1. Zainstaluj narzędzie: apt install nftables.

  2. Wyłącz UFW, jeśli działa: ufw disable.

  3. Zapisz konfigurację do /etc/nftables.conf (nano /etc/nftables.conf).

  4. 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.
  5. Włącz usługę, która wczytuje reguły od razu i po każdym starcie:

    bash
    systemctl enable --now nftables
    • enable – wczytuj reguły przy starcie VPS (usługa jest domyślnie wyłączona).
    • --now – i wczytaj je od razu.
  6. Sprawdź SSH w nowym oknie. nft list ruleset wypisuje bieżące reguły.

Weryfikacja#

  • ufw status verbose pokazuje Status: active i 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 Linux nc -vz -w 5 <ADRES_IP_VPS> 3306; zamknięty port kończy się przekroczeniem czasu).

Jeśli się odetniesz#

  1. Otwórz konsolę w przeglądarce i zaloguj się jako root.
  2. Zezwól na SSH: ufw allow 22/tcp, albo tymczasowo wyłącz firewall: ufw disable.
  3. Przy nftables: systemctl stop nftables, a potem nft flush ruleset (usuwa wszystkie reguły; ruch będzie dozwolony).
  4. 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ły deny odrzucającej ten sam ruch.
  • Sprawdź, czy aplikacja nasłuchuje na porcie: ss -tulpn | grep <PORT>. Adres 127.0.0.1 oznacza 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 potem ufw enable.
  • Polityka domyślna: deny incoming, allow outgoing; reguły działają od góry i wygrywa pierwsze dopasowanie.
  • ufw status numbered i ufw delete <numer> do zarządzania regułami, ufw status verbose do kontroli.
  • IPv6 jest włączone (IPV6=yes); reguły powstają dla obu wersji.
  • Porty opublikowane przez Dockera omijają UFW: publikuj na 127.0.0.1 albo użyj firewalla w strefie klienta.
  • nftables tylko dla zaawansowanych i nigdy razem z UFW.

Wyszukiwanie w poradnikach