iptables permet de gérer les tables de règles de filtrage des paquets IP, tables utilisées par le noyau Linux. Le système de filtrage proprement dit s'appelle netfilter. Autrement dit, iptables permet de gérer netfilter.
Documentation
La documentation est sur http://netfilter.org/
De bonnes traductions de ces documentations sont sur http://www.linux-france.org/prj/inetdoc/guides/
Au quotidien, on consultera man iptables
Il est inutile de vouloir utiliser iptables ou de poser des questions aux collègues si vous n'avez pas lu ces documentations
Exemple
Un petit exemple de script totalement non abouti pour mettre en place un petit parefeu :
IF_NET=eth0 IP_NET=216.34.27.3 IF_LAN=eth1 IP_LAN=192.168.1.1 NW_LAN=192.168.1.0/24 # on met à zéro les tables iptables -t filter -F iptables -t nat -F iptables -t mangle -F # on ferme tout par défaut iptables -t filter -P FORWARD DROP iptables -t filter -P INPUT DROP iptables -t filter -P OUTPUT DROP # on autorise les paquets faisant partie de connexions déjà en cours iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SNAT pour toutes les IP du réseau interne qui peuvent sortir iptables -t nat -A POSTROUTING -o $IF_NET -s $NW_LAN -j SNAT --to-source $IP_NET # on permet les demandes de ping (dans tous les sens et en entrée du parefeu) iptables -t filter -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT # on permet les services locaux iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT # on autorise la naviguer sur le web : DNS, http et https # utilisation de DNS iptables -t filter -A FORWARD -o $IF_NET -p udp --dport domain -j ACCEPT iptables -t filter -A FORWARD -o $IF_NET -p tcp --dport domain -j ACCEPT # le web (80 et 443 = http et https) iptables -t filter -A FORWARD -o $IF_NET -p tcp --dport http -j ACCEPT iptables -t filter -A FORWARD -o $IF_NET -p tcp --dport https -j ACCEPT ... etc ...
Mise en place au démarrage
Une fois le script écrit et testé, il faut enregistrer la configuration afin qu'elle soit mise en place à chaque démarrage de la machine. Une technique simple est de sauvegarder la configuration avec iptables-save et de la restaurer avec iptables-restore lors de la mise en place des interfaces réseaux.
Pour cela :
- une fois que les règles fonctionnent bien, taper :
# iptables-save > /etc/network/firewall
ajouter une exécution en pre-up de la première interface activée dans /etc/network/interfaces, par exemple :
# ... extrait de /etc/network/interfaces ... auto eth0 iface eth0 inet static address 219.45.33.182 network 255.255.255.240 gateway 219.45.33.181 # configuration du pare-feu pre-up /sbin/iptables-restore < /etc/network/firewall
Note : il faut également mettre en place le forwarding des paquets entre les différentes interfaces de la machine. Pour cela :
- sur Debian/Sarge, voir /etc/network/options
- sur Debian/Etch, voir /etc/sysctl.conf :
# ... extrait de /etc/sysctl.conf ... # enable packet forwarding for IPv4 net.ipv4.conf.default.forwarding=1