iptables-1.8.8

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

[Note]

Note

Development versions of BLFS may not build or run some packages properly if dependencies have been updated since the most recent stable versions of the book.

Informations sur le paquet

Dépendances de iptables

Facultatives

libpcap-1.10.1 (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]

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]

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.

[Note]

Note

Expliquer comment protéger un serveur qui offre des services sur internet n'est pas du ressort de ce document. Consultez les références dans la section intitulée « Informations supplémentaires » pour plus d'informations.

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-20220722.

make install-iptables

Contenu

Programmes installés: ip6tables, ip6tables-apply, ip6tables-legacy, ip6tables-legacy-restore, ip6tables-legacy-save, ip6tables-restore, ip6tables-save, iptables, iptables-apply, iptables-legacy, iptables-legacy-restore, iptables-legacy-apply, iptables-restore, iptables-save, iptables-xml, nfsynproxy (facultatif) et xtables-multi
Bibliothèques installées: libip4tc.so, libip6tc.so, libipq.so, libiptc.so et libxtables.so
Répertoires installés: /lib/xtables et /usr/include/libiptc

Descriptions courtes

iptables

est utilisé pour paramétrer, maintenir et inspecter les tables de règles de filtrage de paquets IP du noyau Linux

iptables-apply

est une manière plus sure de mettre à jour iptables à distance

iptables-legacy

est utilisé pour interagir avec iptables par l'ensemble de commandes obsolète

iptables-legacy-restore

est utilisé pour restaurer un ensemble de règles iptables obsolètes

iptables-legacy-save

est utilisé pour sauvegarder un ensemble de règles iptables obsolètes

iptables-restore

est utilisé pour restaurer des tables IP à partir de données spécifiées sur STDIN. Utilise la redirection E/S fournie par votre shell pour lire un fichier

iptables-save

est utilisé pour envoyer le contenu d'une table IP dans un format facilement analysable vers STDOUT. Utilisez la redirection E/S fournie par votre shell pour écrire dans un fichier

iptables-xml

est utilisé pour convertir la sortie de iptables-save au format XML. L'utilisation de la feuille de style iptables.xslt convertit le fond XML au format iptables-restore

ip6tables*

sont un ensemble de commandes pour IPV6 qui sont similaires aux commandes iptables vu précédemment

nfsynproxy

(facultatif) outil de configuration. La cible synproxy facilite la manipulation des grands afflux de SYN sans les lourdes pertes de performance imposées par le suivi des connexions dans de tels cas

xtables-multi

est un binaire qui se comporte en fonction du nom par lequel il est appelé

Last updated on