diff --git a/HowtoNetfilter.md b/HowtoNetfilter.md index 908c5583..08ee742e 100644 --- a/HowtoNetfilter.md +++ b/HowtoNetfilter.md @@ -97,6 +97,8 @@ Sauvegarder les règles courantes dans un fichier, réinitialiser les règles à [minifirewall](https://gitea.evolix.org/evolix/minifirewall/) est un script Shell permettant une gestion simple d'un firewall local, idéal pour un serveur dédié (virtualisé ou non). +À partir de la version `22.03`, minifirewall dispose d'une configuration principale `/etc/default/minifirewall` uniquement déclarative et d'un système d'inclusion automatique de ce qui est dans `/etc/minifirewall.d/` + ### Installation minifirewall ~~~ @@ -105,46 +107,197 @@ Sauvegarder les règles courantes dans un fichier, réinitialiser les règles à # 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 +# mkdir /etc/minifirewall.d +# chmod 700 /etc/minifirewall.d # insserv /etc/init.d/minifirewall ~~~ -### Configuration minifirewall +### Configuration déclarative -On peut ensuite gérer la configuration via le fichier `/etc/default/minifirewall`. +On peut 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** +* Il faut adapter la variable `INT` avec l'interface réseau principale 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** +* 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. +* `DNSSERVEURS='0.0.0.0/0 ::/0'` pour autoriser toutes les requêtes DNS (en IPv4 et IPv6) +* `HTTPSITES='0.0.0.0/0 ::/0'` pour autoriser toutes les requêtes en sortie vers le port 80 (en IPv4 et IPv6) +* … -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 : +Il est possible de configurer un proxy http sortant (par exemple Squid). +La variable `PROXY` active ou désactibe le mécanisme depuis le firewall. +`PROXYPORT` indique le port à utiliser pour le forward des paquets. +`PROXYBYPASS` indique la liste des IP de destination pour lesquelles on ne passe pas par le proxy. + +~~~{shell} +# Proxy (Squid) +PROXY='on' +# (proxy port) +PROXYPORT='8888' +# (destinations that bypass the proxy) +PROXYBYPASS="${INTLAN} 127.0.0.0/8" +~~~ + +Il est possible de configurer les autorisations pour les serveurs de backup, en ajoutant des couples `IP:PORT` dans la variable `BACKUPSERVERS`. + +~~~{shell} +# Backup servers +BACKUPSERVERS='192.168.10.1:1234 192.168.10.2:5678' +~~~ + +Plusieurs autres variables sont disponibles pour affiner la configuration kernel (via `sysctl`) : + +~~~{shell} +# In most cases, the default values set by minifirewall are good. +# If you really know what you are doing, +# you can uncomment some lines and customize the value. + +# Set 1 to ignore broadcast pings (default) +# SYSCTL_ICMP_ECHO_IGNORE_BROADCASTS='1' + +# Set 1 to ignore bogus ICMP responses (default) +# SYSCTL_ICMP_IGNORE_BOGUS_ERROR_RESPONSES='1' + +# Set 0 to disable source routing (default) +# SYSCTL_ACCEPT_SOURCE_ROUTE='0' + +# Set 1 to enable TCP SYN cookies (default) +# SYSCTL_TCP_SYNCOOKIES='1' + +# Set 0 to disable ICMP redirects +# SYSCTL_ACCEPT_REDIRECTS='0' +# SYSCTL_SEND_REDIRECTS='0' + +# Set 1 to enable Reverse Path filtering (default) +# Set 0 if VRRP is used +# SYSCTL_RP_FILTER='1' + +# Set 1 to log packets with inconsistent address (default) +# SYSCTL_LOG_MARTIANS='1' +~~~ + +Ces variables sont en général à laisser telles-quelles. +Attention cependant à `SYSCTL_RP_FILTER` qu'il faut mettre à `0` lorsqu'on utilise VRRP. + +### Configuration par inclusion + +Tous les fichiers présents dans `/etc/minifirewall.d` sont automatiquement inclus et exécutés au démarrage de minifirewall, par ordre alphanumérique, en excluant les fichiers contenant des points dans leur nom. + +On peut y mettre des commandes shell arbitraires pour appliquer des règles spécifiques. + +Quelques fonctions shell sont disponibles : + +~~~ +# Within included files, you can use those helper functions : +# * is_ipv6_enabled: returns true if IPv6 is enabled, or false +# * is_docker_enabled: returns true if Docker mode is eabled, or false +# * is_proxy_enabled: returns true if Proxy mode is enabled , or false +~~~ * 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 entrée, on n'utilisera pas de règle spécifique mais les variables dédiées dans la configuration principale > *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`) +### IPv6 -Pour redémarrer ou stopper le firewall : +Si on souhaite désactiver le support IPv6, ça se fait via la variable `IPv6=off` + +Dans tous les cas il est conseillé de mettre les IPv4 et IPv6 dans les variables concernées. Les IPv6 seront ignorées si c'est désactivé. + +En IPv4, l'autorisation globale est `0.0.0.0/0`. l'équivalent en IPv6 est `::/0`. + +### Docker + +#### Général + +La variable générale `DOCKER` permet de définir si minifirewall doit tenir compte de Docker. +C'est surtout pour éviter de purger les règles injectées par Docker lors de l'arrêt ou du redémarrage de minifirewall. + +#### Docker → host + +Si on souhaite autoriser des conteneurs à communiquer via le réseau avec d'autres processus hors Docker sur le serveur, il faut autorise ces communications de manière explicite. _TODO: documenter avec des exemples et explications._ + +#### Docker Swarm + +Si on utilise Docker Swarm sur plusieurs serveurs, il faut une configuration particulière pour que la communication inter-nœuds se fasse bien. + +~~~{shell} +# interface par laquelle les nœuds communiquent +SWARM_INT=eno10 + +## Pour chaque autre serveur de la Swarm (10.0.0.1, 10.0.0.2…) : +NODE_IP=10.0.0.1 +/sbin/iptables -I INPUT -i ${SWARM_INT} -p tcp -s ${NODE_IP} --dport 2377 -m comment --comment "Allow incomming docker swarm (management TCP) from ${NODE_IP}" -j ACCEPT +/sbin/iptables -I INPUT -i ${SWARM_INT} -p tcp -s ${NODE_IP} --sport 2377 -m state --state ESTABLISHED,RELATED -m comment --comment "Allow outgoing docker swarm (management TCP) to ${NODE_IP}" -j ACCEPT + +/sbin/iptables -I INPUT -i ${SWARM_INT} -p tcp -s ${NODE_IP} --dport 7946 -m comment --comment "Allow incomming docker swarm (inter-node TCP) from ${NODE_IP}" -j ACCEPT +/sbin/iptables -I INPUT -i ${SWARM_INT} -p tcp -s ${NODE_IP} --sport 7946 -m state --state ESTABLISHED,RELATED -m comment --comment "Allow outgoing docker swarm (inter-node TCP) to ${NODE_IP}" -j ACCEPT + +/sbin/iptables -I INPUT -i ${SWARM_INT} -p udp -s ${NODE_IP} --dport 7946 -m comment --comment "Allow incomming docker swarm (inter-node UDP) from ${NODE_IP}" -j ACCEPT +/sbin/iptables -I INPUT -i ${SWARM_INT} -p udp -s ${NODE_IP} --sport 7946 -m state --state ESTABLISHED,RELATED -m comment --comment "Allow outgoing docker swarm (inter-node UDP) to ${NODE_IP}" -j ACCEPT + +/sbin/iptables -I INPUT -i ${SWARM_INT} -p udp -s ${NODE_IP} --dport 4789 -m comment --comment "Allow incomming docker swarm (network UDP) from ${NODE_IP}" -j ACCEPT +/sbin/iptables -I INPUT -i ${SWARM_INT} -p udp -s ${NODE_IP} --sport 4789 -m state --state ESTABLISHED,RELATED -m comment --comment "Allow outgoing docker swarm (network UDP) to ${NODE_IP}" -j ACCEPT + +## Une seule fois +/sbin/iptables -I OUTPUT -o ${SWARM_INT} -p udp --dport 4789 -m comment --comment "Allow outgoing docker swarm (network UDP)" -j ACCEPT +/sbin/iptables -I OUTPUT -o ${SWARM_INT} -p udp --dport 7946 -m comment --comment "Allow outgoing docker swarm (inter-node UDP)" -j ACCEPT ~~~ -# /etc/init.d/minifirewall restart -# /etc/init.d/minifirewall stop + +### Commandes (start, stop…) + ~~~ +# /etc/init.d/minifirewall help +minifirewall Firewall designed for standalone server + +Usage: minifirewall [COMMAND] + +Commands + start Start minifirewall + safe-start Start minifirewall, with baground safety checks + stop Stop minifirewall + restart Stop then start minifirewall + safe-restart Restart minifirewall, with background safety checks + status Print minifirewall status + reset Reset iptables tables + check-active-config Check if active config is up-to-date with stored config + version Print version and exit + help Print this message and exit +~~~ + +Il est possible de redémarrer le firewall en mode interactif avec une protection contre le blocage : + +~~~ +# /etc/init.d/minifirewall safe-restart +sourcing `/etc/default/minifirewall' +WARNING: current state is different than persisted state, check /var/run/minifirewall_state_diff +minifirewall stopping +flushing all rules and accepting everything +minifirewall stopped +minifirewall starting +sourcing `/etc/minifirewall.d/zzz-custom' +sourcing `/etc/minifirewall.d/zzzz-ban' +minifirewall started +INFO: rules have changed since latest start, check /var/run/minifirewall_state_diff +Minifirewall will be stopped in 30 seconds if you do nothing. +Remove `/var/run/minifirewall_safety.lock' or type anything to keep minifirewall started: +~~~ + +Il faut alors aller retirer le fichier de lock (par n'importe quel moyen) ou saisir et valider n'importe quoi au clavier. + +Si on ne le fait pas dans les 30 secondes, le firewall sera stoppé pour redonner la main à l'utilisateur. ## FAQ