Basta scrivere regole iptables a mano
Chi gestisce firewall Linux ci è passato: 20 minuti per scrivere una regola iptables, un errore di battitura nel nome della chain, SSH perso. Poi tocca andare in sala server o sperare che la console funzioni.
La sintassi di iptables è potente ma non perdona. Basta un errore nell'ordine delle regole e il firewall che hai costruito con cura fa l'opposto di quello che volevi.
I 5 errori che fanno tutti
1. Dimenticare conntrack nella prima regola
# Sbagliato: blocca il traffico di ritorno delle connessioni già stabilite
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Giusto: prima accetta le connessioni già stabilite
iptables -P INPUT DROP
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Senza conntrack ogni pacchetto TCP ACK viene scartato. La sessione SSH cade nel momento in cui applichi le regole.
2. Ordine delle regole sbagliato
iptables legge le regole dall'alto in basso e vince la prima che corrisponde:
# Sbagliato: il DROP non scatta mai perché l'ACCEPT corrisponde prima
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 22 -j DROP
# Giusto: prima restringi, poi consenti
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
3. Non salvare le regole
# Le regole spariscono al riavvio
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Rendile persistenti con iptables-persistent
apt install iptables-persistent
netfilter-persistent save
4. Ignorare IPv6
Hai chiuso IPv4 ma hai lasciato IPv6 completamente aperto:
# Controlla: se vedi solo le regole di default, hai un problema
ip6tables -L -n
Ogni regola iptables deve avere la sua controparte ip6tables. In alternativa imposta la policy di default a DROP.
5. Loggare tutto (e riempire il disco)
# Su un server trafficato riempie /var/log in poche ore
iptables -A INPUT -j LOG --log-prefix "DROPPED: "
# Meglio: log con rate limit
iptables -A INPUT -m limit --limit 5/min --limit-burst 10 \
-j LOG --log-prefix "DROPPED: "
iptables -A INPUT -j DROP
Set di regole comuni che nessuno ricorda a memoria
Web server di base
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Gateway NAT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
Rate limit su SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
La via visuale: il Firewall Builder di NetForge
Invece di ricordare la sintassi, usa il builder visuale di regole di NetForge:
- Scegli la chain (INPUT, OUTPUT, FORWARD)
- Scegli protocollo, porta, sorgente e destinazione
- Scegli l'azione (ACCEPT, DROP, REJECT, LOG)
- Clicca "Aggiungi regola"
- Esporta come script iptables o nftables
Funzioni:
- Parser iptables/nftables: incolli le regole che hai già, le modifichi in modo visuale e le riesporti
- Generatore ipset: geo-blocking per paese con database CIDR aggiornati in automatico
- Template pronti: web server, gateway NAT, host Docker, server VPN
- IPv4 + IPv6: genera entrambi in un colpo solo
- Convertitore nftables: incolli regole iptables e ottieni l'equivalente nftables
iptables o nftables: quale usare?
Su Debian 11+ o Ubuntu 22.04+ il backend di default è nftables. I comandi iptables funzionano ancora tramite il layer di compatibilità, ma la sintassi nativa di nftables è più pulita:
| iptables | nftables |
|---|---|
| -A INPUT -p tcp --dport 22 -j ACCEPT | tcp dport 22 accept |
| -t nat -A POSTROUTING -j MASQUERADE | masquerade |
| Comandi separati per v4/v6 | Un'unica family inet per entrambi |
NetForge genera entrambi i formati dalle stesse regole visuali.
Prova NetForge
Builder visuale di regole firewall con export iptables/nftables. Niente cloud, gira sulla tua macchina.
Scopri NetForge