
Iptables Essentials : Règles et commandes de pare-feu courantes.
multiportrandom* ou nth*limit et iplimit*string* dans la charge utile d'un paquettime*
:small_orange_diamond: Shorewall - outil avancé de configuration de passerelle/pare-feu pour GNU/Linux.
:small_orange_diamond: Firewalld - fournit un pare-feu géré dynamiquement.
:small_orange_diamond: UFW - outil de configuration de pare-feu par défaut pour Ubuntu.
:small_orange_diamond: FireHOL - offre une configuration simple et puissante pour tous les besoins de pare-feu et de contrôle de trafic Linux.
:small_orange_diamond: Meilleures pratiques : iptables - par Major Hayden
:small_orange_diamond: Un guide approfondi d'Iptables, le pare-feu Linux
:small_orange_diamond: Fonctionnalités avancées de netfilter/iptables
:small_orange_diamond: Pare-feux Linux avec iptables
:small_orange_diamond: Déboguer iptables et les pièges courants du pare-feu ?
:small_orange_diamond: Procédure de hacking Netfilter
:small_orange_diamond: Limitation de débit par IP avec iptables
Désactiver la triangulation de routage. Répondre aux requêtes sur la même interface, pas une autre. Protège également contre l'usurpation d'adresse IP.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/conf/all/rp_filter = 1 EOF
- [rp_filter et la sécurité Linux LPIC-3](https://www.theurbanpenguin.com/rp_filter-and-lpic-3-linux-security/)
- [Paramètres rp_filter du noyau Linux (filtrage de chemin inverse)](https://www.slashroot.in/linux-kernel-rpfilter-settings-reverse-path-filtering)
- [Filtrage de chemin inverse](http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.rpf.html)
##### log_martians
> _Activer la journalisation des paquets avec des adresses IP mal formées._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/conf/all/log_martians = 1
EOF
Désactive l'envoi de tous les paquets ICMP redirigés IPv4 sur toutes les interfaces.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/conf/all/send_redirects = 0 EOF
- [Désactiver le routage source](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-server_security-disable-source-routing)
- [Que sont les redirections ICMP et doivent-elles être bloquées?](https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked)
##### accept_source_route
> _Désactiver les paquets routés par la source (paquets avec l'option Strict Source Route (SSR) ou Loose Source Routing (LSR) définie)._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/conf/all/accept_source_route = 0
EOF
Désactiver l'acceptation des redirections ICMP.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/conf/all/accept_redirects = 0 EOF
- [Que sont les redirections ICMP et doivent-elles être bloquées ?](https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked)
- [Le système d'exploitation Red Hat Enterprise Linux doit ignorer les messages de redirection du protocole de contrôle de messages Internet (ICMP) version 4 (IPv4).](https://www.stigviewer.com/stig/red_hat_enterprise_linux_7/2018-11-28/finding/V-73175)
##### tcp_syncookies
> _Activer les protections contre les inondations SYN (protection contre les attaques par déni de service (DOS))._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/tcp_syncookies = 1
EOF
Désactiver la réponse aux pings broadcast.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/icmp_echo_ignore_broadcasts = 1 EOF
- [À quoi sert la diffusion ICMP ?](https://superuser.com/questions/306065/what-is-icmp-broadcast-good-for)
- [Le système ne doit pas répondre aux ICMPv4 envoyés à une adresse de diffusion.](https://www.stigviewer.com/stig/red_hat_enterprise_linux_6/2018-11-28/finding/V-38535)
##### ip_forward
> _Activer le routage IP. Requis si votre pare-feu protège un réseau, NAT inclus._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/ip_forward = 1
EOF
netfilter-persistent save
###### Basé sur RedHat```bash
service iptables save
iptables -n -L -v
#### Lister toutes les règles iptables actives avec les lignes numérotées et en mode verbeux```bash
iptables -n -L -v --line-numbers
iptables -S
#### Lister les règles sous forme de tableaux pour la chaîne INPUT```bash
iptables -L INPUT
iptables -S INPUT
#### Afficher les comptages de paquets et la taille agrégée```bash
iptables -L INPUT -v
iptables -L INPUT -n -v iptables -L OUTPUT -n -v --line-numbers
#### Supprimer une règle par chaîne et numéro```bash
iptables -D INPUT 10
iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
#### Vider toutes les règles, supprimer toutes les chaînes, et tout accepter```bash
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
iptables -F
#### Vider une seule chaîne```bash
iptables -F INPUT
iptables -I INPUT 2 -s 202.54.1.2 -j DROP
#### Autoriser les connexions loopback```bash
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#### Autoriser les connexions sortantes établies```bash
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
#### Supprimer les paquets invalides```bash
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -s 192.168.252.10 -j DROP
#### Bloquer et Adresse IP et Rejeter```bash
iptables -A INPUT -s 192.168.252.10 -j REJECT
iptables -A INPUT -i eth0 -s 192.168.252.10 -j DROP
#### Autoriser tout SSH entrant```bash
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser SSH sortant```bash
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser tout le trafic HTTP entrant```bash
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser tout le trafic HTTP et HTTPS entrant```bash
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser MySQL sur une interface réseau spécifique```bash
iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser PostgreSQL à une interface réseau spécifique```bash
iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j REJECT
#### Autoriser tout le SMTP entrant```bash
iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser tous les IMAPS entrants```bash
iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### Autoriser tout POP3S entrant```bash
iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
#### Bloquer tout le trafic sortant vers les réseaux Facebook
Obtenir l'AS Facebook :```bash
whois -h v4.whois.cymru.com " -v $(host facebook.com | grep "has address" | cut -d " " -f4)" | tail -n1 | awk '{print $1}'
Déposer:```bash for i in $(whois -h whois.radb.net -- '-i origin AS32934' | grep "^route:" | cut -d ":" -f2 | sed -e 's/^[ \t]*//' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | cut -d ":" -f2 | sed 's/$/;/') ; do
iptables -A OUTPUT -s "$i" -j REJECT
done
#### Journaliser et Supprimer les Paquets```bash
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Par défaut, tout est enregistré dans le fichier /var/log/messages :```bash
tail -f /var/log/messages
grep --color 'IP SPOOF' /var/log/messages
#### Journaliser et abandonner les paquets avec un nombre limité d'entrées de journal```bash
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
#### Bloquer ou autoriser ICMP Ping Request```bash
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT
#### Équilibrage de charge avec `random*` ou `nth*````bash
_ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")
for ip in "${_ips[@]}" ; do
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \
-j DNAT --to-destination ${ip}:80
done
ou```bash _ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")
for ip in "${_ips[@]}" ; do
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25
-j DNAT --to-destination ${ip}:80
done
#### Limiter le nombre de connexions avec `limit` et `iplimit*````bash
iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
-m limit --limit 20/hour --limit-burst 5 -j ACCEPT
ou```bash iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP
#### Maintenir une liste des connexions récentes à comparer```bash
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 100 -j DROP
iptables -A FORWARD -p tcp -i eth0 --dport 443 -m recent --name portscan --set -j DROP
string* dans la charge utile d'un paquet```bashiptables -A FORWARD -m string --string '.com' -j DROP iptables -A FORWARD -m string --string '.exe' -j DROP
#### Règles basées sur le temps avec `time*````bash
iptables -A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
-m time --timestart 21:30 --timestop 22:30 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT
iptables -A INPUT -s 1.2.3.4 -m ttl --ttl-lt 40 -j REJECT
#### Protection contre le scan de ports```bash
iptables -N port-scanning
iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
iptables -A port-scanning -j DROP
iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
#### Protection contre le Syn-flood```bash
iptables -N syn_flood
iptables -A INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460 iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
#### Bloquer les nouveaux paquets qui ne sont pas SYN```bash
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
ou```bash iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
#### Vérification des paquets Force Fragments```bash
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
#### Supprimer tous les paquets NULL```bash
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
#### Bloquer les paquets avec des flags TCP invalides```bash
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
_subnets=("224.0.0.0/3" "169.254.0.0/16" "172.16.0.0/12" "192.0.2.0/24" "192.168.0.0/16" "10.0.0.0/8" "0.0.0.0/8" "240.0.0.0/5")
for _sub in "${_subnets[@]}" ; do iptables -t mangle -A PREROUTING -s "$_sub" -j DROP done iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
## Exemples de configuration avancée
### Gestion des paquets en Python à l'aide de la cible NFQUEUE
> _Cette cible transmet le paquet à l'espace utilisateur à l'aide du gestionnaire nfnetlink_queue. Le paquet est placé dans la file d'attente identifiée par son numéro de file sur 16 bits. L'espace utilisateur peut inspecter et modifier le paquet si souhaité. L'espace utilisateur doit alors abandonner ou réinjecter le paquet dans le noyau._
#### ACCEPTER tous les paquets provenant d'une source spécifique sur (filter:INPUT) et DROP tout le reste
> _Cette règle transmet tous les paquets filter:INPUT à la file 1 avec la cible NFQUEUE._```bash
iptables -A INPUT -j NFQUEUE --queue-num 1
Script pour se lier à netfilter queue 1 et traiter les paquets.```python #!/usr/bin/python3
from netfilterqueue import NetfilterQueue from scapy.all import *
def packetanalyzer(pkt): ip=IP(pkt.get_payload()) if(ip.src=="192.168.122.1"): print(f"New packet from {ip.src}") pkt.accept() else: pkt.drop()
nfqueue=NetfilterQueue() nfqueue.bind(1, packetanalyzer) nfqueue.run()
#### Écrivez votre propre script de port knocking pour sécuriser l'accès ssh
> _DROP toutes les requêtes ssh et envoyez des requêtes secrètes de port vers l'espace utilisateur avec la cible NFQUEUE._```bash
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
iptables -t raw -I PREROUTING -p tcp --sport 65534 --dport 65535 -j NFQUEUE --queue-num 1
Ce script capture les paquets de la file d'attente netfilter 1 et vérifie SOURCEPORT et SECRETPORT pour le port knocking et autorise la source à se connecter à ssh pendant EXPIRETIME, par défaut 30 minutes.```python #!/usr/bin/python3
from os import system from netfilterqueue import NetfilterQueue from scapy.layers.inet import IP from time import time
SOURCEPORT=65534 SECRETPORT=65535 EXPIRETIME=30 ALLOWED={}
def portknocking(pkt): packet=IP(pkt.get_payload()) currtime=time() for item in list(ALLOWED): if(currtime-ALLOWED[item] >= EXPIRETIME*60): del ALLOWED[item] if(packet.sport==SOURCEPORT and packet.dport==SECRETPORT and packet.src not in ALLOWED): print(f"Port {packet.dport} knocked by {packet.src}:{packet.sport}") system(f"iptables -I INPUT -p tcp --dport 22 -s {packet.src} -j ACCEPT") system(f"echo 'iptables -D INPUT -p tcp --dport 22 -s {packet.src} -j ACCEPT' | at now + {EXPIRETIME} minutes") ALLOWED[packet.src]=time() pkt.drop()
nfqueue=NetfilterQueue() nfqueue.bind(1, portknocking)
try: nfqueue.run() except KeyboardInterrupt: print("\nExit with Keyboard Interrupt")
> _Pour frapper le port et autoriser les connexions ssh depuis votre ordinateur, exécutez simplement cette commande :_```bash
nc -p 65534 SERVER 65535