52 votes

Comment vérifier si une règle iptables existe déjà ?

Je dois ajouter une règle à iptables pour bloquer les connexions à un port tcp à partir d'Internet.

Comme mon script peut être appelé plusieurs fois et qu'il n'y a pas de script pour supprimer la règle, je veux vérifier si une règle iptables existe déjà avant de l'insérer - sinon il y aura beaucoup de règles dupliquées dans la chaîne INPUT.

Comment vérifier si une règle iptables existe déjà ?

57voto

user151699 Points 1

Il existe un nouveau -C --check dans les versions récentes d'iptables.

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

Pour les versions plus anciennes d'iptables, j'utiliserais la suggestion de Garrett :

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"

13voto

Kaz Points 2554

La nouvelle -C n'est pas satisfaisante, car elle ouvre la voie à une condition de course entre le moment de la vérification et le moment de l'utilisation (TOCTTOU). Si deux processus tentent d'ajouter la même règle à peu près au même moment, -C ne les empêchera pas de l'ajouter deux fois.

Il n'est donc pas plus performant que le grep solution. Un travail de traitement de texte précis sur la sortie de iptables-save peut fonctionner de manière aussi fiable que -C puisque ce résultat est un instantané fiable de l'état des tables.

Ce qu'il faut, c'est un --ensure qui vérifie atomiquement et ajoute une règle uniquement si elle n'existe pas déjà. De plus, il serait bon que la règle soit déplacée à la position correcte où une nouvelle règle serait insérée si elle n'existait pas déjà ( --ensure-move ). Par exemple, si iptables -I 1 est utilisé pour créer une règle à la tête d'une chaîne, mais que cette règle existe déjà en septième position, alors la règle existante doit être déplacée dans la section première position.

Sans ces fonctionnalités, je pense qu'une solution de contournement possible consiste à écrire une boucle Shell Shell basée sur ce pseudo-code :

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I 

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

Ce code peut tourner en rond ; il ne garantit pas que deux coureurs ou plus seront éliminés dans un nombre fixe d'itérations. Il est possible d'ajouter des périodes de sommeil exponentielles aléatoires pour y remédier.

8voto

recurse Points 246

Cela peut sembler un peu à l'envers, mais cela fonctionne pour moi - Essayez d'abord de supprimer la règle.

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;

Vous devriez obtenir un message similaire à :

iptables : Mauvaise règle (existe-t-il une règle correspondante dans cette chaîne ?)

Il vous suffit ensuite d'ajouter votre règle comme à l'accoutumée :

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;

4voto

Timmy Points 3625

Il suffit de dresser une liste et de la rechercher ?

iptables --list | grep $ip

... ou de la manière dont vous avez spécifié la règle. Si vous utilisez grep -q il ne produira rien, et vous pouvez simplement vérifier la valeur de retour avec $?

3voto

Pour éviter de dupliquer les règles de votre script, ajoutez la ligne ci-dessous.

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

La première fois que la commande ci-dessus est exécutée, nous observons le message suivant

iptables : Mauvaise règle (existe-t-il une règle correspondante dans cette chaîne ?).

Il s'agit d'une simple information. Mais la seconde moitié de la commande permettrait d'ajouter la règle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X