iptables-1.8.5

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.

Ce paquet est connu pour se construire correctement sur une plateforme LFS-9.1.

Informations sur le paquet

Dépendances de iptables

Facultatives

libpcap-1.9.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" et (requis pour la prise en charge de connlabel) nftables

Notes utilisateur : http://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 Creating a Personal Firewall With 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 lançant les commandes suivantes :

./configure --prefix=/usr      \
            --sbindir=/sbin    \
            --disable-nftables \
            --enable-libipq    \
            --with-xtlibdir=/lib/xtables &&
make

Ce paquet n'est pas fourni avec une suite de tests.

Maintenant, en tant qu'utilisateur root :

make install &&
ln -sfv ../../sbin/xtables-legacy-multi /usr/bin/iptables-xml &&

for file in ip4tc ip6tc ipq xtables
do
  mv -v /usr/lib/lib${file}.so.* /lib &&
  ln -sfv ../../lib/$(readlink /usr/lib/lib${file}.so) /usr/lib/lib${file}.so
done

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.

--with-xtlibdir=/lib/xtables : s'assure que tous les modules d'Iptables sont installés dans le répertoire /lib/xtables.

--enable-nfsynproxy : Ce paramètre active l'installation de l'outil de configuration SYNPROXY de nfsynproxy.

ln -sfv ../../sbin/xtables-legacy-multi /usr/bin/iptables-xml : Assure que le lien symbolique de iptables-xml est relatif.

Configuration de iptables

[Note]

Note

Dans les exemples de configuration suivants, LAN1 est utilisé pour l'interface interne au réseau local 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 3.x.

cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh

# Begin rc.iptables

# Insert connection-tracking modules
# (not needed if built into the kernel)
modprobe nf_conntrack
modprobe xt_LOG

# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route

# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects

# Do not send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# Drop Spoofed Packets coming in on an interface, where responses
# would result in the reply going out a different interface.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# Log packets with impossible addresses.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians

# be verbose on dynamic ip-addresses  (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

# disable Explicit Congestion Notification
# too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn

# Set a known state
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

# These lines are here in case rules are already in place and the
# script is ever rerun on the fly. We want to remove all rules and
# pre-existing user defined chains before we implement new rules.
iptables -F
iptables -X
iptables -Z

iptables -t nat -F

# Allow local-only connections
iptables -A INPUT  -i lo -j ACCEPT

# Free output on any interface to any ip for any service
# (equal to -P ACCEPT)
iptables -A OUTPUT -j ACCEPT

# Permit answers on already established connections
# and permit new connections related to established ones
# (e.g. port mode ftp)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Log everything else. What's Windows' latest exploitable vulnerability?
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "

# End $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 BusyBox with iptable example number 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 Creating a BusyBox With 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

# Begin rc.iptables

echo
echo "You're using the example configuration for a setup of a firewall"
echo "from Beyond Linux From Scratch."
echo "This example is far from being complete, it is only meant"
echo "to be a reference."
echo "Firewall security is a complex issue, that exceeds the scope"
echo "of the configuration rules below."
echo "You can find additional information"
echo "about firewalls in Chapter 4 of the BLFS book."
echo "http://www.linuxfromscratch.org/blfs"
echo

# Insert iptables modules (not needed if built into the kernel).

modprobe nf_conntrack
modprobe nf_conntrack_ftp
modprobe xt_conntrack
modprobe xt_LOG
modprobe xt_state

# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Don't send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# Drop Spoofed Packets coming in on an interface where responses
# would result in the reply going out a different interface.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# Log packets with impossible addresses.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

# Be verbose on dynamic ip-addresses  (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

# Disable Explicit Congestion Notification
# Too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn

# Set a known state
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

# These lines are here in case rules are already in place and the
# script is ever rerun on the fly. We want to remove all rules and
# pre-existing user defined chains before we implement new rules.
iptables -F
iptables -X
iptables -Z

iptables -t nat -F

# Allow local connections
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow forwarding if the initiated on the intranet
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD ! -i WAN1 -m conntrack --ctstate NEW       -j ACCEPT

# Do masquerading
# (not needed if intranet is not using private ip-addresses)
iptables -t nat -A POSTROUTING -o WAN1 -j MASQUERADE

# Log everything for debugging
# (last of all rules, but before policy rules)
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 "

# Enable IP Forwarding
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 Creating a Masquerading Router With 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 Creating a Masquerading Router With 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-20200404.

make install-iptables

Contenu

Programmes installés: ip6tables, ip6tables-restore, ip6tables-save, iptables, 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-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 2020-06-17 20:37:28 +0000