Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

iptables i nftables — firewall dla VPS krok po kroku

Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo

Każdy serwer VPS podłączony do internetu jest celem automatycznych skanerów, prób bruteforce i botnetów. Bez firewall-a wystawionego na świat port 22 trafi w tablice hakerów w ciągu minut. iptables to klasyczny, sprawdzony w produkcji filtr pakietów Linuksa, a nftables to jego nowoczesny następca z lepszą wydajnością i ujednoliconą składnią. Ten artykuł tłumaczy jak działają tabele i łańcuchy (chains), jak napisać reguły dla typowego serwera WWW, skonfigurować NAT i rate limiting oraz jak przejść z iptables na nftables bez przerwy w działaniu.

Architektura netfilter — tabele i łańcuchy

Zarówno iptables jak i nftables są frontend-ami do podsystemu netfilter wbudowanego w jądro Linux. Pakiety przechodzą przez haki netfilter w konkretnej kolejności: PREROUTING → INPUT (dla lokalnych procesów) lub FORWARD (dla routowania) → OUTPUT → POSTROUTING. Tabele grupują reguły według funkcji:

Tabela Zastosowanie Łańcuchy
filter Domyślna — akceptuj/odrzucaj pakiety INPUT, FORWARD, OUTPUT
nat Translacja adresów (SNAT, DNAT, masquerade) PREROUTING, INPUT, OUTPUT, POSTROUTING
mangle Modyfikacja nagłówków pakietów (ToS, TTL, marks) Wszystkie 5 łańcuchów
raw Wyjątki od śledzenia połączeń (conntrack) PREROUTING, OUTPUT
security Etykiety SELinux dla pakietów INPUT, FORWARD, OUTPUT

Podstawowy zestaw reguł iptables dla serwera WWW

# Zeruj istniejace reguly (UWAGA: zamknie aktywne polaczenia SSH!)
# Najpierw otworz sesje backup na wypadek wypadniecia z SSH

# Polityki domyslne — DROP na wejsciu i forwardzie, ACCEPT na wyjsciu
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback (lokalny interfejs) — zawsze ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Istniejace/powiazane polaczenia — nie przerywaj ich
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH — TYLKO z trusted IP lub rate-limited (bruteforce ochrona)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
  -m recent --set --name SSH_FLOOD
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
  -m recent --update --seconds 60 --hitcount 10 --name SSH_FLOOD -j DROP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

# HTTP i HTTPS
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

# ICMP ping (ogranicz do 5/sek)
iptables -A INPUT -p icmp --icmp-type echo-request \
  -m limit --limit 5/second --limit-burst 10 -j ACCEPT

# Zapisz reguly (Debian/Ubuntu z netfilter-persistent)
sudo netfilter-persistent save

NAT — masquerade i przekierowanie portów

NAT (Network Address Translation) jest potrzebny gdy VPS pełni rolę routera dla sieci wewnętrznej (np. kontenerów Docker bez publicznego IP) lub gdy chcesz przekierować ruch z portu 80 na wewnętrzny serwer aplikacji na porcie 3000.

# Wlacz forwarding IP (wymagane dla NAT/routowania)
echo 1 > /proc/sys/net/ipv4/ip_forward
# Trwale — dodaj do /etc/sysctl.conf:
# net.ipv4.ip_forward = 1

# MASQUERADE — wychodzacy ruch z sieci wewnetrznej (np. kontenery)
# eth0 to publiczny interfejs serwera
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# DNAT — przekierowanie portu 8080 na wewnetrzny serwer 192.168.1.10:3000
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT \
  --to-destination 192.168.1.10:3000

# Port forwarding: publiczny port 2222 na SSH wewnetrznej maszyny
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT \
  --to-destination 192.168.1.20:22
iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 22 \
  -m conntrack --ctstate NEW -j ACCEPT

Rate limiting z modułem hashlimit

# Ochrona przed HTTP flood: max 50 nowych polaczen/sek per IP
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW \
  -m hashlimit \
  --hashlimit-above 50/second \
  --hashlimit-burst 100 \
  --hashlimit-mode srcip \
  --hashlimit-name http_flood \
  -j DROP

# Ochrona SMTP (port 25) — max 5 nowych polaczen/min per IP
iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW \
  -m hashlimit \
  --hashlimit-above 5/minute \
  --hashlimit-burst 10 \
  --hashlimit-mode srcip \
  --hashlimit-name smtp_flood \
  -j DROP

# Blokuj skanowanie portow — SYN bez odpowiedzi (SYN flood)
iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

# Blokuj fragmentowane pakiety (unikanie detection)
iptables -A INPUT -f -j DROP

# Blokuj "christmas tree" pakiety (wszystkie flagi TCP ustawione)
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# Zerowe pakiety (NULL scan)
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

nftables — nowoczesna alternatywa

