Introduction à iptables
iptables est un programme en ligne
de commande et en espace utilisateur utilisé pour configurer
l'ensemble de règles de filtrage de paquets des noyaux Linux 2.4 et
supérieurs
This package is known to build and work properly using an LFS 11.3
platform.
Informations sur le paquet
Dépendances de iptables
Facultatives
libpcap-1.10.3 (requis pour la prise en charge
de nfsypproxy), bpf-utils (requis pour
la prise en charge de Berkely Packet Filter), libnfnetlink
(requis pour la prise en charge de connlabel), libnetfilter_conntrack"
(requis pour la prise en charge de connlabel) et nftables
Notes utilisateur : https://wiki.linuxfromscratch.org/blfs/wiki/iptables
Configuration du
noyau
Sur Linux, on a un pare-feu via l'interface netfilter. Pour
utiliser iptables pour configurer
netfilter, les paramètres du noyau suivants sont requis :
[*] Networking support ---> [CONFIG_NET]
Networking Options --->
[*] Network packet filtering framework (Netfilter) ---> [CONFIG_NETFILTER]
[*] Advanced netfilter configuration [CONFIG_NETFILTER_ADVANCED]
Core Netfilter Configuration --->
<*/M> Netfilter connection tracking support [CONFIG_NF_CONNTRACK]
<*/M> Netfilter Xtables support (required for ip_tables) [CONFIG_NETFILTER_XTABLES]
<*/M> LOG target support [CONFIG_NETFILTER_XT_TARGET_LOG]
IP: Netfilter Configuration --->
<*/M> IP tables support (required for filtering/masq/NAT) [CONFIG_IP_NF_IPTABLES]
Ajoutez tous les protocoles de suivi de connexion que vous
utiliserez, ainsi que tous les protocoles que vous voulez utiliser
pour la prise en charge de leur détection dans la section
« Core Netfilter Configuration ». Les options ci-dessus
sont suffisantes pour lancer Créer un
pare-feu personnel avec iptables.
Installation de iptables
Note
L'installation ci-dessous n'inclut pas la construction de
quelques bibliothèques d'extension spécialisées qui exigent les
en-têtes raw dans le code source de Linux. Si vous souhaitez construire des
extensions supplémentaires (si vous n'êtes pas sûr, vous n'en
avez probablement pas besoin), vous pouvez regarder le fichier
INSTALL
pour voir un exemple de la
façon de modifier le paramètre KERNEL_DIR=
pour pointer vers le
code source de Linux. Remarquez
que si vous mettez à jour la version du noyau, il se peut que
vous deviez aussi recompiler iptables et que l'équipe BLFS n'a pas testé
l'utilisation des en-têtes du noyau raw.
Installez iptables en exécutant
les commandes suivantes :
./configure --prefix=/usr \
--disable-nftables \
--enable-libipq &&
make
Ce paquet n'a pas de suite de tests.
Maintenant, en tant qu'utilisateur root
:
make install
Explication des commandes
--disable-nftables
:
ce paramètre désactive la construction de la compatibilité
nftables.
--enable-libipq
: Ce
paramètre active la construction de libipq.so
qui peut être utilisé par certains
paquets extérieurs à BLFS.
--enable-nfsynproxy
: Ce paramètre
active l'installation de l'outil de configuration SYNPROXY de
nfsynproxy.
Configuration de iptables
Note
Dans les exemples de configuration suivants, LAN1 est utilisé pour
l'interface LAN et WAN1 pour l'interface externe
connectée à Internet. Vous devrez remplacer ces valeurs avec les
noms d'interfaces correspondants à votre système.
Pare-feu personnel
Un pare-feu personnel est conçu pour vous permettre d'accéder à
tous les services offerts sur internet, mais de garder votre
ordinateur sécurisé et vos données privées.
Voici une version légèrement modifiée de la recommandation de
Rusty Russell sur
le guide de Packet Filter de Linux 2.4. Elle est toujours
d'actualité pour les noyaux 5.x.
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Début de rc.iptables
# Insertion des modules de suivie de connection
# (inutile si vous les avez construit en dur dans le noyau)
modprobe nf_conntrack
modprobe xt_LOG
# Activation de la protection contre echo en broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Désactivation des paquets routés à la source
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
# Activation de la protection du cookie TCP SYN
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Désactivation de l'acceptation des redirections ICMP
echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects
# Ne pas envoyer de messages de redirection
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Abandon des paquets spoofés qui arrivent sur une interface si une réponse
# demanderait d'envoyer la réponse sur une autre interface.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Enregistrement des paquets avec des adresses impossibles.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
# être verbeux pour les adresses dynamiques (inutile pour les adresses IP statiques)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# désactivation de la notification de congestion explicite
# trop de routeurs les ignorent encore
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Appliquer un état connu
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Ces lignes se trouvent ici au cas où les règles seraient déjà mises en place et que le
# script est relancé à la volée. Nous voulons supprimer toutes les règles et
# les chaînes personnalisées préexistantes avant d'implanter de nouvelles règles.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Permettre les connections locales
iptables -A INPUT -i lo -j ACCEPT
# Libère la sortie sur toutes les interfaces vers n'importe quelle IP pour n'importe quel service
# (équivalent à -P ACCEPT)
iptables -A OUTPUT -j ACCEPT
# Permet au réponses aux connections déjà établie et permet de nouvelles connections
# liées à celles qui sont déjà établies
# (p. ex. le mode port de ftp)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Enregistrer tout le reste.
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
# Find de $rc_base/rc.iptables
EOF
chmod 700 /etc/rc.d/rc.iptables
Ce script est assez simple, il jette tout le trafic entrant dans
votre ordinateur s'il n'a pas été initié par votre ordinateur,
mais tant que vous vous contentez de surfer sur internet, vous ne
dépasserez pas les limites.
Si vous rencontrez régulièrement des délais lors de l'accès à des
serveurs FTP, regardez Example de BusyBox avec iptables
numéro 4.
Même si vous avez des démons ou des services qui tournent sur
votre système, ils seront inaccessibles de n'importe où en dehors
de l'ordinateur lui-même. Si vous voulez permettre l'accès aux
services sur votre machine, comme ssh ou ping, regardez Créer un
BusyBox avec iptables.
Routeur
masquant
Un pare-feu réseau a deux interface, l'une connectée à un
intranet, dans cet exemple LAN1 et l'autre connectée à
internet, ici WAN1.
Pour fournir le plus de sécurité au pare-feu lui-même,
assurez-vous qu'il n'y a pas de serveurs inutiles dessus comme
X11 et compagnie. En général, le
pare-feu lui-même ne devrait pas accéder à des services qui ne
sont pas de confiance (pensez à un serveur distant qui donne des
réponses qui font crasher un démon de votre système, ou pire, qui
implémente un vers via un dépassement de tampon).
cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh
# Début de rc.iptables
echo
echo "Vous utilisez la configuration d'exemple de mise en place d'un pare-feu"
echo "de Beyond Linux From Scratch."
echo "Cet exemple est loin d'être complet, il n'est conçu que"
echo "pour référence."
echo "La sécurité des pare-feux est un problème complexe qui dépasse la portée"
echo "des règles de configuration ci-dessous."
echo "Vous trouverez des compléments d'information"
echo "sur les pare-feux au chapitre 4 du livre BLFS."
echo "https://www.linuxfromscratch.org/blfs"
echo
# Insertion des modules iptables (inutile si vous les avez construits en dur dans le noyau).
modprobe nf_conntrack
modprobe nf_conntrack_ftp
modprobe xt_conntrack
modprobe xt_LOG
modprobe xt_state
# Activation de la protection contre echo en broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Désactivation des paquets routés à la source
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Activation de la protection du cookie TCP SYN
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Désactivation de l'acceptation des redirections ICMP
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Ne pas envoyer de messages de redirection
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Abandon des paquets spoofés qui arrivent sur une interface si une réponse
# demanderait d'envoyer la réponse sur une autre interface.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Enregistrement des paquets avec des adresses impossibles.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# être verbeux pour les adresses dynamiques (inutile pour les adresses IP statiques)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# désactivation de la notification de congestion explicite
# trop de routeurs les ignorent encore
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Appliquer un état connu
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Ces lignes se trouvent ici au cas où les règles seraient déjà mises en place et que le
# script est relancé à la volée. Nous voulons supprimer toutes les règles et
# les chaînes personnalisées préexistantes avant d'implanter de nouvelles règles.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Permettre les connections locales
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Permettre le transfert s'il est initié par l'intranet
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD ! -i WAN1 -m conntrack --ctstate NEW -j ACCEPT
# Effectuer le masquage
# (pas requis si l'intranet n'utilise pas des adresses IP privéesf intranet is not using private ip-addresses)
iptables -t nat -A POSTROUTING -o WAN1 -j MASQUERADE
# Tout enregistrer pour le débogage
# (dernière de toutes les règles, mais avant les règles de politique)
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD "
iptables -A OUTPUT -j LOG --log-prefix "FIREWALL:OUTPUT "
# Activation du transfert IP
echo 1 > /proc/sys/net/ipv4/ip_forward
EOF
chmod 700 /etc/rc.d/rc.iptables
Avec ce script votre intranet devrait être raisonnablement
sécurisé contre les attaques externes. Personne ne devrait être
capable d'initialiser une nouvelle connexion vers un service
interne et, s'il est masquant, le pare-feu rend votre intranet
invisible depuis internet. En plus, votre pare-feu devrait être
relativement sécurisé parce qu'aucun service attaquable ne tourne
dessus.
BusyBox
Ce scénario n'est pas très différent de Création d'un routeur masquant avec
iptables, mais en plus fournit des services à votre intranet.
C'est le cas par exemple si vous voulez administrer votre
pare-feu depuis un autre hôte sur votre intranet ou si vous
voulez l'utiliser comme proxy ou serveur de nom.
Soyez prudent. Chaque service activé rend votre configuration
plus complexe et votre pare-feu moins sécurisé. Vous vous exposez
au risque d'avoir un service mal configuré ou de lancer un
service avec un bogue exploitable. Un pare-feu ne devrait en
général faire tourner aucun service supplémentaire. Consultez
l'introduction de Création d'un routeur masquant avec
iptables pour plus de détails.
Si vous voulez ajouter un service interne comme un serveur Samba
ou un serveur de nom qui n'ont pas eux-même besoin d'accéder à
internet, les règles supplémentaires sont assez simples et
devraient toujours être acceptables du point de vue de la
sécurité. Ajoutez simplement les lignes suivantes au script
avant les règles de
journalisation.
iptables -A INPUT -i ! WAN1 -j ACCEPT
iptables -A OUTPUT -o ! WAN1 -j ACCEPT
Si des démons, comme squid, doivent accéder à internet, vous
pouvez ouvrir OUTPUT par défaut et restreindre INPUT.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT
Cependant, il n'est généralement pas recommandé de laisser OUTPUT
sans restriction. Vous perdez le contrôle sur les chevaux de
Troie qui aiment « appeler la maison » et une
redondance dans la sécurité au cas où vous auriez mal configuré
un service qui annoncerait sa présence au monde entier.
Pour cela, vous devriez restreindre INPUT et OUTPUT sur tous les
ports sauf ceux qui sont absolument nécessaires. Les ports à
ouvrir dépendent de vos besoins : vous les trouverez surtout
en regardant les accès échoués dans vos journaux.
Consultez les exemples suivants :
-
Squad crée un cache du web :
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED \
-j ACCEPT
-
Votre serveur de cache de noms de domaines (p. ex. named)
lance ses requêtes en UDP :
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
-
Si vous voulez pouvoir envoyer un ping à votre ordinateur
pour vous assurer qu'il est toujours lancé :
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
-
Si vous accéder
souvent à des serveurs FTP ou que vous tchattez en ligne,
vous pourriez remarquer des délais à cause
d'implémentations de ces démons qui tentent d'accéder à un
démon identd sur votre système pour obtenir des noms
d'utilisateur. Bien que se soit plutôt bénin, de nombreux
experts en sécurité recommandent de ne pas avoir un identd
sur sa machine parce qu'ils ont l'impression qu'il donne
trop d'information.
Pour éviter ces délais vous pouvez rejeter les requêtes
avec une réponse « tcp-reset » :
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
-
Pour enregistrer et jeter les paquets invalides (des
paquets qui arrivent après le délai d'attente de netfilter
ou certains types de scan réseau) ajoutez ces règles au
début de la chaîne :
iptables -I INPUT 0 -p tcp -m conntrack --ctstate INVALID \
-j LOG --log-prefix "FIREWALL:INVALID "
iptables -I INPUT 1 -p tcp -m conntrack --ctstate INVALID -j DROP
-
Tout ce qui vient de l'extérieur ne devrait pas avoir une
adresse privée, c'est une attaque courante par usurpation
d'IP :
iptables -A INPUT -i WAN1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i WAN1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i WAN1 -s 192.168.0.0/16 -j DROP
Il y a d'autres adresses que vous pourriez vouloir
jeter : 0.0.0.0/8, 127.0.0.0/8,224.0.0.0/3 (multicast
et expérimental), 169.254.0.0/16 (réseaux lien-local) et
192.0.2.0/24 (réseau de test défini par l'IANA).
-
Si votre pare-feu est un client DHCP, vous devez autoriser
ces paquets :
iptables -A INPUT -i WAN1 -p udp -s 0.0.0.0 --sport 67 \
-d 255.255.255.255 --dport 68 -j ACCEPT
-
Pour simplifier le débogage et être honnête avec ceux qui
voudraient accéder à un service que vous avez désactivé, à
dessein ou par erreur, vous pouvez utiliser REJECT pour les
paquet qui sont jetés.
Évidemment, vous devez faire cela directement après
l'enregistrement dans les journaux sur les toutes dernières
lignes avant que les paquets ne soient jetés par la
politique.
iptables -A INPUT -j REJECT
Ce ne sont que des exemples pour vous montrer certaines
possibilités du pare-feu sur Linux. Consultez la page de manuel
d'iptables. Vous y trouverez bien plus d'informations. Les
numéros de port requis pour cela se trouvent dans /etc/services
au cas où vous ne les trouviez
pas dans vos journaux par essai et erreur.
Script de
démarrage
Pour paramétrer le pare-feu d'iptables au démarrage, installez le
script d'initialisation /etc/rc.d/init.d/iptables
fourni dans le paquet
blfs-bootscripts-20230101.
make install-iptables