[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.
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, reinitialiser les règles à partir d'un fichier :
~~~
# iptables-save > /tmp/IPT
# ip6tables-save > /tmp/IP6T
# iptables-restore /tmp/IPT
# ip6tables-restore /tmp/IPT
~~~
## 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).
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 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`)
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") :