nftables zastępuje iptables, ip6tables, arptables i ebtables jednym narzędziem z czystszą składnią. W Ubuntu 22.04 i Debian 12 polecenie iptables to tak naprawdę iptables-nft — przekłada stare reguły na nftables w tle. Poniżej kompletny plik konfiguracyjny nftables dla serwera WWW:

# /etc/nftables.conf - kompletna konfiguracja dla serwera WWW

flush ruleset

table inet filter {

  # Zestaw do blokowania IP (mozna dodawac dynamicznie)
  set blocklist {
    type ipv4_addr
    flags dynamic, timeout
    timeout 1h
  }

  chain input {
    type filter hook input priority 0; policy drop;

    # Loopback
    iif lo accept

    # Istniejace polaczenia
    ct state established,related accept

    # Odrzuc niepoprawne pakiety
    ct state invalid drop

    # SSH — rate limit: max 10 nowych polaczen/min per IP, potem block
    tcp dport 22 ct state new \
      meter ssh_meter { ip saddr timeout 1m limit rate over 10/minute } \
      add @blocklist { ip saddr timeout 1h } drop
    ip saddr @blocklist drop
    tcp dport 22 ct state new accept

    # HTTP i HTTPS
    tcp dport { 80, 443 } ct state new accept

    # ICMP ping (IPv4 i IPv6)
    icmp type echo-request limit rate 5/second accept
    icmpv6 type echo-request limit rate 5/second accept

    # Odrzuc reszta
    log prefix "nft-drop: " flags all
  }

  chain forward {
    type filter hook forward priority 0; policy drop;
  }

  chain output {
    type filter hook output priority 0; policy accept;
  }

}

# Zastosuj konfiguracje
# sudo nft -f /etc/nftables.conf
# sudo systemctl enable --now nftables

Migracja z iptables do nftables

# Eksport istniejacych regul iptables do formatu nftables
iptables-save > /tmp/iptables.rules
iptables-restore-translate -f /tmp/iptables.rules > /etc/nftables.conf

# Sprawdz wygenerowany plik (moze wymagac recznej korekty)
cat /etc/nftables.conf

# Przetestuj bez aplikowania (dry-run)
nft -c -f /etc/nftables.conf

# Zastosuj
sudo nft -f /etc/nftables.conf

# Wylacz iptables (jezeli chcesz przejsc w pelni na nftables)
sudo systemctl disable --now iptables
sudo systemctl enable --now nftables

# Przydatne polecenia nftables diagnostyczne
sudo nft list ruleset           # Wyswietl wszystkie reguly
sudo nft list tables            # Lista tabel
sudo nft list chain inet filter input   # Tylko lancuch input
sudo nft monitor                # Monitor zdarzen w czasie rzeczywistym

Najczęstsze pytania

Czym różni się iptables od nftables? +
iptables to klasyczne narzędzie do zarządzania filtrami pakietów w Linuksie (netfilter), dostępne od lat 90. nftables to jego następca wprowadzony w jądrze 3.13 (2014): jedno narzędzie zamiast iptables/ip6tables/arptables/ebtables, lepsza składnia, wyższa wydajność dla dużych zestawów reguł i natywne wsparcie dla map/zestawów (sets). W Ubuntu 22.04+ i Debian 12+ nftables jest domyślnym backendem — iptables jest aliasem do iptables-nft.
Jak sprawdzić aktualne reguły firewall na VPS? +
Dla iptables: sudo iptables -L -n -v --line-numbers (plus ip6tables dla IPv6). Dla nftables: sudo nft list ruleset. Dla UFW (frontend do iptables/nftables): sudo ufw status verbose. Reguły iptables są przechowywane w pamięci i giną przy restarcie — utrwal je przez iptables-save > /etc/iptables/rules.v4 lub użyj narzędzia netfilter-persistent (Debian/Ubuntu).
Jak zablokować atak DDoS rate limitingiem w iptables? +
Użyj modułu hashlimit lub limit. Przykład blokowania więcej niż 25 nowych połączeń HTTP na sekundę z jednego IP: iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m hashlimit --hashlimit-above 25/second --hashlimit-burst 50 --hashlimit-mode srcip --hashlimit-name http_flood -j DROP. Dla skuteczniejszej ochrony warstwę rate limitingu najlepiej umieścić na poziomie Nginx (limit_req_zone) lub Cloudflare.
Jak trwale zapisać reguły iptables po restarcie? +
Na Debian/Ubuntu: sudo apt install netfilter-persistent iptables-persistent. Po konfiguracji reguł: sudo netfilter-persistent save. Reguły są zapisywane do /etc/iptables/rules.v4 i /etc/iptables/rules.v6 i wczytywane automatycznie przy starcie. Alternatywnie możesz użyć pre-up w /etc/network/interfaces lub skryptu w /etc/rc.local, ale netfilter-persistent jest rekomendowaną metodą.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.