NetForge

Security & Infrastructure Toolkit

NetForge is a desktop-first dashboard. Open it from a browser on PC or Mac for the full experience.

NetForge è una dashboard pensata per desktop. Aprila da un browser su PC o Mac per l'esperienza completa.

netforge.it
· ·
Rete locale
Caricamento...
Database locali
Caricamento...
This product uses the NVD API but is not endorsed or certified by the NVD. This product includes GeoLite2 data created by MaxMind, available from https://www.maxmind.com.
Servizi Esterni API esterne
Premi "Verifica connettivita'" per controllare i servizi
Chiamate esterne
NetForge

Incolla l'output di iptables-save o ipset list

Nuova Regola

Match Extensions

Anteprima comando

iptables -A INPUT -j ACCEPT

Crea / Modifica Set

Incolla l'output di nft list ruleset

Nuova Regola nftables


                            

Incolla il ruleset iptables-save da analizzare

18 controlli automatici: policy, loopback, conntrack, SSH, ICMP, anti-spoofing, logging, porte pericolose, SYN flood, port scan e altro. Score 0-100 con raccomandazioni.

Rileva regole oscurate (shadowed), irraggiungibili, duplicate, contraddittorie e problemi di ordinamento.

Visualizza il flusso dei pacchetti attraverso le catene reali del tuo ruleset: quante regole per catena, policy, target usati, salti a catene utente.

Convertitore iptables ↔ nftables

Incolla un ruleset iptables-save o nft list ruleset e convertilo nell'altro formato.


        

Confronta Ruleset

Confronta due configurazioni iptables-save per trovare le differenze.

Simulatore Pacchetto

Simula il percorso di un pacchetto attraverso le regole del firewall.

Attributi del pacchetto

Ruleset (iptables-save)

Template Firewall

Configurazioni pronte all'uso per scenari comuni. Disponibili in formato iptables e nftables.

Calcolatore Subnet IPv4 / IPv6

IPv4

IPv6

Scanner nmap - Testa il Firewall

Scansiona un target prima e dopo aver applicato le regole firewall per verificare che funzionino correttamente.

Configurazione scan

Istruzioni

1. Configura target e porte
2. Clicca "Scan PRIMA" per registrare lo stato attuale
3. Applica le tue regole firewall sul server
4. Clicca "Scan DOPO" per verificare
5. Clicca "Confronta" per vedere le differenze

Audit Completo

Analisi completa di un target con score globale A-F. Seleziona i moduli da eseguire.

Whois & AXFR

Proprietario dominio, registrar, date creazione/scadenza, name servers, DNSSEC, ASN (per IP).

Reverse DNS

Risoluzione inversa da IP a hostname (record PTR). Inserisci uno o più IP, uno per riga.

Analisi DNS

Query multi-resolver con confronto propagazione. 16 tipi di record, 7 resolver (5 standard + 2 con filtro sicurezza/famiglia) + custom.

WAF & CDN Detection

Rileva Web Application Firewall e CDN: Cloudflare, AWS WAF, Akamai, Sucuri, Imperva, ModSecurity, Fastly e altri.

Cos'e': un WAF (Web Application Firewall) filtra il traffico HTTP e blocca attacchi come SQL injection e XSS prima che raggiungano il server. Un CDN (Content Delivery Network) distribuisce i contenuti e puo' nascondere l'IP reale del server.
Cosa controlla: presenza di WAF/CDN noti (Cloudflare, AWS CloudFront, Akamai, Sucuri, Imperva, ModSecurity) analizzando header, cookie e comportamento delle risposte.
Perche' e' utile: sapere se c'e' un WAF aiuta a capire il livello di protezione. Se non c'e', il server e' esposto direttamente agli attacchi.

Web Security Audit

Cookie security, CORS misconfiguration, HTTP methods pericolosi. Audit completo o singoli check.

Cos'e': tre controlli di sicurezza HTTP fondamentali. Cookie: verifica che i cookie siano protetti. CORS: controlla chi puo' fare richieste cross-origin. HTTP Methods: verifica se metodi pericolosi sono attivi.
Cosa controlla: Cookie (flag HttpOnly, Secure, SameSite), CORS (Access-Control-Allow-Origin, credenziali), Methods (PUT, DELETE, TRACE, OPTIONS attivi).
Rischio: Cookie senza HttpOnly = furto via XSS. CORS permissivo = qualsiasi sito puo' leggere i dati. TRACE attivo = Cross-Site Tracing.
Protezione: Cookie: HttpOnly + Secure + SameSite=Strict. CORS: whitelist domini specifici, mai wildcard con credenziali. Methods: disabilitare PUT, DELETE, TRACE nel web server.

Technology Detector

Rileva tecnologie web: server, linguaggio, CMS, framework JS, analytics, CDN, e-commerce, font.

Cos'e': rileva le tecnologie usate dal sito — web server, linguaggio backend, CMS, framework JavaScript, analytics, CDN, font, e-commerce — analizzando header HTTP, HTML, script e cookie.
Cosa controlla: software con versione (es. jQuery 3.6.0, WordPress 6.4, PHP 8.1), confrontato con il database CVE per vulnerabilita' note.
Perche' e' utile: conoscere lo stack tecnologico aiuta a identificare superfici di attacco e software obsoleto. Ogni tecnologia con versione nota viene controllata per CVE.

Compliance Check

Verifica conformita' GDPR, PCI DSS, OWASP: cookie consent, TLS, security headers, DNSSEC, security.txt.

Cos'e': verifica la conformita' del sito a standard di sicurezza e privacy: GDPR (privacy europea), PCI DSS (pagamenti con carta), OWASP (sicurezza web).
Cosa controlla: GDPR (cookie consent, privacy policy, P3P), PCI DSS (TLS 1.2+, cipher forti, HSTS), OWASP Top 10 Headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy, CSP).
Rischio: non conformita' = sanzioni legali (GDPR fino al 4% del fatturato), impossibilita' di processare pagamenti (PCI DSS), vulnerabilita' web note (OWASP).

Robots.txt & Sitemap Analyzer

Analizza robots.txt e sitemap.xml: regole di accesso, path nascosti, URL indicizzati.

Cos'e': robots.txt e' un file che indica ai motori di ricerca quali pagine non indicizzare. La sitemap.xml elenca tutte le pagine del sito.
Cosa controlla: presenza di robots.txt, path nascosti o sensibili (es. /admin/, /backup/, /api/), regole Disallow, presenza e dimensione della sitemap.
Rischio: un robots.txt che elenca path come /admin/ o /backup/ li rende piu' facili da trovare per un attaccante — e' una mappa del sito sensibile.
Consiglio: non elencare path sensibili nel robots.txt. Proteggi le aree admin con autenticazione, non con l'oscuramento.

CSP Analyzer

Analisi Content Security Policy: rileva unsafe-inline, unsafe-eval, wildcard, direttive mancanti. Spiegazioni e fix per ogni problema.

Cos'e': Content Security Policy e' un header HTTP che dice al browser da dove puo' caricare risorse (script, stili, immagini, font). Previene attacchi XSS limitando l'esecuzione di codice non autorizzato.
Cosa controlla: presenza dell'header CSP, direttive unsafe-inline e unsafe-eval (pericolose), wildcard (*), mancanza di direttive importanti (default-src, script-src, object-src).
Rischio: senza CSP, un attaccante che inietta codice (XSS) puo' eseguire qualsiasi script nel browser della vittima — rubare cookie, sessioni, dati.
Protezione: implementare CSP con direttive restrittive. Evitare unsafe-inline (usare nonce o hash). Evitare wildcard. Testare con Content-Security-Policy-Report-Only prima di attivare.

