Skip to main content
  1. Lab-blue/

[TODO] Lab - iptables: Stateless vs Stateful Firewall

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Dimostra con iptables la differenza tra stateless (devi scrivere regole per entrambe le direzioni) e stateful (conntrack gestisce automaticamente il return traffic). Ambiente: Ubuntu + Kali.

Warning

Su Ubuntu con UFW attivo, le regole raw iptables -A INPUT vanno in fondo alla chain INPUT ma non vengono mai raggiunte — UFW inserisce le proprie chain (ufw-before-input ecc.) all'inizio. Usa sempre ufw allow su sistemi con UFW. Per testare conntrack puro, disabilita UFW temporaneamente con sudo ufw disable (ricordati di riabilitarlo con sudo ufw enable).

TL;DR
#

Stateless = ogni pacchetto giudicato da solo → serve regola per REQUEST + REPLY
Stateful  = conntrack traccia la sessione   → basta la regola per la REQUEST
TipoLayerTraccia sessioni?Regole richieste
StatelessL3/L4NoEntrambe le direzioni
StatefulL3/L4Sì (conntrack)Solo direzione iniziale

Fase 1 — Setup ambiente
#

  • Task 1.1 — Verifica VM attive

    ping 192.168.64.3   # Ubuntu dal Mac
    ping 192.168.64.200 # Kali dal Mac
    • Come sai che hai finito: entrambe rispondono
  • Task 1.2 — Flush regole iptables su Ubuntu

    sudo iptables -F
    sudo iptables -L -v --line-numbers
    • Come sai che hai finito: lista vuota (no rules)

Fase 2 — Stateless: il problema del return traffic
#

Con un firewall stateless devi scrivere esplicitamente sia la regola di andata che quella di ritorno.

  • Task 2.1 — Installa netcat su entrambe le VM

    # Ubuntu
    sudo apt install -y ncat
    
    # Kali (già installato di solito)
    which nc
  • Task 2.2 — Apri listener su Ubuntu porta 9999

    # Su Ubuntu — ascolta sulla porta 9999
    nc -lvnp 9999
  • Task 2.3 — Aggiungi SOLO la regola di ingresso (stateless)

    # Solo INPUT — permette che Kali raggiunga la porta 9999
    sudo iptables -A INPUT -p tcp --dport 9999 -j ACCEPT
    sudo iptables -A INPUT -j DROP   # blocca tutto il resto
    # NON aggiungere regola OUTPUT — simuliamo il problema stateless
  • Task 2.4 — Connettiti da Kali e osserva

    # Da Kali
    nc 192.168.64.3 9999
    • Cosa succede: la connessione viene stabilita ma i dati di risposta da Ubuntu vengono bloccati da OUTPUT DROP implicito
    • Come sai che hai finito: comportamento asimmetrico visibile
  • Task 2.5 — Aggiungi la regola OUTPUT (fix stateless)

    # Aggiunge il return traffic esplicito — fonte porta 9999 verso Kali
    sudo iptables -A OUTPUT -p tcp --sport 9999 -j ACCEPT
    • Come sai che hai finito: la connessione funziona in entrambe le direzioni
    • Lezione: con stateless devi conoscere e scrivere ENTRAMBE le direzioni
  • Task 2.6 — Flush per il prossimo test

    sudo iptables -F

Fase 3 — Stateful: conntrack gestisce il return
#

Con conntrack iptables conosce lo stato della connessione: NEW, ESTABLISHED, RELATED, INVALID.

  • Task 3.1 — Regola stateful: permetti connessioni stabilite

    # Una sola regola: permetti il return traffic delle connessioni già stabilite
    sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 9999 -j ACCEPT
    sudo iptables -A INPUT -j DROP
    # Nessuna regola OUTPUT necessaria
  • Task 3.2 — Connettiti da Kali

    # Da Kali
    nc 192.168.64.3 9999
    # Scrivi qualcosa → Ubuntu risponde
    • Come sai che hai finito: connessione bidirezionale senza regola OUTPUT esplicita
    • Lezione: conntrack riconosce il return come ESTABLISHED e lo lascia passare automaticamente
  • Task 3.3 — Verifica lo stato conntrack

    # Su Ubuntu — vedi le connessioni tracciate
    sudo conntrack -L
    • Come sai che hai finito: vedi la connessione con stato ESTABLISHED dalla Kali

Fase 4 — tcpdump: vedi la differenza
#

  • Task 4.1 — Cattura il traffico durante una connessione stateful

    # Su Ubuntu — apri tcpdump in un terminale separato
    sudo tcpdump -i any port 9999 -nn
    # Da Kali — connettiti e scrivi qualcosa
    nc 192.168.64.3 9999
    • Come sai che hai finito: vedi SYN → SYN-ACK → ACK (three-way handshake) + dati in entrambe le direzioni
  • Task 4.2 — Cleanup

    sudo iptables -F
    sudo iptables -L  # lista vuota

Scenario Reale
#

Un Blue Team analyst deve configurare il firewall perimetrale per permettere agli utenti interni di navigare in HTTPS. Con un firewall stateless deve scrivere:

  • ALLOW outbound TCP → any porta 443
  • ALLOW inbound TCP ← any porta 443 (return traffic esplicito)

Con un firewall stateful (NGFW, Fortinet, Palo Alto) basta:

  • ALLOW outbound TCP → any porta 443 Il return è gestito automaticamente dalla session table.

Risorse
#

  • man iptables — documentazione completa
  • sudo conntrack -L — vedi le sessioni tracciate
  • Gibson SY0-701 Cap 3 — Firewall Types

Collegato a
#

  • cap-03-security-architecture — tipi di firewall
  • [[[TODO] lab-router-acl-iptables|lab-router-acl-iptables]] — ACL stateless base

Related