Amélioration de la doc minifirewall dans HowtoNetfilter
This commit is contained in:
parent
d30adc7f71
commit
71694fbad2
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue