Guide COMPLET de iptables -t filter -A
Je vais t'expliquer en détail toutes les possibilités avec iptables -t filter -A. C'est la partie la plus utilisée d'iptables !
________________


STRUCTURE DE BASE
iptables -t filter -A CHAINE [CRITÈRES] -j ACTION
* -t filter = table FILTER (pare-feu) → optionnelle car c'est la table par défaut
* -A = Append (ajouter à la fin)
* CHAINE = INPUT, OUTPUT ou FORWARD
* CRITÈRES = conditions pour appliquer la règle
* -j = Jump (action à faire)
* ACTION = ACCEPT, DROP, REJECT, etc.
________________


Les 3 CHAÎNES principales de FILTER
1. CHAÎNE INPUT → Paquets POUR la machine
# Exemple : Quelqu'un essaie de se connecter à TON serveur SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# "Accepte les connexions TCP sur le port 22 (SSH) qui viennent vers MOI"
2. CHAÎNE OUTPUT → Paquets DE la machine
# Exemple : Tu essaies d'aller sur un site web
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
# "Accepte les connexions TCP sortantes vers le port 80 (HTTP)"
3. CHAÎNE FORWARD → Paquets qui TRAVERSENT la machine


# Exemple : Ta machine fait routeur entre 2 réseaux
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
# "Accepte les paquets qui viennent de 192.168.1.0/24 vers 192.168.2.0/24"
________________


TOUTES les OPTIONS possibles (CRITÈRES)
A. Par ADRESSE IP
Option
	Signification
	Exemple
	-s ADRESSE
	Source (qui envoie)
	-s 192.168.1.100
	-d ADRESSE
	Destination (pour qui)
	-d 10.0.0.1
	!
	SAUF (négation)
	-s ! 192.168.1.100
	Exemples :


# Bloquer une IP spécifique
iptables -A INPUT -s 192.168.1.100 -j DROP


# Autoriser seulement un réseau
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -j DROP  # Tout le reste bloqué


# Sauf mon serveur DNS
iptables -A INPUT -s ! 8.8.8.8 -p udp --dport 53 -j DROP
________________


B. Par INTERFACE
Option
	Signification
	Exemple
	-i INTERFACE
	Interface d'entrée
	-i eth0
	-o INTERFACE
	Interface de sortie
	-o wlan0
	Exemples :


# Seulement sur l'interface WiFi
iptables -A INPUT -i wlan0 -p tcp --dport 22 -j ACCEPT


# Bloquer tout ce qui entre par eth1
iptables -A INPUT -i eth1 -j DROP


# Routeur : autoriser eth0→eth1
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
________________


C. Par PROTOCOLE
Option
	Signification
	Exemple
	-p PROTO
	Protocol
	-p tcp, -p udp, -p icmp
	-p all
	Tous les protocoles
	-p all
	Pour TCP :


# Autoriser SSH (port 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT


# Autoriser HTTP (port 80) et HTTPS (443)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT


# Ports sources (quand tu envoies)
iptables -A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT
Pour UDP :


# Autoriser DNS (port 53)
iptables -A INPUT -p udp --dport 53 -j ACCEPT


# Autoriser DHCP (port 67-68)
iptables -A INPUT -p udp --dport 67:68 -j ACCEPT
Pour ICMP (ping) :
bash
# Autoriser le ping entrant
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT


# Autoriser les réponses ping
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT


# Bloquer tous les ICMP
iptables -A INPUT -p icmp -j DROP
________________


D. Par ÉTAT de connexion (IMPORTANT !)
Option
	Signification
	NEW
	Nouvelle connexion
	ESTABLISHED
	Connexion déjà établie
	RELATED
	Connexion liée (ex: FTP data)
	INVALID
	Paquet invalide
	EXEMPLE CRUCIAL pour ton TP :


# TOUJOURS mettre en PREMIER !
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# "Autorise les réponses aux connexions que J'AI initiées"
Pourquoi c'est important ?
Sans cette règle :
* Tu pingues 8.8.8.8 → paquet sort (NEW)
* 8.8.8.8 répond → paquet entre (ESTABLISHED) → BLOQUÉ si pas de règle !
* Résultat : le ping ne marche que dans un sens
________________


E. Par PORT (TCP/UDP)
Option
	Signification
	Exemple
	--sport PORT
	Source port
	--sport 1024:65535
	--dport PORT
	Destination port
	--dport 80
	--sport MIN:MAX
	Range de ports
	--sport 1000:2000
	--multiport --sports
	Multiples ports source
	--multiport --sports 22,80,443
	--multiport --dports
	Multiples ports destination
	--multiport --dports 21,22,23
	Exemples :


