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.

Mots-clefs :, , ,