Analisi SSL/TLS

Analisi completa protocolli, cipher suite, catena certificati, vulnerabilita', grading A-F.

Cos'e': SSL/TLS e' il protocollo che cifra la comunicazione tra browser e server. Senza SSL, tutto il traffico (password, dati personali, cookie) viaggia in chiaro e puo' essere intercettato.
Cosa controlla: versioni protocollo (TLS 1.0/1.1 deprecati, TLS 1.2/1.3 sicuri), cipher suite (algoritmi di cifratura), certificato (scadenza, catena, SAN), HSTS, OCSP stapling, redirect HTTP→HTTPS.
Rischio: intercettazione dati (man-in-the-middle), furto credenziali, downgrade attack, certificato scaduto che blocca l'accesso.
Protezione: disabilitare TLS 1.0/1.1, usare solo cipher moderni (AES-GCM, ChaCha20), certificato valido con catena completa, HSTS con max-age lungo.

Fingerprinting Servizi

Rileva web server, CMS, path sensibili, CVE note, suggerimenti hardening.

Cos'e': il fingerprinting identifica software e versioni in esecuzione sul server (web server, CMS, linguaggio, database) analizzando header, path esposti e risposte HTTP. Le versioni rilevate vengono confrontate con il database CVE (vulnerabilita' note).
Cosa controlla: versione web server (nginx, Apache, IIS), CMS (WordPress, Joomla), linguaggio (PHP, Node.js), path sensibili (.git, .env, phpinfo), pannelli admin esposti.
Rischio: software non aggiornato con vulnerabilita' note = accesso non autorizzato, esecuzione codice remoto, furto dati.
CVE: Le CVE vengono scaricate dal NVD (National Vulnerability Database), il database ufficiale del NIST che cataloga tutte le falle di sicurezza note. Aggiorna periodicamente per avere le ultime CVE.
Ricerca vulnerabilita'
Fonti:

Port Scanner

Scansiona le porte di un host. Mostra servizi aperti, chiusi e filtrati. Non richiede nmap.

Cos'e': scansiona le porte TCP di un host per identificare i servizi in ascolto. Ogni porta aperta e' un potenziale punto di ingresso.
Cosa controlla: 25 porte comuni (SSH, HTTP, HTTPS, FTP, SMTP, MySQL, PostgreSQL, Redis, MongoDB, RDP, VNC...). Per ogni porta aperta cattura il banner del servizio e la versione, poi controlla le CVE note.
Rischio: servizi esposti su internet (database, admin panel, VNC) senza necessita' = superficie di attacco enorme. Un Redis o MongoDB esposto senza password e' accesso diretto ai dati.
Protezione: esporre solo le porte necessarie (80, 443, 22). Tutto il resto dietro firewall o VPN. Mai esporre database o cache su internet.

Identita' Esterna

IP pubblico v4/v6, PTR reverse, ASN, ISP, localita'. Rileva la tua identita' in rete o analizza un IP.

Analisi Posta

SPF, DKIM, DMARC, server MX, blacklist RBL, STARTTLS. Verifica la sicurezza della posta del dominio.

Cos'e': verifica la configurazione email del dominio — SPF, DKIM e DMARC sono meccanismi che autenticano le email e prevengono lo spoofing (invio email false a nome tuo).
Cosa controlla: record SPF (chi puo' inviare email per il dominio), DKIM (firma crittografica), DMARC (policy in caso di fallimento), server MX, blacklist RBL (10 server), STARTTLS (cifratura SMTP).
Rischio: senza SPF/DKIM/DMARC chiunque puo' inviare email fingendo di essere il tuo dominio — phishing, truffe, danno reputazionale. Blacklist = le tue email finiscono in spam.
Protezione: configurare SPF (v=spf1 ... -all), DKIM con chiave 2048 bit, DMARC con p=reject, STARTTLS sul server SMTP.

Geolocalizzazione IP

Localizza IP e hostname: coordinate, paese, citta', ISP, ASN, timezone. Rileva proxy, VPN, hosting e connessioni mobile. Supporta lookup singolo, bulk e calcolo distanza.

Subdomain Discovery

Scopri sottodomini di un dominio usando due metodi: dizionario DNS (500 prefissi comuni, istantaneo) e Certificate Transparency Logs tramite crt.sh (quando disponibile). Rileva sottodomini sospetti (staging, admin, dev), IP privati esposti e certificati scaduti.

La ricerca DNS (dizionario) restituisce risultati immediati. crt.sh puo' essere lento o non disponibile — in quel caso i risultati saranno solo da DNS. Per una copertura completa, usa la Scansione Multi-Host con la tua zona DNS.

Scansione Completa

Scansiona host da file zona DNS o lista manuale. Analisi DNS, SSL, fingerprint in tempo reale.

Trascina qui il file zona DNS

Formato BIND (da named, PowerDNS export, dig axfr). Oppure clicca per selezionare.

Cosa analizzare

Open Redirect Checker

Testa parametri di redirect comuni per verificare se il sito permette redirect aperti verso domini esterni.

Cos'e': un open redirect e' una vulnerabilita' in cui il sito accetta un parametro URL (es. ?redirect=) e reindirizza l'utente verso qualsiasi indirizzo esterno senza validazione.
Come si sfrutta: l'attaccante invia un link tipo https://tuosito.com/login?next=https://phishing.com — la vittima vede il tuo dominio, si fida, clicca e finisce su un sito di phishing che imita la pagina di login.
Rischio: phishing mirato, furto credenziali, bypass filtri antispam (il link sembra legittimo), distribuzione malware.
Protezione: validare il parametro di redirect lato server. Accettare solo URL relativi (/pagina) o una whitelist di domini autorizzati.

Clickjacking Test

Verifica se il sito e' protetto dal clickjacking (X-Frame-Options, CSP frame-ancestors).

Cos'e': il clickjacking e' un attacco in cui una pagina malevola carica il tuo sito in un iframe invisibile. L'utente crede di interagire con la pagina dell'attaccante ma in realta' clicca su elementi del tuo sito.
Come si sfrutta: l'attaccante sovrappone un iframe trasparente del tuo sito a un pulsante tipo "Vinci un premio". L'utente clicca il premio ma in realta' clicca "Conferma trasferimento" sulla tua banca.
Rischio: azioni non autorizzate (acquisti, trasferimenti, cambio password), furto click, like/follow forzati.
Protezione: il server deve inviare X-Frame-Options: DENY e Content-Security-Policy: frame-ancestors 'none'. Se il sito deve essere in iframe dello stesso dominio, usare SAMEORIGIN e frame-ancestors 'self'.

Certificati x509

Decodifica, valida catena, genera CSR, converti formati.

Email Header Analyzer

Incolla gli header di un'email per tracciare il percorso e verificare SPF/DKIM/DMARC.

Hash Generator & Identifier

Genera hash da testo o identifica un hash sconosciuto.


Encoder / Decoder

Codifica e decodifica: Base64, URL, HTML entities, Hex, ROT13.

JWT / JWE Decoder

Decodifica JWT (3 parti, payload in chiaro) e JWE (5 parti, payload cifrato). Per JWE inserisci la chiave per decifrare.

Timestamp Converter

Converti tra Unix epoch e data leggibile. Supporta secondi, millisecondi, ISO 8601.

SSH Tools

Audit configurazioni sshd_config e generatore chiavi SSH.

VPN Tools

Audit configurazioni OpenVPN e WireGuard. Generatore WireGuard con chiavi e config pronte.

DNS Sicuro (BIND + RPZ)

Genera configurazione BIND9 completa con RPZ (DNS filtering), DDNS per client VPN e logging strutturato. Alberatura Debian. Funziona con OpenVPN e WireGuard.

NetForge OVPN Reports (gratuito) — Dashboard di analisi per log DNS e VPN generati da questa configurazione. Statistiche query, blocchi RPZ, connessioni client, geolocalizzazione.
sudo dpkg -i netforge-ovpn-reports_1.0_all.deb — Info: ovpn.netforge.it
Attenzione: I file generati sovrascrivono la configurazione BIND esistente. Su server gia' in produzione integrare le sezioni a mano. Lo script setup-bind.sh va usato solo su prima installazione.
Sovrascrive i blocchi dei feed RPZ. Utile per falsi positivi.

SSL Config Generator

Genera configurazione SSL/TLS ottimizzata per il tuo web server basata sulle linee guida Mozilla. Scarica il file pronto all'uso.

Powered by Mozilla SSL Configuration Guidelines (MPL-2.0)

AppArmor Generator

Genera profili AppArmor per servizi Linux. Seleziona un preset o configura manualmente capabilities, path e regole di rete. Il profilo generato va copiato su /etc/apparmor.d/ del server target.

Attenzione: Testare sempre in modalita' complain prima di passare a enforce. Un profilo errato puo' bloccare il servizio.
Preset servizi comuni
Caricamento...
Capabilities
Abstractions
Path Rules
r=leggi   w=scrivi   rw=lettura+scrittura   rax=esegui   ix=eredita profilo   ux=esegui non confinato
Network
Se nessuno selezionato: deny network — nessun accesso di rete
Deny espliciti
Path da negare esplicitamente (sovrascrivono regole permissive)

Scansione Completa LAN

Scansione completa della rete locale in un click: host attivi, porte, DHCP, identita' esterna, velocita' e topologia. Richiede accesso alla rete locale (no VPN).

IoT Security Audit

Audit sicurezza dispositivi IoT: telecamere IP, DVR/NVR, smart home, sensori, stampanti di rete. Verifica porte, RTSP, credenziali default, UPnP.

Packet Sniffer

Cattura e analisi pacchetti di rete in tempo reale. Rilevamento automatico di ARP Poisoning, DHCP Rogue, DNS Spoofing, SYN Flood e Port Scan.

Come funziona
1. Seleziona l'interfaccia di rete e la durata, poi clicca Avvia. Serve sudo per catturare pacchetti.
2. I pacchetti appaiono in tempo reale, colorati per protocollo (verde=HTTP, blu=DNS, arancione=ARP, viola=SSH, rosso=IoT).
3. Usa i filtri per mostrare/nascondere protocolli in tempo reale, senza riavviare la cattura.
4. Il pulsante Anomalie mostra solo gli attacchi rilevati (ARP Poisoning, DHCP Rogue, DNS Spoofing, SYN Flood, Port Scan).
5. Promiscua: se attiva, cattura tutto il traffico sulla rete (non solo il tuo). Richiede accesso alla rete locale.
6. Esporta i risultati in PDF o CSV per il report.
Rilevamento attacchi
Il motore di analisi esamina ogni pacchetto in tempo reale e segnala automaticamente questi pattern:

⚠ CRITICO
ARP Poisoning — il MAC associato a un IP cambia durante la cattura: qualcuno sta reindirizzando il traffico della rete (attacco man-in-the-middle).
DHCP Rogue Server — risposte DHCP arrivano da più server: un host non autorizzato sta assegnando IP e può dirottare gateway e DNS.

⚠ ALTO
ARP Flood — oltre 50 ARP/sec dallo stesso MAC: saturazione della tabella ARP degli switch (ARP cache flooding).
Gratuitous ARP — un host annuncia il proprio IP senza che nessuno lo abbia chiesto: tecnica tipica di spoofing pre-attacco.
DNS Spoofing — risposta DNS arriva da un host diverso dal gateway: possibile intercettazione o falso resolver.
SYN Flood — oltre 50 SYN verso lo stesso IP in 10 secondi: tentativo di saturare le connessioni TCP (DoS).

ⓘ MEDIO
ARP Scan — 15+ richieste ARP dallo stesso MAC in poco tempo: reconnaissance della rete locale (tipico di scanner o IoT hub).
Port Scan — stesso IP tocca più di 10 porte distinte in 5 secondi: enumerazione dei servizi esposti.

Gli attacchi vengono mostrati nella sezione rossa in cima durante la cattura, indipendentemente dal filtro protocollo attivo.
Guida filtri BPF
Filtri BPF (Berkeley Packet Filter) — scrivi nel campo custom e clicca Applica.

Per host:
host 192.168.0.1 — tutto il traffico da/verso un IP
src host 192.168.0.50 — solo traffico in uscita da un IP
dst host 10.0.0.1 — solo traffico verso un IP

Per porta:
port 80 — traffico HTTP
port 443 — traffico HTTPS
portrange 8000-8100 — range di porte

Per protocollo:
tcp — solo TCP
udp — solo UDP
icmp — solo ping/ICMP
arp — solo ARP

Combinazioni (and/or/not):
host 192.168.0.50 and port 80 — HTTP di un host
tcp and not port 443 — TCP escluso HTTPS
src net 192.168.0.0/24 — traffico dalla subnet locale
arp or icmp — ARP e ping insieme
dst host 192.168.0.1 and tcp port 53 — query DNS verso il gateway

Outbound Watch

Connessioni uscenti per processo con geolocalizzazione. Rivela quali processi del sistema comunicano con l'esterno e verso dove.

Puoi usare questo pannello per verificare che NetForge stesso non faccia uscire dati non dichiarati. Le uniche connessioni attese da NetForge sono quelle elencate nella sezione Servizi Esterni in home (crt.sh, NVD, ipify, ecc.). I processi NetForge sono evidenziati in tabella.

Network Scanner

Scansiona la rete: host attivi, porte aperte, MAC address con riconoscimento vendor/marca. Lascia il campo subnet vuoto per rilevare automaticamente la rete locale, oppure inserisci una subnet CIDR (es. 10.10.5.0/24) per scansionare reti remote.
Su subnet remote: MAC address e vendor non disponibili (ARP non attraversa il router), mDNS assente, rilevamento ARP spoofing disabilitato. Ping sweep e port scan funzionano su qualsiasi subnet raggiungibile.

Proxy & Tor Detector

Rileva proxy aperti (SOCKS4/5, HTTP), nodi di uscita Tor. Scansiona singolo host o intera rete locale.

Scansiona tutte le macchine della rete locale cercando porte proxy aperte e nodi Tor. Usa nmap se disponibile.

Visual Traceroute

Traccia il percorso di rete verso qualsiasi host. Mostra ogni hop con latenza, ASN/ISP, paese e rilevamento IP privati.

iperf3 Bandwidth Test

Misura throughput reale tra due endpoint. Compatibile con pfSense, OPNsense, Linux, Windows, macOS.

DHCP Server / Relay Finder

Rileva server DHCP sulla rete locale. Utile per trovare DHCP rogue, verificare relay e controllare i parametri offerti (lease, gateway, DNS).

Richiede root/sudo per raw socket (scapy) oppure nmap con capabilities. Funziona solo sulla rete locale (broadcast L2).

Speed Test

Misura velocita' di download, latenza e jitter della tua connessione Internet. Scarica file di test pubblici da 10 endpoint distribuiti su 4 continenti (OVH, Hetzner, CacheFly). NetForge sceglie automaticamente l'endpoint piu' vicino in base alla tua posizione geografica via GeoLite2 locale.

Ping & Port Probe

Ping ICMP e probe TCP/UDP su singola porta. Come telnet/netcat ma dal browser.

Password & htpasswd Generator

Genera password sicure, analizza la forza di una password esistente, e crea file htpasswd per Apache/Nginx.

Architettura Netfilter

Netfilter e' il framework del kernel Linux che gestisce il filtraggio dei pacchetti. iptables e' l'interfaccia userspace per configurarlo.

Flusso dei pacchetti nel kernel

RETE IN PREROUTING raw → mangle → nat (DNAT) Routing Per me? Transito? INPUT mangle → filter Processo locale OUTPUT raw → mangle → nat → filter FORWARD mangle → filter POSTROUTING mangle → nat (SNAT) RETE OUT
Concetto chiave: I pacchetti attraversano le catene in ordine. La prima regola che corrisponde (match) determina l'azione. Se nessuna regola corrisponde, si applica la policy di default della catena.

Tabelle e Catene

Tabella Scopo Catene Uso tipico
filter Filtraggio pacchetti (default) INPUT, FORWARD, OUTPUT ACCEPT, DROP, REJECT
nat Network Address Translation PREROUTING, INPUT, OUTPUT, POSTROUTING SNAT, DNAT, MASQUERADE, REDIRECT
mangle Modifica header pacchetti Tutte e 5 MARK, TOS, TTL, TCPMSS
raw Eccezioni al connection tracking PREROUTING, OUTPUT NOTRACK, CT
security Regole MAC (SELinux) INPUT, FORWARD, OUTPUT SECMARK
Attenzione: I target NAT (SNAT, DNAT, MASQUERADE) funzionano solo nella tabella nat. SNAT solo in POSTROUTING, DNAT solo in PREROUTING/OUTPUT.

Ordine delle Regole

L'ordine delle regole e' fondamentale. Le regole vengono valutate dall'alto verso il basso, e la prima corrispondenza vince.

Ordine raccomandato per la catena INPUT

  1. Loopback — Accetta tutto su lo
  2. Connessioni stabiliteconntrack --ctstate ESTABLISHED,RELATED
  3. Anti-spoofing — Blocca IP privati/riservati sull'interfaccia pubblica
  4. Regole ICMP — Ping e diagnostica con rate limiting
  5. Servizi esposti — SSH, HTTP, HTTPS, DNS, etc.
  6. Rate limiting / protezione brute-force
  7. Logging — Logga pacchetti prima del drop finale
  8. DROP/REJECT finale — Default deny

Esempio ordine corretto

# 1. Loopback
iptables -A INPUT -i lo -j ACCEPT

# 2. Connessioni stabilite (PRIMA di tutto il resto!)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 3. Invalidi
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# 4. Anti-spoofing
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP

# 5. ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# 6. Servizi
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT

# 7. Log
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "FW-DROP: "

# 8. Drop finale
iptables -A INPUT -j DROP
Errore critico: Mettere la regola -j DROP prima delle regole ACCEPT blocchera' tutto il traffico, inclusa la tua sessione SSH!

Best Practice per Firewall Professionali

FARE (Must-Do)

  • Default DENY — Policy INPUT DROP, accettare esplicitamente solo il necessario
  • Stateful firewall — Usare sempre conntrack per accettare ESTABLISHED,RELATED all'inizio
  • DROP INVALID — Scartare immediatamente pacchetti INVALID
  • Loopback — Accettare sempre il traffico su lo
  • Rate limiting su SSH — Protezione brute-force con recent, limit o hashlimit
  • Logging prima del DROP — Loggare con rate limit per diagnostica
  • Anti-spoofing — Bloccare IP privati/bogon sull'interfaccia pubblica
  • Principio del minimo privilegio — Aprire solo le porte strettamente necessarie
  • Persistenza — Salvare le regole con iptables-save o servizio
  • Documentare — Usare -m comment --comment "descrizione"

NON FARE (Anti-Pattern)

  • Policy ACCEPT + DROP manuale — Se dimentichi una regola, il traffico passa
  • -s 0.0.0.0/0 -j ACCEPT — Accettare qualsiasi sorgente senza filtri
  • Regole duplicate — Spreco di risorse e confusione nel debug
  • Usare -m state — Deprecato, usare -m conntrack --ctstate
  • REJECT su tutto — Espone informazioni. DROP e' piu' sicuro per l'esterno
  • Logging senza rate limit — Riempie i log e puo' causare DoS
  • Dimenticare OUTPUT — Su server critici, filtrare anche l'uscita
  • Usare IP invece di ipset — Per liste >10 IP, ipset e' drasticamente piu' efficiente
  • Testare in produzione — Usare un cron job di ripristino come safety net
  • Ignorare IPv6 — Se non usi IPv6, bloccalo con ip6tables

Hardening del Server

Parametri sysctl consigliati

# Abilita protezione SYN flood
net.ipv4.tcp_syncookies = 1

# Disabilita source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# Disabilita ICMP redirect
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# Abilita reverse path filtering (anti-spoofing)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Logga pacchetti marziani (IP impossibili)
net.ipv4.conf.all.log_martians = 1

# Ignora ICMP broadcast (anti-smurf)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Ignora ICMP bogus error responses
net.ipv4.icmp_ignore_bogus_error_responses = 1

# IP forwarding (solo se fai routing/NAT)
net.ipv4.ip_forward = 1

# Disabilita IPv6 se non usato
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Anti-spoofing con bogon list

# Blocca IP privati/riservati sull'interfaccia pubblica (eth0)
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP    # Link-local
iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP       # Multicast
iptables -A INPUT -i eth0 -s 240.0.0.0/4 -j DROP       # Riservato
iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP         # "This network"
iptables -A INPUT -i eth0 -s 100.64.0.0/10 -j DROP     # Shared address (CGNAT)
iptables -A INPUT -i eth0 -s 192.0.0.0/24 -j DROP      # IANA special
iptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP      # TEST-NET-1
iptables -A INPUT -i eth0 -s 198.51.100.0/24 -j DROP   # TEST-NET-2
iptables -A INPUT -i eth0 -s 203.0.113.0/24 -j DROP    # TEST-NET-3
Consiglio: Per liste lunghe come i bogon, usa un ipset hash:net per efficienza O(1) invece di regole lineari O(n).

NAT e Port Forwarding

SNAT vs MASQUERADE

Caratteristica SNAT MASQUERADE
IP sorgente Fisso (specificato) Dinamico (dall'interfaccia)
Performance Migliore (lookup diretto) Leggermente inferiore (lookup interfaccia)
Uso ideale IP statico IP dinamico (DHCP, PPPoE)
Catena POSTROUTING POSTROUTING

Port Forwarding completo

# Prerequisito: abilitare IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# DNAT: redireziona porta 8080 esterna verso web server interno
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
    -j DNAT --to-destination 192.168.1.100:80

# Permettere il forwarding del traffico NATtato
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 \
    -d 192.168.1.100 -m conntrack --ctstate NEW -j ACCEPT

# SNAT/MASQUERADE per il traffico di ritorno
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

# Forwarding bidirezionale con stato
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Ricorda: Il port forwarding richiede tre componenti: la regola DNAT, la regola FORWARD, e il SNAT/MASQUERADE per il ritorno. Dimenticarne una e' l'errore piu' comune.

Anti-DDoS e Rate Limiting

Protezione SYN Flood

# Limita nuove connessioni TCP per secondo (globale)
iptables -A INPUT -p tcp --syn -m limit --limit 50/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# Per-sorgente con hashlimit (piu' preciso)
iptables -A INPUT -p tcp --syn -m hashlimit \
    --hashlimit-upto 15/s \
    --hashlimit-burst 30 \
    --hashlimit-mode srcip \
    --hashlimit-name syn_flood \
    -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

Protezione brute-force SSH con recent

# Registra nuove connessioni SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
    -m recent --set --name SSH --rsource

# Blocca se piu' di 4 tentativi in 60 secondi
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
    -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource \
    -j DROP

# Accetta le connessioni normali
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

Protezione port scanning

# Catena dedicata per port scan detection
iptables -N PORT_SCAN
iptables -A PORT_SCAN -m recent --set --name portscan --rsource
iptables -A PORT_SCAN -m recent --update --seconds 300 --hitcount 10 --name portscan --rsource -j DROP
iptables -A PORT_SCAN -j RETURN

# Rileva scan su porte comuni non aperte
iptables -A INPUT -p tcp -m multiport --dports 23,135,139,445,1433,3389 \
    -m conntrack --ctstate NEW -j PORT_SCAN

Limite connessioni simultanee per IP

# Max 20 connessioni HTTP per singolo IP
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 \
    --connlimit-mask 32 -j REJECT --reject-with tcp-reset

# Max 50 connessioni per /24
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 \
    --connlimit-mask 24 -j DROP
Consiglio avanzato: Per attacchi DDoS volumetrici (>1Gbps), iptables non basta. Usa XDP/eBPF o soluzioni hardware/cloud (Cloudflare, AWS Shield). iptables e' efficace per attacchi applicativi e brute-force.

Uso efficiente di ipset

ipset permette di gestire insiemi di IP/reti/porte con ricerca O(1) tramite hash. E' molto piu' efficiente di regole iptables multiple.

Quando usare ipset

Scenario Senza ipset Con ipset
Bloccare 1000 IP 1000 regole (O(n) per pacchetto) 1 regola + 1 set (O(1) per pacchetto)
Whitelist paesi Migliaia di regole per i CIDR 1 set hash:net
Blocco IP+porta Regole incrociate complesse 1 set hash:ip,port

Tipi di set comuni

# Blacklist IP singoli
ipset create blacklist hash:ip hashsize 4096 maxelem 100000
ipset add blacklist 1.2.3.4
ipset add blacklist 5.6.7.8 timeout 3600    # scadenza 1h
iptables -A INPUT -m set --match-set blacklist src -j DROP

# Whitelist reti
ipset create trusted_nets hash:net
ipset add trusted_nets 192.168.1.0/24
ipset add trusted_nets 10.0.0.0/8
iptables -A INPUT -m set --match-set trusted_nets src -j ACCEPT

# Blocco IP+porta (es. ban da servizio specifico)
ipset create service_ban hash:ip,port
ipset add service_ban 1.2.3.4,tcp:80
ipset add service_ban 5.6.7.8,tcp:443
iptables -A INPUT -m set --match-set service_ban src,dst -j DROP

# Set con timeout automatico (ban temporanei)
ipset create temp_ban hash:ip timeout 3600 counters
ipset add temp_ban 1.2.3.4 timeout 1800     # 30 minuti
Performance: Con 10.000 IP da bloccare, ipset e' circa 100x piu' veloce di regole iptables lineari. L'overhead di memoria e' minimo (~40 byte per entry).

Aggiornamento atomico dei set

# Metodo sicuro: crea nuovo set, swap, elimina vecchio
ipset create blacklist_new hash:ip
# ... popola blacklist_new ...
ipset swap blacklist blacklist_new
ipset destroy blacklist_new

# Questo evita finestre temporali senza protezione

Logging e Debug

Logging efficace

# SEMPRE con rate limiting (previene riempimento disco/DoS)
iptables -A INPUT -m limit --limit 5/min --limit-burst 10 \
    -j LOG --log-prefix "FW-INPUT-DROP: " --log-level 4

# Log per catena specifica
iptables -N LOG_AND_DROP
iptables -A LOG_AND_DROP -m limit --limit 10/min \
    -j LOG --log-prefix "FW-BLOCKED: " --log-level 4
iptables -A LOG_AND_DROP -j DROP

# Uso:
iptables -A INPUT -p tcp --dport 23 -j LOG_AND_DROP

Analisi log con rsyslog

# /etc/rsyslog.d/iptables.conf
:msg, contains, "FW-" /var/log/firewall.log
& stop

# Rotazione: /etc/logrotate.d/firewall
/var/log/firewall.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

Comandi di debug

# Visualizza regole con contatori
iptables -nvL --line-numbers
iptables -t nat -nvL --line-numbers

# Resetta contatori
iptables -Z

# Traccia pacchetti (debug avanzato)
iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
# Poi: cat /proc/net/nf_log  oppure  dmesg | grep TRACE

# Monitor conntrack in tempo reale
conntrack -E          # eventi
conntrack -L          # lista connessioni
conntrack -C          # conteggio
Attenzione: -j TRACE genera un log per ogni regola attraversata da ogni pacchetto. Usare solo in debug e su traffico filtrato, mai in produzione su tutto.

Persistenza delle Regole

Le regole iptables sono in memoria e si perdono al reboot. Ecco come renderle persistenti.

Debian / Ubuntu

# Installare iptables-persistent
apt install iptables-persistent

# Salva le regole correnti
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# Oppure con il comando
netfilter-persistent save

# Le regole vengono caricate automaticamente al boot

RHEL / CentOS / Rocky

# Con il servizio iptables
systemctl enable iptables
iptables-save > /etc/sysconfig/iptables
ip6tables-save > /etc/sysconfig/ip6tables

# Oppure
service iptables save

Metodo universale: script in /etc/network/if-up.d/

#!/bin/bash
# /etc/network/if-up.d/firewall
iptables-restore < /etc/iptables.rules

Safety net: ripristino automatico

# Prima di testare regole rischiose, programma un ripristino:
iptables-save > /tmp/iptables.backup
echo "iptables-restore < /tmp/iptables.backup" | at now + 5 minutes

# Se tutto funziona, cancella il job:
atrm $(atq | awk '{print $1}')

# Alternativa con systemd:
systemd-run --on-active=300 iptables-restore /tmp/iptables.backup
Regola d'oro: Prima di applicare regole su un server remoto, SEMPRE programmare un rollback automatico. Un errore nelle regole puo' tagliarti fuori dal server.

Errori Comuni e Come Evitarli

1. Chiudersi fuori dal server

iptables -P INPUT DROP
# Ops, non ho aggiunto la regola SSH prima!
# Prima la regola SSH, POI la policy
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP

2. Dimenticare le connessioni stabilite

# Senza stato, ogni pacchetto di ritorno viene valutato
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j DROP
# Il server risponde, ma i pacchetti ACK vengono droppati!
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -j DROP

3. Regola troppo larga

# Accetta TUTTO da qualsiasi IP
iptables -A INPUT -j ACCEPT
# Specifico: protocollo + porta + sorgente
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 \
    -m conntrack --ctstate NEW -j ACCEPT

4. -I vs -A (Insert vs Append)

# -A aggiunge in fondo - dopo il DROP finale non serve
iptables -A INPUT -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT  # Mai raggiunto!
# Usa -I per inserire in posizione specifica
iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
# Oppure: aggiungi le regole nell'ordine corretto dall'inizio

5. NAT senza forwarding

# DNAT senza regola FORWARD = pacchetti droppati
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.0.0.2:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.0.0.2:80
iptables -A FORWARD -p tcp -d 10.0.0.2 --dport 80 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

6. Logging senza limite

# Su un server trafficato, riempie il disco in ore
iptables -A INPUT -j LOG --log-prefix "DROP: "
iptables -A INPUT -m limit --limit 5/min --limit-burst 10 \
    -j LOG --log-prefix "DROP: " --log-level 4

Template Pronti all'Uso

Web Server (HTTP/HTTPS + SSH)

#!/bin/bash
# Template: Web Server con protezione completa
set -e

# Pulizia
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F

# Policy di default
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Catene personalizzate
iptables -N LOG_DROP
iptables -A LOG_DROP -m limit --limit 5/min -j LOG --log-prefix "FW-DROP: " --log-level 4
iptables -A LOG_DROP -j DROP

# 1. Loopback
iptables -A INPUT -i lo -j ACCEPT

# 2. Connessioni stabilite
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# 3. ICMP (limitato)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s --limit-burst 5 -j ACCEPT

# 4. SSH con protezione brute-force
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 5 --name SSH -j LOG_DROP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

# 5. HTTP/HTTPS con connlimit
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW \
    -m connlimit --connlimit-above 50 --connlimit-mask 32 -j LOG_DROP
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT

# 6. Log e drop finale
iptables -A INPUT -j LOG_DROP

echo "Firewall Web Server configurato."

Gateway / Router NAT

#!/bin/bash
# Template: Gateway NAT con 2 interfacce
# eth0 = WAN (pubblica), eth1 = LAN (192.168.1.0/24)
set -e

# Abilita forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Pulizia
iptables -F && iptables -X
iptables -t nat -F && iptables -t nat -X
iptables -t mangle -F

# Policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# === INPUT (per il gateway stesso) ===
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# SSH solo dalla LAN
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT

# DHCP dalla LAN
iptables -A INPUT -i eth1 -p udp --dport 67 -j ACCEPT

# DNS dalla LAN (se il gateway fa da DNS)
iptables -A INPUT -i eth1 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --dport 53 -j ACCEPT

# ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT

iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "GW-INPUT-DROP: "
iptables -A INPUT -j DROP

# === FORWARD (transito LAN <-> WAN) ===
# LAN -> WAN: tutto permesso
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# WAN -> LAN: solo connessioni stabilite
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Anti-spoofing: niente IP privati dalla WAN
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP

# Log forward drops
iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "GW-FWD-DROP: "
iptables -A FORWARD -j DROP

# === NAT ===
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

# === Port forwarding (esempio: web server interno) ===
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.100:80
# iptables -A FORWARD -i eth0 -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

# === MSS Clamping (per PPPoE/VPN) ===
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

echo "Gateway NAT configurato."

Docker Host

#!/bin/bash
# Template: Server con Docker
# ATTENZIONE: Docker modifica iptables autonomamente!
# Queste regole si integrano con Docker, non lo sostituiscono.
set -e

# Catena DOCKER-USER: Docker la rispetta per filtraggio personalizzato
# (Docker gestisce FORWARD e nat autonomamente, NON toccare DOCKER chain)

# === Protezione INPUT del host ===
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

# Docker API (SOLO locale o da rete trusted)
# iptables -A INPUT -p tcp --dport 2376 -s 10.0.0.0/8 -j ACCEPT

# ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s -j ACCEPT

iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "HOST-DROP: "
iptables -P INPUT DROP

# === DOCKER-USER: filtro traffico verso i container ===
# Questa catena viene attraversata da TUTTO il traffico verso i container
# Docker la crea automaticamente, noi aggiungiamo regole

# Permetti traffico dalla rete locale
iptables -I DOCKER-USER -s 192.168.1.0/24 -j ACCEPT

# Permetti connessioni stabilite
iptables -I DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Blocca accesso diretto ai container da IP esterni (esempio)
# iptables -I DOCKER-USER -i eth0 -d 172.17.0.0/16 -j DROP

# IMPORTANTE: lasciare RETURN alla fine di DOCKER-USER
iptables -A DOCKER-USER -j RETURN

echo "Docker host firewall configurato."
echo "NOTA: Le porte esposte con -p nei container sono gestite da Docker."
echo "Usa DOCKER-USER per filtraggio aggiuntivo."
Docker e iptables: Docker manipola direttamente le catene FORWARD e nat. Non cancellare le catene DOCKER, DOCKER-ISOLATION, DOCKER-USER. Usa DOCKER-USER per aggiungere le tue regole di filtraggio.

Server Minimale (solo SSH)

#!/bin/bash
# Template minimo per server appena installato
set -e
iptables -F && iptables -X

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 -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
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
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "FW: "
iptables -A INPUT -j DROP

Connection Tracking in Profondita'

Stati del connection tracking

Stato Significato Uso tipico
NEW Primo pacchetto di una nuova connessione Filtrare in base a servizio/porta
ESTABLISHED Parte di connessione gia' vista bidirezionalmente Accettare sempre (regola in cima)
RELATED Correlata a connessione esistente (es. FTP data, ICMP error) Accettare con ESTABLISHED
INVALID Non associabile a nessuna connessione Sempre DROP (possibili attacchi)
UNTRACKED Esplicitamente escluso dal tracking (con -j NOTRACK) Server ad altissimo traffico

Ottimizzazione conntrack per server ad alto traffico

# Aumenta tabella conntrack (default: 65536)
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max

# Ridurre timeout per connessioni non piu' attive
echo 600 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
echo 30 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
echo 120 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait

# Monitora l'uso
cat /proc/sys/net/netfilter/nf_conntrack_count   # connessioni attive
cat /proc/sys/net/netfilter/nf_conntrack_max     # massimo

# NOTRACK per servizi stateless ad alto volume (es. DNS server)
iptables -t raw -A PREROUTING -p udp --dport 53 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 53 -j NOTRACK

CT Helpers (ALG - Application Layer Gateway)

# FTP attivo richiede il helper per tracciare la connessione dati
modprobe nf_conntrack_ftp

# Assegna il helper esplicitamente (best practice moderna)
iptables -t raw -A PREROUTING -p tcp --dport 21 -j CT --helper ftp

# SIP (VoIP)
modprobe nf_conntrack_sip
iptables -t raw -A PREROUTING -p udp --dport 5060 -j CT --helper sip

# TFTP
modprobe nf_conntrack_tftp
iptables -t raw -A PREROUTING -p udp --dport 69 -j CT --helper tftp
Sicurezza: Dal kernel 4.7+, i CT helper non vengono piu' assegnati automaticamente. Devi abilitarli esplicitamente con -j CT --helper nella tabella raw. Questo e' piu' sicuro.

nftables: Perche' e Differenze

Perche' nftables?

iptables ha servito il mondo Linux per oltre 20 anni, ma presenta limiti strutturali che hanno portato allo sviluppo di nftables:

Problema di iptablesCome nftables lo risolve
4 tool separati: iptables, ip6tables, arptables, ebtables, ognuno con la propria sintassi e le proprie tabelle kernel 1 solo tool (nft) con famiglie: ip, ip6, inet (entrambi), arp, bridge, netdev
Aggiornamento atomico impossibile: ogni regola e' una syscall separata. Con 500 regole = 500 syscall, con finestra di inconsistenza Aggiornamento atomico nativo: l'intero ruleset viene inviato al kernel in una sola operazione Netlink
Match extension come moduli kernel: ogni -m modulo richiede un modulo kernel separato (conntrack, limit, multiport, etc.) Espressioni generiche nella VM: nftables compila le regole in bytecode eseguito da una VM nel kernel. Nessun modulo extra necessario
Tabelle fisse: filter, nat, mangle, raw, security - non puoi crearne di nuove o rinominarle Tabelle utente: crei le tabelle che vuoi, con i nomi che vuoi. L'hook (input, forward, etc.) e' sulla catena, non sulla tabella
Niente set nativi: devi usare ipset come tool esterno Set e mappe native: set, mappe e verdict map sono parte del linguaggio. Supporto intervalli, timeout, contatori per elemento
Duplicazione IPv4/IPv6: regole identiche vanno scritte due volte (iptables + ip6tables) Famiglia inet: una sola regola vale per IPv4 e IPv6 contemporaneamente
Niente concatenazioni: non puoi matchare combinazioni complesse (ip+porta+interfaccia) in un solo lookup Concatenazioni: ip saddr . tcp dport { 10.0.0.1 . 22, 10.0.0.2 . 80 }
Performance lineare: le regole sono valutate sequenzialmente, O(n) Lookup O(1) con set: i set usano hash table o alberi, molto piu' efficienti con tante entry

Cronologia dell'evoluzione

AnnoEvento
2000iptables incluso nel kernel Linux 2.4 (sostituisce ipchains)
2008Inizio sviluppo di nftables da parte del team Netfilter
2014nftables incluso nel kernel Linux 3.13
2017Kernel 4.10: supporto set con intervalli, mappe e contatori
2019Debian 10 (Buster) e RHEL 8 adottano nftables come default
2020Kernel 5.6+: flowtable per offloading hardware
2021iptables dichiarato in "maintenance mode": solo bugfix, nessuna feature nuova
2023+La maggior parte delle distribuzioni usa iptables-nft (backend nftables con sintassi iptables compatibile)
Stato attuale: iptables non e' deprecato, ma e' in "maintenance mode". Tutte le nuove feature vengono sviluppate solo per nftables. Per nuove installazioni si raccomanda nftables. Controlla cosa usi: iptables -V - se riporta nf_tables stai gia' usando nftables sotto il cofano tramite il layer di compatibilita'.

Sintassi nftables

Flusso dei pacchetti con nftables

RETE IN Hook: prerouting prio -300 raw prio -100 nat catene utente ordinate per priority Routing Per me? Transito? Hook: input prio -200 mgl prio 0 filter Processo locale Hook: output prio -300 raw prio 0 filter ... Hook: forward prio -200 mgl prio 0 filter Hook: postrouting prio 100 nat prio 300 mgl RETE OUT

In nftables non ci sono tabelle fisse. Ogni catena si aggancia a un hook con una priority numerica.
Piu' catene possono condividere lo stesso hook: vengono eseguite in ordine di priorita' (valore basso = prima).

Struttura gerarchica

A differenza di iptables dove tabelle e catene sono predefinite, in nftables la struttura e' completamente definita dall'utente:

# Famiglia -> Tabella -> Catena -> Regole
#                     -> Set

table inet mio_firewall {        # famiglia: inet, nome tabella: mio_firewall
    set blocked_ips {             # set nativo (rimpiazza ipset)
        type ipv4_addr
        flags interval
        elements = { 10.0.0.0/8, 192.168.0.0/16 }
    }

    chain ingresso {              # catena con hook input
        type filter hook input priority filter; policy drop;

        # Regole: espressioni + verdetto
        iifname "lo" accept
        ct state established,related accept
        ct state invalid drop
        ip saddr @blocked_ips drop
        tcp dport { 22, 80, 443 } ct state new accept
        counter log prefix "dropped: " drop
    }
}

Famiglie

FamigliaDescrizioneHook disponibili
ipSolo traffico IPv4prerouting, input, forward, output, postrouting
ip6Solo traffico IPv6prerouting, input, forward, output, postrouting
inetIPv4 + IPv6 unificatiprerouting, input, forward, output, postrouting
arpTraffico ARPinput, output
bridgeTraffico bridge layer 2prerouting, input, forward, output, postrouting
netdevTraffico su interfaccia (ingress)ingress, egress

Tipi di catena

TipoUsoVerdetti possibili
filterFiltraggio pacchetti (accept/drop)accept, drop, reject, jump, goto, return
natNetwork Address Translationaccept, drop, snat, dnat, masquerade, redirect
routeRerouting (hook output)accept, drop

Espressioni e match

# Protocollo + campo
ip saddr 192.168.1.0/24          # indirizzo sorgente IPv4
ip6 daddr fd00::/64               # destinazione IPv6
tcp dport 22                       # porta destinazione TCP
udp sport 53                       # porta sorgente UDP
icmp type echo-request             # tipo ICMP

# Set anonimi (inline)
tcp dport { 80, 443, 8080 }       # match su piu' porte
ip saddr { 10.0.0.1, 10.0.0.2 }  # match su piu' IP

# Meta (metadati del pacchetto)
iifname "eth0"                     # interfaccia ingresso
oifname "eth1"                     # interfaccia uscita
meta l4proto tcp                   # protocollo layer 4
meta mark 0x1                      # mark del pacchetto
meta length > 1500                 # lunghezza pacchetto

# Connection tracking
ct state new                       # nuova connessione
ct state established,related       # connessione stabilita o correlata
ct state != invalid                # non invalid

# Negazione
tcp dport != 22                    # NOT porta 22
ip saddr != 192.168.1.0/24        # NOT da questa rete

# Concatenazioni
ip saddr . tcp dport { 10.0.0.1 . 22, 10.0.0.2 . 80 }

Statement e verdetti

# Verdetti (terminano la valutazione)
accept                             # accetta
drop                               # scarta
reject                             # rifiuta con ICMP error
reject with icmp type admin-prohibited
reject with tcp reset

# Statement (non terminano)
counter                            # conta pacchetti/bytes
counter packets 0 bytes 0
log                                # logga
log prefix "firewall: " level warn
limit rate 5/minute burst 10 packets  # rate limiting
limit rate over 1 mbytes/second    # limita banda

# NAT
dnat to 192.168.1.100:80          # destination NAT
snat to 203.0.113.1               # source NAT
masquerade                         # NAT dinamico
redirect to :8080                  # redirect a porta locale

# Combinazioni: statement + verdetto
counter log prefix "ssh: " accept  # conta, logga, accetta
limit rate 3/minute burst 5 packets accept  # rate limit poi accetta

Set e mappe native

# Definire un set
set blacklist {
    type ipv4_addr
    flags interval          # supporto CIDR/range
    timeout 1h              # scadenza automatica
    elements = { 10.0.0.0/8, 172.16.0.0/12 }
}

# Usare un set in una regola
ip saddr @blacklist drop

# Aggiungere/rimuovere elementi
nft add element inet filter blacklist { 192.168.1.1 }
nft delete element inet filter blacklist { 192.168.1.1 }

# Set di porte
set allowed_ports {
    type inet_service
    elements = { 22, 80, 443 }
}
tcp dport @allowed_ports accept

# Mappe (valore -> azione)
tcp dport vmap { 22 : accept, 80 : accept, 443 : accept, * : drop }

# Mappe (valore -> valore) per NAT
dnat to tcp dport map { 80 : 192.168.1.100, 443 : 192.168.1.200 }
Vantaggio set: In iptables, 1000 IP nella blacklist = 1000 regole valutate sequenzialmente (O(n)). In nftables, un set con 1000 IP usa una hash table: lookup O(1) indipendentemente dalla dimensione.

Migrazione iptables → nftables

Tabella di conversione comandi

iptablesnftables
iptables -A INPUT -j ACCEPTnft add rule inet filter input accept
iptables -P INPUT DROPnft add chain inet filter input { policy drop; }
iptables -I INPUT 2nft insert rule inet filter input position 2
iptables -D INPUT 3nft delete rule inet filter input handle 3
iptables -Fnft flush chain inet filter input
iptables -X MYCHAINnft delete chain inet filter MYCHAIN
iptables -L -n -vnft list ruleset
iptables-savenft list ruleset
iptables-restore < filenft -f file
iptables -Znft reset counters

Tabella di conversione match

iptablesnftables
-p tcp --dport 22tcp dport 22
-p tcp -m multiport --dports 80,443tcp dport { 80, 443 }
-s 192.168.1.0/24ip saddr 192.168.1.0/24
-d ! 10.0.0.0/8ip daddr != 10.0.0.0/8
-i eth0iifname "eth0"
-o eth1oifname "eth1"
-m conntrack --ctstate NEWct state new
-m state --state ESTABLISHEDct state established
-m limit --limit 5/min --limit-burst 10limit rate 5/minute burst 10 packets
-m recent --set --name SSHadd @ssh_recent { ip saddr } (con set dinamico)
-m set --match-set myset srcip saddr @myset
-m mac --mac-source AA:BB:CC:DD:EE:FFether saddr AA:BB:CC:DD:EE:FF
-m comment --comment "testo"comment "testo"
-m string --string "GET" --algo bm(non supportato direttamente, usare nfqueue)

Tabella di conversione target

iptablesnftables
-j ACCEPTaccept
-j DROPdrop
-j REJECT --reject-with icmp-port-unreachablereject
-j REJECT --reject-with tcp-resetreject with tcp reset
-j LOG --log-prefix "fw: " --log-level 4log prefix "fw: " level warn
-j SNAT --to-source 1.2.3.4snat to 1.2.3.4
-j DNAT --to-destination 10.0.0.1:80dnat to 10.0.0.1:80
-j MASQUERADEmasquerade
-j REDIRECT --to-ports 8080redirect to :8080
-j MARK --set-mark 0x1meta mark set 0x1
-j TCPMSS --clamp-mss-to-pmtutcp option maxseg size set rt mtu
-j NOTRACKnotrack

Conversione automatica

# Converti intero ruleset iptables in formato nftables
iptables-save | iptables-restore-translate -f /dev/stdin

# Converti una singola regola
iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# Output: nft add rule ip filter INPUT tcp dport 22 ct state new counter accept

# Converti ip6tables
ip6tables-save | ip6tables-restore-translate -f /dev/stdin

Esempio completo: prima e dopo

# === IPTABLES ===
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22,80,443 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
-A FORWARD -i eth1 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
COMMIT
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
COMMIT
# === NFTABLES equivalente ===
table inet firewall {
    chain input {
        type filter hook input priority filter; policy drop;
        iifname "lo" accept
        ct state established,related accept
        tcp dport { 22, 80, 443 } ct state new accept
        icmp type echo-request limit rate 1/second accept
    }
    chain forward {
        type filter hook forward priority filter; policy drop;
        iifname "eth1" oifname "eth0" accept
        iifname "eth0" oifname "eth1" ct state established,related accept
    }
    chain output {
        type filter hook output priority filter; policy accept;
    }
}
table ip nat {
    chain postrouting {
        type nat hook postrouting priority srcnat;
        oifname "eth0" ip saddr 192.168.1.0/24 masquerade
    }
}
Compatibilita': Il framework iptables-nft permette di usare la sintassi iptables con il backend nftables. Molte distribuzioni moderne lo usano di default. Controlla con iptables -V: se riporta "nf_tables" stai gia' usando nftables sotto il cofano. Non mescolare iptables-legacy e iptables-nft sullo stesso sistema.
Attenzione alla migrazione: Se usi ipset, le entry vanno convertite in set nativi nftables. Il tool ipset-translate puo' aiutare ma non copre tutti i casi. I set nftables sono piu' potenti (timeout per elemento, contatori per elemento, concatenazioni) ma la sintassi e' diversa.

Quick Reference

Comandi essenziali

ComandoDescrizione
iptables -L -n -v --line-numbersLista regole con dettagli e numeri
iptables -t nat -L -n -vLista regole NAT
iptables -SMostra regole in formato comando
iptables-saveEsporta tutte le regole
iptables-restore < fileImporta regole (atomico)
iptables -FFlush tutte le regole (catena filter)
iptables -XElimina catene utente
iptables -ZAzzera contatori
iptables -D INPUT 3Elimina regola #3 dalla catena INPUT
iptables -I INPUT 2 ...Inserisci regola in posizione 2
iptables -R INPUT 3 ...Sostituisci regola #3
iptables -N MYCHAINCrea catena personalizzata

Match extensions piu' usati

MatchOpzioni chiaveEsempio
conntrack--ctstate-m conntrack --ctstate NEW,ESTABLISHED
multiport--dports, --sports-m multiport --dports 80,443,8080
limit--limit, --limit-burst-m limit --limit 5/min --limit-burst 10
hashlimit--hashlimit-upto, --hashlimit-mode-m hashlimit --hashlimit-upto 10/s --hashlimit-mode srcip --hashlimit-name x
recent--set, --rcheck, --update-m recent --update --seconds 60 --hitcount 4 --name SSH
connlimit--connlimit-above-m connlimit --connlimit-above 20 --connlimit-mask 32
set--match-set-m set --match-set blacklist src
comment--comment-m comment --comment "Allow SSH"
string--string, --algo-m string --string "GET /" --algo bm
iprange--src-range-m iprange --src-range 10.0.0.1-10.0.0.100
time--timestart, --weekdays-m time --timestart 08:00 --timestop 18:00
mac--mac-source-m mac --mac-source AA:BB:CC:DD:EE:FF
owner--uid-owner-m owner --uid-owner 1000
addrtype--src-type, --dst-type-m addrtype --dst-type LOCAL

Porte note

PortaServizioPortaServizio
22SSH443HTTPS
25SMTP587SMTP Submission
53DNS993IMAPS
80HTTP3306MySQL
110POP35432PostgreSQL
143IMAP6379Redis
389LDAP27017MongoDB
NetForge includes data from: GeoLite2 by MaxMind (CC BY-SA 4.0) · CVE data from NVD/NIST (this product uses the NVD API but is not endorsed or certified by the NVD) · OUI database by IEEE · Tor exit nodes by Tor Project (BSD-3) · HSTS preload by Chromium (BSD-3) · Default IoT credentials by ihebski (MIT) · SSL guidelines by Mozilla (MPL-2.0)