# Un seul port
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # SSH


# Range de ports
iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT  # Ports éphémères


# Multiples ports
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT


# Ports source (quand tu es client)
iptables -A OUTPUT -p tcp --sport 32768:60999 -j ACCEPT
________________


F. Options avancées
Option
	Signification
	Exemple
	-m limit --limit
	Limiter le débit
	--limit 3/sec
	-m mac --mac-source
	Par adresse MAC
	--mac-source 00:11:22:33:44:55
	-m tcp --tcp-flags
	Flags TCP
	--tcp-flags SYN,ACK,FIN,RST SYN
	-m time
	Par heure/jour
	--timestart 09:00 --timestop 17:00
	Exemples :


# Anti-DDoS sur ping
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP


# Par MAC address
iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT


# Seulement le jour
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT
________________


ACTIONS possibles (-j)
Action
	Signification
	Exemple
	ACCEPT
	Accepter le paquet
	-j ACCEPT
	DROP
	Supprimer silencieusement
	-j DROP
	REJECT
	Rejeter avec erreur
	-j REJECT
	LOG
	Logger (journaliser)
	-j LOG
	RETURN
	Retourner à la chaîne parente
	-j RETURN
	Différence DROP vs REJECT :
* DROP = paquet jeté, pas de réponse → timeout
* REJECT = envoie "Connection refused" → erreur immédiate


# Exemple LOG
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
________________


EXEMPLES COMPLETS pour ton TP
Exemple 1 : Pare-feu personnel
# Politique par défaut DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT


# Localhost toujours autorisé
iptables -A INPUT -i lo -j ACCEPT


# Réponses aux connexions établies
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


# SSH depuis réseau local seulement
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT


# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT


# Ping limité
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Exemple 2 : Routeur (comme dans ton TP)
bash
# Activer le forwarding
sysctl -w net.ipv4.ip_forward=1


# --- RÈGLES FORWARD ---
# 1. TOUJOURS en premier : réponses
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


# 2. S1 → S2 autorisé
iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.2.0/24 -j ACCEPT


# 3. S2 → S1 autorisé
iptables -A FORWARD -s 172.16.2.0/24 -d 172.16.1.0/24 -j ACCEPT


# 4. S1 ↛ S3 bloqué
iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.3.0/24 -j DROP


# 5. S3 ↛ S1 bloqué
iptables -A FORWARD -s 172.16.3.0/24 -d 172.16.1.0/24 -j DROP


# 6. Politique par défaut
iptables -P FORWARD DROP
Exemple 3 : Serveur web sécurisé
# Vider toutes les règles
iptables -F
iptables -X


# Politiques par défaut
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT


# Localhost
iptables -A INPUT -i lo -j ACCEPT


# Réponses
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


# SSH avec limite
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min -j ACCEPT


# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT


# DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT


# Ping limité
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT


# Protection contre les scans
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
________________


 ORDRE DES RÈGLES (TRÈS IMPORTANT !)
Les règles sont vérifiées dans l'ordre ! La première qui correspond s'applique.
 MAUVAIS ordre :


iptables -A INPUT -j DROP              # 1. Tout bloqué !
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # 2. Jamais atteint
 BON ordre :
iptables -A INPUT -i lo -j ACCEPT      # 1. Localhost
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  # 2. Réponses
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # 3. SSH
iptables -A INPUT -j DROP              # 4. Tout le reste bloqué
Règle d'or :
1. localhost (lo)
2. ESTABLISHED,RELATED
3. Règles spécifiques (ACCEPT)
4. Règles de blocage spécifiques
5. Politique par défaut (DROP)
________________


COMMANDES UTILES pour tester
# Voir toutes les règles
iptables -L -v -n


# Voir une chaîne spécifique
iptables -L INPUT -v -n


# Voir avec numéros de ligne
iptables -L --line-numbers


# Supprimer une règle (ex: ligne 3 de INPUT)
iptables -D INPUT 3


# Vider toutes les règles
iptables -F


# Sauvegarder
iptables-save > /etc/iptables.rules


# Restaurer
iptables-restore < /etc/iptables.rules
________________




Une règle iptables = 


iptables -t filter -A CHAINE 
          ↓
    CRITÈRES :
    -s 192.168.1.0/24    (source)
    -d 10.0.0.1          (destination)
    -p tcp               (protocole)
    --dport 80           (port)
    -i eth0              (interface)
    -m state --state NEW (état)
          ↓
    -j ACTION
    ACCEPT / DROP / REJECT / LOG