Login Logout

Howto netfilter

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://forge.evolix.org/projects/minifirewall/repository/revisions/master/raw/minifirewall.conf" -O /etc/default/minifirewall
# wget "https://forge.evolix.org/projects/minifirewall/repository/revisions/master/raw/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

Pour plus d’informations, voir https://forge.evolix.org/projects/minifirewall/wiki

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