J'ai besoin d'ajouter une règle à iptables pour bloquer les connexions à un port TCP depuis Internet.
Puisque mon script peut être appelé plusieurs fois et qu'il n'y a pas de script pour supprimer la règle, je souhaite vérifier si une règle iptables existe déjà avant de l'insérer - sinon, il y aura beaucoup de règles dup dans la chaîne INPUT.
Comment puis-je vérifier si une règle iptables existe déjà?
Réponses:
Il y a une nouvelle
-C --check
option dans les versions récentes d'iptables.Pour les anciennes versions d'iptables, j'utiliserais la suggestion de Garrett:
la source
La nouvelle
-C
option n'est pas satisfaisante car elle est ouverte à une condition de concurrence TOCTTOU (time to check of time). Si deux processus tentent d'ajouter la même règle à peu près au même moment,-C
ils ne seront pas protégés contre son ajout deux fois.Donc, ce n'est vraiment pas mieux que la
grep
solution. Un travail de traitement de texte précis sur la sortie deiptables-save
peut fonctionner de manière aussi fiable que possible-C
, car cette sortie est un instantané fiable de l’état des tables.Ce qu'il faut, c'est une
--ensure
option qui vérifie et ajoute une règle de manière atomique uniquement si elle n'existe pas déjà. De plus, il serait bien 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, siiptables -I 1
est utilisé pour créer une règle en tête d'une chaîne, mais que cette règle existe déjà à la septième position, la règle existante doit passer à la première position.Sans ces fonctionnalités, je pense qu'une solution de contournement possible consiste à écrire une boucle de script shell basée sur ce pseudo-code:
Ce code pourrait tourner autour; cela ne garantit pas que deux coureurs ou plus seront absents dans un nombre déterminé d'itérations. Des périodes de repos exponentielles aléatoires pourraient être ajoutées pour y remédier.
la source
Cela peut sembler un peu en arrière, 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 recevoir un message similaire à:
iptables: Bad rule (une règle de correspondance existe-t-elle dans cette chaîne?)
Ensuite, ajoutez simplement votre règle comme d'habitude:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
la source
Juste la liste et la recherche?
... ou peu importe la règle spécifiée. Si vous l'utilisez
grep -q
, rien ne sera généré et vous pouvez simplement vérifier la valeur de retour avec$?
la source
iptables-save|grep $ip
plutôt car c'est un format plus facilement analysable, en particulier dans un script. Vous pouvez également vérifier la syntaxe exacte de la commande si vous le souhaitez.iptables-save|grep $ip
pourrait très bien correspondre à plusieurs règles. Peutiptables-save
-être pourrait-il être utilisé pour vérifier la spécification complète de la règle, mais cela reste un peu un bidouillage: le format renvoyé pariptables-save
peut ne pas correspondre exactement à la règle du script.iptables-save
peut générer les options dans un ordre différent, ajouter des éléments (du type-m tcp
), etc.iptables --list
allez essayer de résoudre des ports connus. Donc, assurez-vous de cela avant de grep pour un port.Pourquoi ne pas ajouter, puis supprimer, les doublons, comme décrit dans https://serverfault.com/questions/628590/duplicate-iptable-rules . La plus facile (pour les lignes adjacentes) semble être
la source
Pour éviter les règles en double de votre script, ajoutez la ligne ci-dessous.
Première fois que la commande ci-dessus est exécutée, nous observons le message ci-dessous
Ceci est juste pour information. Mais la seconde moitié de la commande ferait en sorte d’ajouter la règle.
la source