iptablesnftableslinux
MDstable
NoteSnippetChecklistPlaybook
iptables & nftables — Firewall Linux
Règles iptables et nftables : filtrage, NAT, chaînes, persistance
snippetintermediate 2025-05-14 7 min read
iptablesnftableslinuxfirewallnatmasqueradenetfilter
Concepts — iptables
Netfilter framework kernel Linux pour filtrage de paquetsiptables interface userspace vers Netfilter IPv4ip6tables quivalent IPv6Tablesfilter filtrage standard INPUT OUTPUT FORWARDnat translation dadresses PREROUTING POSTROUTING OUTPUTmangle modification de paquets TTL TOS MARKraw bypass connection tracking PREROUTING OUTPUTChanesINPUT paquets destins au routeur/host localOUTPUT paquets gnrs par le routeur/host localFORWARD paquets en transit routagePREROUTING avant dcision de routage DNATPOSTROUTING aprs dcision de routage SNAT/MasqueradeCibles courantesACCEPT laisser passerDROP jeter silencieusementREJECT jeter avec message ICMPLOG journaliser puis continuerDNAT changer ladresse destinationSNAT changer ladresse sourceMASQUERADE SNAT dynamique IP dinterface variable ex PPPoE
iptables — Commandes de base
bash
# Lister les règles avec numéros de ligneiptables -L -n -v --line-numbersiptables -L INPUT -n -v --line-numbersiptables -t nat -L -n -v --line-numbers# Vider toutes les règles (ATTENTION : coupe toutes les connexions si pas de règle ACCEPT)iptables -F # flush toutes les chaînesiptables -X # supprimer les chaînes customiptables -t nat -F # flush la table nat# Ajouter une règle (append = en bas, insert = en haut)iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT # insérer en position 1# Supprimer une règle par numéro de ligneiptables -D INPUT 3
iptables — Politique sécurisée (drop all)
bash
Variables
{{ADMIN_SUBNET}}
{{ADMIN_PREFIX}}
#!/bin/bash# Script de configuration firewall — exécuter en root# 1. Vider les règles existantesiptables -Fiptables -Xiptables -t nat -Fiptables -t mangle -F# 2. Politique par défaut : DROP toutiptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT ACCEPT # sortie permise par défaut# 3. Loopback toujours autoriséiptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT# 4. CRITIQUE : autoriser les connexions établies et related# → sans ça, les sessions actives seront coupées après le DROPiptables -A INPUT -m state --state ESTABLISHEDRELATED -j ACCEPT# 5. SSH (limité à un réseau admin)iptables -A INPUT -p tcp --dport 22 -s {{ADMIN_SUBNET}}{{ADMIN_PREFIX}} -m state --state NEW -j ACCEPT# 6. HTTP/HTTPSiptables -A INPUT -p tcp -m multiport --dports 80443 -m state --state NEW -j ACCEPT# 7. ICMP (ping — limité en rate)iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT# 8. Log les paquets droppés (avant la règle DROP finale)iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-dropped: " --log-level 4# Vérifieriptables -L -n -v --line-numbers
iptables — NAT & Masquerade
bash
Variables
{{WAN_IFACE}}
{{WAN_IP}}
{{LAN_IFACE}}
# Activer le forwarding IP (kernel)echo 1 > /proc/sys/net/ipv4/ip_forward# Persistant : /etc/sysctl.confecho "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl -p# Masquerade (SNAT dynamique — partage de connexion internet)# Tout le trafic sortant sur l'interface WAN sera NATéiptables -t nat -A POSTROUTING -o {{WAN_IFACE}} -j MASQUERADE# Ou SNAT statique (IP fixe sur le WAN — plus performant que MASQUERADE)iptables -t nat -A POSTROUTING -o {{WAN_IFACE}} -j SNAT --to-source {{WAN_IP}}# Autoriser le FORWARD pour les clients LAN vers WANiptables -A FORWARD -i {{LAN_IFACE}} -o {{WAN_IFACE}} -m state --state NEWESTABLISHEDRELATED -j ACCEPTiptables -A FORWARD -i {{WAN_IFACE}} -o {{LAN_IFACE}} -m state --state ESTABLISHEDRELATED -j ACCEPT
iptables — DNAT (Port Forwarding)
bash
Variables
{{WAN_IFACE}}
{{INTERNAL_IP}}
# Rediriger le port 80 WAN vers un serveur interneiptables -t nat -A PREROUTING -i {{WAN_IFACE}} -p tcp --dport 80 -j DNAT --to-destination {{INTERNAL_IP}}80# Port forwarding SSH externe (port 2222) → serveur interne (port 22)iptables -t nat -A PREROUTING -i {{WAN_IFACE}} -p tcp --dport 2222 -j DNAT --to-destination {{INTERNAL_IP}}22# Autoriser le FORWARD vers le serveur interneiptables -A FORWARD -p tcp -d {{INTERNAL_IP}} --dport 80 -m state --state NEWESTABLISHEDRELATED -j ACCEPT
Persistance iptables
bash
# Debian/Ubuntuapt install iptables-persistent# Sauvegarder les règles actuellesiptables-save > /etc/iptables/rules.v4ip6tables-save > /etc/iptables/rules.v6# Restaurer manuellementiptables-restore < /etc/iptables/rules.v4# RHEL/CentOSservice iptables save # sauvegarde dans /etc/sysconfig/iptablessystemctl enable iptables
nftables — Concepts
nftables successeur de iptables depuis kernel 313 dfaut sur Debian 10Syntaxe plus propre performances suprieures tables/chanes flexiblesnft list ruleset voir toute la configurationnft flush ruleset vider toute la configuration
nftables — Configuration complète
bash
Variables
{{ADMIN_SUBNET}}
{{ADMIN_PREFIX}}
{{LAN_IFACE}}
{{WAN_IFACE}}
{{INTERNAL_IP}}
# Fichier /etc/nftables.conf#!/usr/sbin/nft -fflush rulesettable inet filterchain inputtype filter hook input priority 0; policy drop;# Loopbackiif "lo" accept# Connexions établies/relatedct state establishedrelated accept# Drop connexions invalidesct state invalid drop# SSH (réseau admin uniquement)ip saddr {{ADMIN_SUBNET}}{{ADMIN_PREFIX}} tcp dport 22 ct state new accept# HTTP/HTTPStcp dport 80 443 ct state new accept# ICMP / ICMPv6icmp type echo-request limit rate 1/second accepticmpv6 type echo-request, nd-neighbor-solicit, nd-router-advert accept# Log et drop du restelimit rate 5/minute log prefix "nft-dropped: " level infochain forwardtype filter hook forward priority 0; policy drop;# Permettre forward LAN → WANiif "{{LAN_IFACE}}" oif "{{WAN_IFACE}}" ct state newestablishedrelated acceptiif "{{WAN_IFACE}}" oif "{{LAN_IFACE}}" ct state establishedrelated acceptchain outputtype filter hook output priority 0; policy accept;table ip natchain postroutingtype nat hook postrouting priority 100;# Masquerade sortie WANoif "{{WAN_IFACE}}" masqueradechain preroutingtype nat hook prerouting priority -100;# Port forwarding HTTP vers serveur interneiif "{{WAN_IFACE}}" tcp dport 80 dnat to {{INTERNAL_IP}}80
bash
# Appliquernft -f /etc/nftables.conf# Activer au démarragesystemctl enable nftablessystemctl start nftables# Commandes utiles nftnft list rulesetnft list tablesnft list chain inet filter inputnft add rule inet filter input tcp dport 8080 accept # ajouter une règlenft delete rule inet filter input handle 5 # supprimer par handlenft list ruleset | nft -f /dev/stdin # recharger
UFW — Abstraction Ubuntu/Debian
bash
Variables
{{ADMIN_IP}}
{{BLOCKED_IP}}
# Activer UFWufw enableufw status verboseufw status numbered# Règles de baseufw default deny incomingufw default allow outgoing# Autoriser des servicesufw allow sshufw allow 80/tcpufw allow 443/tcpufw allow from {{ADMIN_IP}} to any port 22# Refuserufw deny from {{BLOCKED_IP}}ufw deny 3306/tcp# Supprimer une règleufw delete allow 80/tcpufw delete 3 # par numéro (show numbered)# Loggingufw logging onufw logging high
firewalld — RHEL/CentOS/Rocky
bash
Variables
{{ADMIN_IP}}
{{INTERNAL_IP}}
# État et zonesfirewall-cmd --statefirewall-cmd --get-active-zonesfirewall-cmd --list-allfirewall-cmd --list-all --zone=public# Ajouter des services (temporaire — perd au reload)firewall-cmd --add-service=httpfirewall-cmd --add-service=httpsfirewall-cmd --add-port=8080/tcp# Permanent (persiste après reload)firewall-cmd --permanent --add-service=httpfirewall-cmd --permanent --add-service=httpsfirewall-cmd --permanent --add-port=8080/tcpfirewall-cmd --reload# Rich rules (règles avancées)firewall-cmd --permanent --add-rich-rule='rule family"ipv4" source address"{{ADMIN_IP}}/32" port protocol"tcp" port"22" accept# NAT/Masqueradefirewall-cmd --permanent --add-masqueradefirewall-cmd --permanent --zone=public --add-masquerade# Port forwardingfirewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr={{INTERNAL_IP}}:toport=80firewall-cmd --reload
💡 Tip —
Toujours commencer par une règle ESTABLISHED,RELATED avant d'appliquer une politique DROP sur INPUT. Sans cette règle, dès que vous passez à iptables -P INPUT DROP ou nftables policy drop, toutes les sessions SSH actives (et autres connexions établies) seront immédiatement coupées — y compris celle que vous utilisez pour configurer le serveur.
OPS·BRAIN v1.027 notes · Networklocal