{{{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 : {{{ #!/bin/sh 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 }}}