Ajouter des règles de filtrage dans iptables "à la volée" et les rendre permanentes

Administration : un scénario "type" pour ajouter des règles de filtrage dans iptables et les rendre permanentes (Linux Debian 9 - Stretch).

, par clem

1. Scénario type :

Sur un serveur Debian 9 qui fait tourner Syncthing, logiciel de synchronisation de dossiers et fichiers (cf https://syncthing.net/), une des méthodes possibles pour permettre d’avoir plusieurs utilisateurs qui synchronisent leurs données en parallèle est d’attribuer un port spécifique à chaque utilisateur. Cela permet d’avoir des instances multiples de Syncthing sans aucun échange possible entre les utilisateurs.
La difficulté de cette méthode est que, par défaut, le firewall du serveur, Iptables, bloque tous les ports qui ne sont pas explicitement ouverts. L’idée est donc d’ouvrir un port spécifique dans le firewall à chaque fois que l’on ajoute une instance de Syncthing afin que le nouvel utilisateur puisse communiquer avec le serveur.

2. Ajouter une règle dans Iptables : ouverture d’un port en entrée/sortie

Par exemple ici on souhaite ouvrir le port 22001 :

  1. iptables -A OUTPUT -p tcp --dport 22001 -j ACCEPT
  2. iptables -A INPUT -p tcp --dport 22001 -j ACCEPT

Télécharger

On vérifie alors que les nouvelles règles permettant les entrées et sorties sur le port 22001 sont opérationnelles :

  1. iptables -L

doit alors retourner quelque chose comme (seules les lignes qui nous intéressent sont affichées) :

  1. Chain INPUT (policy DROP)
  2. target     prot opt source               destination
  3. [...]
  4. ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:22001
  5.  
  6. Chain OUTPUT (policy DROP)
  7. target     prot opt source               destination
  8. [...]
  9. ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:22001
  10.  
  11. ACCEPT     all  --  anywhere             anywhere

Télécharger

On a donc bien entrée/sortie autorisées sur le port 22001.

NB : autre modification courante lors d’essais et bricolages sur iptables :
autoriser l’IP xx.yyy.zzz.aa quelque soit le protocole et le port :

  1. iptables -A INPUT -s xx.yyy.zzz.aa -j ACCEPT
  2. iptables -A OUTPUT -d xx.yyy.zzz.aa -j ACCEPT

Télécharger

3. Rendre les règles permanentes : iptables-save

La commande iptables ... utilisée ci-dessus à pour caractéristique que les règles sont bien intégrées dans le firewall et opérationnelles immédiatement (c’est le principe même de fonctionnement de fail2ban par exemple) mais qu’en revanche ces règles seront perdues au prochain redémarrage d’iptable (typiquement au prochain redémarrage du serveur).
Pour rendre les règles permanentes il faut alors les sauvegarder dans le fichier /etc/iptables/rules.v4 ou /etc/iptables/rules.v6 (selon qu’il s’agit de règles spécifiques pour IP V4 ou V6).
Deux méthodes sont possibles :

  • méthode 1 : éditer le fichier voulu : par exemple
    1. nano /etc/iptables/rules.v4

    puis copier/coller les règles dans le fichier (AVANT la dernière ligne)

  • méthode 2 : enregistrer iptables tel qu’il est avec l’utilitaire iptables-save :
    1. iptables-save > /etc/iptables/rules.v4

    Attention ! si vous utilisez fail2ban ou un autre utilitaire qui ajoute temporairement des règles à iptables, il est conseillé de réinitialiser les règles à l’état de démarrage pour ne pas se retrouver à sauvegarder les règles temporaires.
    Pour cela on va "redémarrer" iptables AVANT de créer les nouvelle règles permanentes :

    1. service netfilter-persistent restart

    commande qui sera donc faite avant celles du paragraphe 2 qui ajoutent les règles.

Références :