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.0
platform.
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 Creating a
Personal Firewall With 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 lançant les
commandes suivantes :
./configure --prefix=/usr \
--disable-nftables \
--enable-libipq &&
make
Ce paquet n'est pas fourni avec une 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 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 5.x.
install -v -dm755 /etc/systemd/scripts
cat > /etc/systemd/scripts/iptables << "EOF"
#!/bin/sh
# Begin /etc/systemd/scripts/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.
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
# End /etc/systemd/scripts/iptables
EOF
chmod 700 /etc/systemd/scripts/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 iptables 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).
install -v -dm755 /etc/systemd/scripts
cat > /etc/systemd/scripts/iptables << "EOF"
#!/bin/sh
# Begin /etc/systemd/scripts/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
# The following sections allow inbound packets for specific examples
# Uncomment the example lines and adjust as necessary
# Allow ping on the external interface
#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
# Reject ident packets with TCP reset to avoid delays with FTP or IRC
#iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# Allow HTTP and HTTPS to 192.168.0.2
#iptables -A PREROUTING -t nat -i WAN1 -p tcp --dport 80 -j DNAT --to 192.168.0.2
#iptables -A PREROUTING -t nat -i WAN1 -p tcp --dport 443 -j DNAT --to 192.168.0.2
#iptables -A FORWARD -p tcp -d 192.168.0.2 --dport 80 -j ACCEPT
#iptables -A FORWARD -p tcp -d 192.168.0.2 --dport 443 -j ACCEPT
# End /etc/systemd/scripts/iptables
EOF
chmod 700 /etc/systemd/scripts/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.
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.
Unité Systemd
Pour paramétrer le pare-feu d'iptables au démarrage, installez
l'unité iptables.service
fournie
dans le paquet blfs-systemd-units-20210819.
make install-iptables