Howto netfilter
- Documentation : https://netfilter.org/documentation/
netfilter est la couche de firewalling sous Linux, contrôlable via les commandes iptables
et ip6tables
, ou plus récemment avec la commande nft
(que nous n’utilisons pas encore). Sur les serveurs, nous utilisons notre script minifirewall permettant une gestion simple d’un firewall local.
Installation
# apt install iptables
# iptables --version
iptables v1.6.0
# modinfo iptable_filter
filename: /lib/modules/4.9.0-6-amd64/kernel/net/ipv4/netfilter/iptable_filter.ko
description: iptables filter table
author: Netfilter Core Team <coreteam@netfilter.org>
license: GPL
depends: x_tables,ip_tables
retpoline: Y
intree: Y
vermagic: 4.9.0-6-amd64 SMP mod_unload modversions
parm: forward:bool
Utilisation basique
Lister les règles dans les 3 tables filter/nat/mangle :
# iptables -L -nvt filter --line-number
# iptables -L -nvt nat --line-number
# iptables -L -nvt mangle --line-number
# ip6tables -L -nvt filter --line-number
# ip6tables -L -nvt nat --line-number
# ip6tables -L -nvt mangle --line-number
Interdire toutes les connexions venant de l’IP 192.0.2.66 :
# iptables -I INPUT -s 192.0.2.66 -j DROP
Renvoyer les connexions extérieures vers un port à un autre port (avec 192.0.2.42 l’IP du serveur local) :
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to 192.0.2.42:22
Désactiver toutes les règles et laisser tout passer :
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -F -t filter
# iptables -F -t nat
# iptables -F -t mangle
Sauvegarder les règles courantes dans un fichier, réinitialiser les règles à partir d’un fichier :
# iptables-save > /tmp/IPT
# ip6tables-save > /tmp/IP6T
# iptables-restore /tmp/IPT
# ip6tables-restore /tmp/IP6T
minifirewall
minifirewall est un script Shell permettant une gestion simple d’un firewall local, idéal pour un serveur dédié (virtualisé ou non).
Installation minifirewall
# [ -e /etc/default/minifirewall ] && cp /etc/default/minifirewall /etc/default/minifirewall.old
# wget https://gitea.evolix.org/evolix/minifirewall/raw/branch/master/minifirewall.conf -O /etc/default/minifirewall
# wget https://gitea.evolix.org/evolix/minifirewall/raw/branch/master/minifirewall -O /etc/init.d/minifirewall
# chmod 700 /etc/init.d/minifirewall
# chmod 600 /etc/default/minifirewall
# insserv /etc/init.d/minifirewall
Configuration minifirewall
On peut ensuite gérer la configuration via le fichier /etc/default/minifirewall
.
- Il faut adapter la variable INT avec l’interface réseau principale
- Si l’IPv6 n’est pas actif, il faut préciser IPv6=off
Pour les règles en entrée, tout est coupé et il faut définir :
- les variables SERVICESTCP1 et SERVICESUDP1 pour les ports publics en IPv4 et IPv6
- 2 catégories d’adresses IPv4 : les adresses de confiance TRUSTEDIPS et les adresses privilégiées PRIVILEGIEDIPS
- pour les ports semi-publics, on utilise SERVICESTCP2 et SERVICESUDP2 ouverts aux adresses PRIVILEGIEDIPS
- pour les ports privés, on utilise SERVICESTCP3 et SERVICESUDP3 ouverts aux adresses TRUSTEDIPS
- les variables SERVICESTCP1p et SERVICESUDP1p ne servent pas, sauf si on a créé une chaîne IPTables spécifique NEEDRESTRICT
Pour les règles en sortie, tout est coupé et on peut autoriser facilement les ports les plus classiques :
DNSSERVEURS='0.0.0.0/0'
pour autoriser toutes les requêtes DNS (en IPv4)HTTPSITES='0.0.0.0/0'
pour autoriser toutes les requêtes en sortie vers le port 80 (en IPv4)- etc.
Pour tout le reste (règles en IPv6, sortie sur des ports spécifiques), cela s’ajoute via des règles spécifiques en fin de fichier :
- Pour autoriser toutes les requêtes en sortie vers le port 80 en IPv6 :
ip6tables -A INPUT -i $INT -p tcp --sport 80 --match state --state ESTABLISHED,RELATED -j ACCEPT
- Pour autoriser en sortie vers le port 636 d’un serveur extérieur :
iptables -A INPUT -p tcp --sport 636 --dport 1024:65535 -s ssl.evolix.net -m state --state ESTABLISHED,RELATED -j ACCEPT
Note : pour autoriser un port en entrée, on n’utilisera pas de règle spécifique mais les variables dédiées en début de fichier
Note : pour autoriser un port en sortie, la règle à ajouter paraît contre-intuitive car les paquets en sortie sont déjà tous autorisés (sauf en UDP) : on autorise en fait les paquets de retour (
INPUT
) qui correspondent à des paquets déjà émis en sortie (--state ESTABLISHED,RELATED
)
Pour redémarrer ou stopper le firewall :
# /etc/init.d/minifirewall restart
# /etc/init.d/minifirewall stop
FAQ
Bannir une adresse IP
En cas de besoin de bannir temporairement une adresse IP 192.0.2.66 :
# iptables -I INPUT -s 192.0.2.66 -j DROP
NAT bidirectionnel
# iptables -t nat -A PREROUTING -i eth0 -d IP_publique -j DNAT --to-destination 192.0.2.1
# iptables -t nat -A POSTROUTING -o eth0 -s 192.0.2.1 -j SNAT --to-source IP_publique
Autoriser toute une interface
Lorsqu’un serveur dispose de plusieurs interfaces, dont une pour un réseau local privé, on peut autoriser tout le trafic sur cette interface (ici “eth1”) :
# iptables -A INPUT -i eth1 -j ACCEPT
Autoriser la sortie sur un port
Exemple si on a un serveur Munin centralisé, il a besoin de joindre les munin-node :
# iptables -A INPUT -p tcp --sport 4949 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
Redirection du port 80 en sortie vers un proxy local
# iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner --uid-owner proxy -j ACCEPT
# iptables -t nat -A OUTPUT -p tcp --dport 80 -d 192.0.2.42 -j ACCEPT
# iptables -t nat -A OUTPUT -p tcp --dport 80 -d 127.0.0.1 -j ACCEPT
# iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
FTP Passif
# iptables -A INPUT -p tcp --dport 60000:61000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Test des ports TCP
Pour tester l’ouverture d’un port TCP en sortie, on peut utiliser http://portquiz.net/ qui écoute sur tous les ports TCP possibles :
$ telnet portquiz.net 42
Trying 52.47.209.216...
Connected to portquiz.net.
Escape character is '^]'.
Tout autoriser en sortie (IPv4)
Si l’on veut tout autoriser en sortie (TCP, UDP), voici la règle à ajouter :
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT