Comment faire expirer les règles iptables?

18

Quelqu'un m'a dit que c'était possible, mais je ne trouve rien sur google ou sur les pages de manuel.

J'ai besoin d'interdire les adresses IP pendant un certain temps, puis je les ai automatiquement supprimées.

HappyDeveloper
la source

Réponses:

18

Si vous voulez que iptables supprime complètement la règle par lui-même, vous ne pourrez pas le faire, à ma connaissance. Quel est le but de cela? Si vous avez besoin d'une sorte d'interdiction temporaire automatique, la solution standard est fail2ban .

Vous pouvez également utiliser un travail cron pour supprimer la règle que vous ajoutez, ou mieux, si vous voulez le faire de manière interactive, un attravail:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

Jetez également un œil au recentmodule d'iptables. Cela avec son --secondsoption peut être utile, selon vos besoins réels. man iptablespour plus d'informations.

Eduardo Ivanec
la source
oh wow le travail 'at' a fière allure. Puis-je le combiner avec nohup et &? Comment?
HappyDeveloper
Pas besoin d'utiliser nohup - le travail at est exécuté indépendamment du terminal que vous avez utilisé pour le créer. Cela signifie qu'il est exécuté dans un shell qui n'hérite pas de vos variables d'environnement, soit dit en passant, et c'est /bin/shpar défaut. Mais ce ne sera probablement pas un problème dans ce cas.
Eduardo Ivanec
9

Mettez un commentaire avec un horodatage (probablement secondes depuis l'époque) dans les règles. Balayez régulièrement les règles expirées.

Notez que le noyau Linux le plus récent prend en charge le chargement dynamique des adresses IP dans un cache consulté par des règles iptables au lieu de règles iptables directes.

Exemple:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Vous pouvez bien sûr iptables -D INPUT $1au lieu d'imprimer la commande.

Seth Robertson
la source
bonne idée. Je ne sais pas comment faire la partie de balayage cependant, je penserai ..
HappyDeveloper
+1 Très bonne idée, peut-être pas la plus simple mais définitivement soignée.
Kyle Smith
1
@HappyDeveloper: Exemple fourni pour ajouter / balayer
Seth Robertson
1
Haha je devais juste faire ça aussi, j'ai utilisé awk pour mon nettoyage: iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'où les règles sont faites comme:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Kyle Smith
Mes 2 cents en perl:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
tuomassalo
5

iptables a une méthode pour ajouter automatiquement des adresses IP à une liste si les conditions définies par l'utilisateur sont remplies. J'utilise les éléments suivants pour éviter les tentatives de piratage automatisées sur mon port ssh:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Cela permet de limiter les tentatives automatisées d'accès au serveur en limitant les tentatives de connexion de la même adresse IP à une toutes les 60 secondes.

Si vous souhaitez autoriser un nombre défini de tentatives dans un laps de temps, tel que 4 en 5 minutes, et en cas d'échec, puis les mettre sur liste noire pour une période plus longue, comme 24 heures, vous pouvez faire quelque chose comme:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

Dans ce qui précède, nous créons 2 chaînes; "ssh" et "black", et 2 listes; "timer" et "blacklist".

Brièvement; la dernière chaîne montrée ci-dessus est la "porte" dans la chaîne ssh.

  • La règle 1 dans la chaîne ssh vérifie si l'IP source est dans la liste "liste noire". Si tel est le cas, la connexion est interrompue et le minuteur de liste noire de 24 heures est redémarré. Si la règle 1 est fausse, nous passons à la règle 2.
  • La règle 2 de la chaîne ssh vérifie si l'IP source a effectué plus de 4 tentatives de connexion en 5 minutes. Si c'est le cas, il envoie le paquet à la chaîne "noire" où il est ajouté à la liste "liste noire". La chaîne "noire" abandonne alors la connexion, et nous avons terminé.
  • La règle 3 de la chaîne "ssh" n'est atteinte que si les règles 1 et 2 sont fausses. Si c'est le cas, le paquet est ACCEPTÉ et l'adresse IP source est ajoutée à la liste "temporisateur" afin que nous puissions surveiller la fréquence des tentatives de connexion.

L'option "--reap" indique au noyau de rechercher dans la liste et de purger tous les éléments plus anciens que la limite de temps définie; 5 minutes pour la liste "timer", et 24 heures pour la liste "blacklist".

remarque: les espaces supplémentaires sont pour la lisibilité et sont facultatifs dans votre script shell.

Glen
la source
3

IPTables a une fonctionnalité spécialement conçue pour cela: IP Set. Vous faites la règle une fois et elle persiste comme d'habitude mais elle vérifie dans un ensemble d'ips (ou ports) les correspondances. Ce qui est cool, c'est que cet ensemble peut être mis à jour de manière dynamique et efficace sans perturber le reste du pare-feu.

Le site principal , exemples .

Donc, pour l'utiliser, vous devrez toujours utiliser atou cronplanifier la suppression.

Allen
la source
2

Vous pouvez utiliser fail2ban pour interdire les adresses IP et configurer la durée pendant laquelle une adresse sera interdite.

user9517 pris en chargeGoFundMonica
la source
2

Comme quelqu'un l'a déjà dit: vous devez utiliser l'ipset pour cette fonctionnalité.

l'ipset peut ajouter une adresse IP avec une valeur de temporisation. Une fois le délai expiré, l'enregistrement serait automatiquement supprimé de l'ipset.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Il s'agit de la meilleure façon de contrôler ce comportement.

Navern
la source
0

J'ai besoin d'interdire les adresses IP pendant un certain temps, puis je les ai automatiquement supprimées.

Vous pouvez essayer le suivant

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
la source
0

Selon ce que vous voulez accomplir exactement, les modules netfilter récent ou horaire peuvent être utilisés pour accomplir cela.

Les deux sont documentés dans la page de manuel iptables .

TimS
la source