--- categories: linux network firewall title: Howto netfilter ... * Documentation : [netfilter](https://netfilter.org/) 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](https://forge.evolix.org/projects/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 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](https://forge.evolix.org/projects/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/init.d/minifirewall # wget https://gitea.evolix.org/evolix/minifirewall/raw/branch/master/minifirewall -O # 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 ## 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 ~~~