IPtables et Netfilter sur serveur dédié
Netfilter est le module du noyau Linux qui fournit entres autres fonctions celle de pare-feu.
Iptables est le programme qui permet de configurer Netfilter.
Voici un exemple de configuration basique de Netfilter sous Gentoo Linux, mais qui peut facilement s’adapter à d’autres distributions.
Configuration du noyau
Les noyaux SDF sont déjà configurés pour Netfilter.
CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y CONFIG_NF_CONNTRACK=y CONFIG_NF_CONNTRACK_FTP=y CONFIG_NETFILTER_XTABLES=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y CONFIG_NETFILTER_XT_TARGET_MARK=y CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y CONFIG_NETFILTER_XT_MATCH_DCCP=y CONFIG_NETFILTER_XT_MATCH_LENGTH=y CONFIG_NETFILTER_XT_MATCH_LIMIT=y CONFIG_NETFILTER_XT_MATCH_MAC=y CONFIG_NETFILTER_XT_MATCH_MARK=y CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y CONFIG_NETFILTER_XT_MATCH_REALM=y CONFIG_NETFILTER_XT_MATCH_SCTP=y CONFIG_NETFILTER_XT_MATCH_STATE=y CONFIG_NETFILTER_XT_MATCH_STRING=y CONFIG_NETFILTER_XT_MATCH_TCPMSS=y CONFIG_NF_CONNTRACK_IPV4=y CONFIG_NF_CONNTRACK_PROC_COMPAT=y CONFIG_IP_NF_QUEUE=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_RECENT=y CONFIG_IP_NF_MATCH_ECN=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_MATCH_ADDRTYPE=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y CONFIG_IP_NF_TARGET_LOG=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_ECN=y CONFIG_IP_NF_TARGET_TTL=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_LOG=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y CONFIG_VLAN_8021Q=y CONFIG_NET_CLS_ROUTE=y
Installation d’iptables
# emerge -av net-firewall/iptables These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] net-firewall/iptables-1.4.2-r2 USE="-l7filter" 426 kB Total: 1 package (1 new), Size of downloads: 426 kB Would you like to merge these packages? [Yes/No]
Exemple de règles
# remise à zéro iptables -F iptables -X iptables -Z # par défaut, tout paquet non identifié sera ignoré iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # tout ce qui entre et sort de loopback est autorisé iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # on autorisé quelques connexions entrantes # pour l'HTTP, l'ICMP et le SSH iptables -A INPUT -p tcp -i eth0 --dport http -j ACCEPT iptables -A INPUT -p icmp -i eth0 -j ACCEPT iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT # on autorise des connexions sortantes pour # DNS iptables -A OUTPUT -p tcp -o eth0 --dport domain -j ACCEPT iptables -A OUTPUT -p udp -o eth0 --dport domain -j ACCEPT # NTP iptables -A OUTPUT -p tcp -o eth0 --dport ntp -j ACCEPT # RSYNC iptables -A OUTPUT -p tcp -o eth0 --dport rsync -j ACCEPT # HTTP iptables -A OUTPUT -p tcp -o eth0 --dport http -j ACCEPT # ICMP iptables -A OUTPUT -p icmp -o eth0 -j ACCEPT # les connexions déjà établies sont autorisées iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Mise en place
Il est dangeureux de configurer Netfilter sur un serveur distant, vous risquez en effet de vous enfermer dehors et de ne plus pouvoir vous y connecter par SSH.
Nous vous proposons la manipulation suivante afin d’éviter ce risque.
On doit sauvegarder les règles de filtrage (bien que vides) avant de lancer Netfilter pour la première fois.
# /etc/init.d/iptables stop # (au cas où) # /etc/init.d/iptables save # /etc/init.d/iptables start
On vérifie que le pare-feu n’a pas de règle.
# iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
On enregistre dans un fichier (nommé par exemple test_iptables) les lignes de l’exemple de règles de cet article, suivies de
sleep 10 /etc/init.d/iptables stop
# cat > test_iptables <<'EOF' # remise à zéro iptables -F iptables -X iptables -Z # par défaut, tout paquet non identifié sera ignoré iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # tout ce qui entre et sort de loopback est autorisé iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # on autorise quelques connexions entrantes # pour l'HTTP, l'ICMP et le SSH iptables -A INPUT -p tcp -i eth0 --dport http -j ACCEPT iptables -A INPUT -p icmp -i eth0 -j ACCEPT iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT # on autorise des connexions sortantes pour # DNS iptables -A OUTPUT -p tcp -o eth0 --dport domain -j ACCEPT iptables -A OUTPUT -p udp -o eth0 --dport domain -j ACCEPT # NTP iptables -A OUTPUT -p tcp -o eth0 --dport ntp -j ACCEPT # RSYNC iptables -A OUTPUT -p tcp -o eth0 --dport rsync -j ACCEPT # HTTP iptables -A OUTPUT -p tcp -o eth0 --dport http -j ACCEPT # ICMP iptables -A OUTPUT -p icmp -o eth0 -j ACCEPT # les connexions déjà établies sont autorisées iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT sleep 10 /etc/init.d/iptables save /etc/init.d/iptables stop EOF
Lancez ensuite le script.
# sh test_iptables &
Ce script charge donc les règles de filtrage établies, attend 10 secondes et reset ensuite les règles. Le script vous laisse la main pour que vous puissiez vérifier si votre connexion au serveur par SSH n'a pas été coupée et vous redonne l'accès au bout du délai choisi si quelque chose ne va pas.
Si cela vous convient (après avoir attendu les 10 secondes) :
# /etc/init.d/iptables start
La commande iptables -n -L vue précedemment affiche les règles actuellement chargées. Dans cet exemple :
# iptables -n -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:123 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:873 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
Il vous suffit d'entrer la commande suivante pour charger Netfilter au démarrage de votre serveur.
# rc-update add iptables default
Remarques et liens utiles
La commande pour configurer Netfilter pour l'IPv6 est ip6tables, qui reprend la même syntaxe qu'iptables.
Netfilter dispose de nombreux modules qui sont référencés et expliqués dans le manuel.
- Site du projet Netfilter (en anglais)
- Tutorial pour iptables sur Frozen Tux (en anglais)
- NetFilter et IPtables sur L'internet rapide et permanent
