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