Iptables est un logiciel libre de l'espace utilisateur Linux grâce auquel l'administrateur système peut configurer les chaînes et règles dans le pare-feu en espace noyau (et qui est composé par des modules Netfilter).
Netfilter est une architecture de filtrage de paquet pour les noyaux Linux. Il n’inspecte que les en-têtes des paquets ce qui le rend très rapide et ne génère pas de latence.
Lorsqu'une trame arrive sur le host firewall, IPTABLES consulte les règles pour vérifier si l'une d'entre elles peut s'appliquer. Lorsque c'est le cas, la règle est appliquée et IPTABLES cesse la consultation.
Ordre des règles est donc primordial en cas de règles contradictoires.
Enfin si aucune règle précise n'est définit, ce sera la POLICY par défaut qui s'applique (DROP ou ACCEPT).
Netfilter est un firewall avec état (statefull), il dispose des modules (conntrack) qui interprètent ces informations afin de déterminer l'état de connexion de chaque paquet.
L'option –state permet de préciser les états dans la définition des règles.
iptables <table> <commande> <paramètres> <cible>
| -A | –apend | ajoute la règle |
| -D | –delete | supprime une règle |
| -R | –replace | remplace la règle spécifié |
| -I | –insert | insère une règle dans un endroit spécifié |
| -L | –list | affiche les règles |
| -F | –flush | vide toutes les règles |
| -N | –new-chain | créé une nouvelle chaîne |
| -X | –delete-chain | supprime une chaîne |
| -P | -policy | spécifie la valeur de la cible par défaut de la chaîne |
iptables -L
iptables -t nat -L
iptables -F
iptables -t nat -F
#!/bin/bash iptables -F iptables -t nat -F iptables -t nat -X iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT echo "IPTABLES DEFAULT POLICY ACCEPT : OK" exit 0
#!/bin/bash iptables -F iptables -t nat -F iptables -t nat -X iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP echo "IPTABLES DEFAULT POLICY DROP : OK" exit 0
| CHAINE | TABLE | DESCRIPTION |
|---|---|---|
| PREROUTING | nat, mangle | Chaîne passeront les paquets entrants dans la mchien avant routage |
| INPUT | filter, mangle | Chaîne traitant les paquets entrant avant les couches supérieurs (applications) |
| FORWARD | filter, nat, mangle | Paquets transmis par la machine sans que les applications n'en aient connaissance |
| OUTPUT | filter, nat , mangle | Chaîne appelée par les paquets envoyés par des programmes présents sur la machine |
| POSTROUTING | nat, mangle | Paquets prêts à être envoyés (transmis ou générés) |
| -p | –protocol | tcp, udp, icmp, all ou N° de protocole /etc/protocols |
| -s | –source | adresse IP ou réseau |
| -d | –destination | adresse IP ou réseau |
| -j | –jump cible | sans la cible, la règle n'est pas prise en compte |
| -i | –in-interface | nom de l'interface qui reçoit les paquets |
| -o | –out-interface | nom de l'interface qui envoit les paquets |
| ! | inverse | ce signe inverse le test |
| ACCEPT | laisse poursuivre le cheminement des paquets |
|---|---|
| DROP | supprime les paquets sans message de retour (aucune trace) |
| LOG | permet la journalisation (/var/log/syslog par défaut) |
| REJECT | comme DROP mais envoie une réponse de refus |
| SNAT | modifie l'IP de l'émetteur par la valeur spécifiée ( -j SNAT –to-source IP:PORT) |
| DNAT | remplace l'IP du destinataire par la valeur spécifiée ( -j DNAT –to-destination IP:PORT) |
| MASQUERADE | demande à netfilter de remplacer l'IP par son interface de sortie |
Installer l'utilitaire conntrack et charger les modules indispensables sur le serveur firewall:
aptitude install conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
conntrack -E
Ce script a été réalisé dans le cadre d'une simluation de réseau d'entreprise.
De multiples services sont installés, certains en failover ce qui justifie le nombre de règles.
#!/bin/bash #VIDER LES TABLES PRECEDENTES iptables -F echo "Vidange des Tables : OK" #AUTORISER LOOPBACK iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT echo "LOOPBACK : OK" # PING ACCES LAN-FW iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.254 -p icmp -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.254 -d 192.168.0.0/24 -p icmp -j ACCEPT # PING FORWARD LAN-INTERNET iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -p icmp -j ACCEPT iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -p icmp -j ACCEPT # PING REJECT INTERNET-FW iptables -A INPUT -i eth1 -p icmp -j REJECT # PING REJECT DMZ-FW iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 192.168.1.254 -p icmp -j REJECT iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 192.168.0.254 -p icmp -j REJECT iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 88.44.22.13 -p icmp -j REJECT # PING LAN-DMZ DMZ-LAN iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p icmp -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p icmp -j ACCEPT echo "ICMP ALL EXCEPT SRV-FW FROM DMZ/INTERNET : OK" # SSH ACCES LAN-FW iptables -A INPUT -i eth0 -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -o eth0 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT echo "SSH LAN-FW : OK" # SSH FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 22 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT echo "SSH LAN-DMZ : OK" # SQUID ACCES LAN-FW iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.254 -p tcp --dport 3128 -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.254 -d 192.168.0.0/24 -p tcp --sport 3128 -j ACCEPT echo "SQUID LAN-FW : OK" # SQUID ACCES DMZ-FW iptables -A INPUT -i eth2 -s 192.168.1.0/24 -d 192.168.1.254 -p tcp --dport 3128 -j ACCEPT iptables -A OUTPUT -o eth2 -s 192.168.1.254 -d 192.168.1.0/24 -p tcp --sport 3128 -j ACCEPT echo "SQUID DMZ-FW : OK" # DNS ACCES LAN-FW iptables -A INPUT -i eth0 -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -o eth0 -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT echo "DNS LAN-FW : OK" # DNS FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 53 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT echo "DNS LAN-DMZ : OK" # NTP ACCES LAN-FW iptables -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.254 -p udp --dport 123 -j ACCEPT iptables -A OUTPUT -o eth0 -s 192.168.0.254 -d 192.168.0.0/24 -p udp --sport 123 -j ACCEPT echo "NTP LAN-FW : OK" # NTP ACCES DMZ-FW iptables -A INPUT -i eth2 -s 192.168.1.1 -d 192.168.1.254 -p udp --dport 123 -j ACCEPT iptables -A OUTPUT -o eth2 -s 192.168.1.254 -d 192.168.1.1 -p udp --sport 123 -j ACCEPT echo "NTP DMZ-FW : OK" # DHCP FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --sport 68 --dport 67 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -s 192.168.1.1 -d 192.168.0.0/24 -p udp --sport 67 --dport 68 -j ACCEPT echo "DHCP LAN-DMZ : OK" # AUTORISER LE PAT EN SORTIE SUR INTERFACE PUBLIQUE iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE echo "NAT ALL-INTERNET : OK" # DNS ACCES FW-DNS_FAI iptables -A OUTPUT -o eth1 -s 88.44.22.13 -d 66.55.44.33 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth1 -s 66.55.44.33 -d 88.44.22.13 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT echo "DNS FW-INTERNET : OK" # HTTP(s) ACCES FW-INTERNET iptables -A OUTPUT -o eth1 -s 88.44.22.13 -p tcp -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth1 -d 88.44.22.13 -p tcp -m multiport --sport 80,443 -m state --state ESTABLISHED -j ACCEPT echo "HTTP(s) FW-INTERNET : OK" # HTTP(s) ACCES FW-DMZ iptables -A OUTPUT -o eth2 -s 192.168.1.254 -p tcp -m multiport --dport 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth2 -d 192.168.1.254 -p tcp -m multiport --sport 80,443 -m state --state ESTABLISHED -j ACCEPT echo "HTTP(s) FW-DMZ : OK" # NTP ACCES FW-INTERNET iptables -A INPUT -i eth1 -d 88.44.22.13 -p udp --dport 123 -j ACCEPT iptables -A OUTPUT -o eth1 -s 88.44.22.13 -p udp --dport 123 -j ACCEPT echo "NTP FW-INTERNET : OK" # le PAT IP_PUBLIQUE-DMZ:80 iptables -t nat -A PREROUTING -d 88.44.22.13 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80 # HTTP FORWARD INTERNET-DMZ iptables -A FORWARD -i eth1 -o eth2 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth2 -o eth1 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT echo "NAT INTERNET WEB-DMZ : OK" # ACCES DMZ VERS INTERNET #iptables -A INPUT -i eth2 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT #iptables -A OUTPUT -o eth2 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT #echo "DNS DMZ-INTERNET : OK" # DNS FW-DMZ iptables -A OUTPUT -o eth2 -s 192.168.1.0/24 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth2 -s 192.168.1.0/24 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT echo "DNS FW-DMZ : OK" # DNS TRANSFERT FW-DMZ iptables -A OUTPUT -o eth2 -d 192.168.1.0/24 -p tcp --sport 1024:65535 --dport 53 -j ACCEPT iptables -A INPUT -i eth2 -s 192.168.1.0 -p tcp --sport 53 --dport 1024:65535 -j ACCEPT iptables -A OUTPUT -o eth2 -d 192.168.1.1 -p tcp --dport 1024:65535 --sport 53 -j ACCEPT iptables -A INPUT -i eth2 -d 192.168.1.254 -p tcp --sport 1024:65535 --dport 53 -j ACCEPT echo "DNS TRANSFERT FW-DMZ : OK" # NIS YPSERV FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 834 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 834 -j ACCEPT iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 834 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p udp --sport 834 -j ACCEPT echo "NIS YPSERV LAN-DMZ : OK" # NIS YPBIND FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 835 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 835 -j ACCEPT iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 835 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p udp --sport 835 -j ACCEPT echo "NIS YPBIND LAN-DMZ : OK" # NIS PORTMAPPER FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p udp --dport 111 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p udp --sport 111 -j ACCEPT iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 111 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 111 -j ACCEPT echo "NIS PORTMAPPER LAN-DMZ : OK" # FTP FORWARD LAN-DMZ iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 20 -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 20 -j ACCEPT iptables -A FORWARD -i eth0 -o eth2 -s 192.168.0.0/24 -d 192.168.1.1 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth2 -o eth0 -d 192.168.0.0/24 -s 192.168.1.1 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT echo "FTP LAN-DMZ : OK" exit 0
IPTABLES n'interroge pas DNS. Il résout uniquement en terme IP.
vi /root/script/firewall
# Recupere IP dynamique
IP_DYNAMIQUE=$(ping -c1 truc.dyndnslias.com | grep time | head -1 | cut -d"(" -f2 | cut -d")" -f1)
# La regle IPTABLE avec l'IP contenue dans une variable
iptables -t filter -A INPUT -p tcp -s $IP_DYNAMIQUE --dport 22 -j ACCEPT