web-dev-qa-db-fra.com

Existe-t-il une règle permettant à iptables de limiter le nombre de paquets SYN qu'une plage d'adresses IP sur 24 peut envoyer?

Comment puis-je bloquer des blocs IP de classe C entiers lorsqu'ils envoient trop de paquets SYN à mon serveur Ubuntu 12.04?

Exemple de ce que je vois lors d'une attaque par inondation SYN:

image

Chaque adresse IP différente n’envoie qu’un seul paquet SYN, de sorte que le pare-feu ne le bloque pas. Mais la gamme 192.132.209.* dans son ensemble envoie beaucoup de paquets SYN en très peu de temps.

5
Salvatorelab

Prenant 10.0.0.0/24 comme exemple, quelque chose comme

iptables -A INPUT -p tcp -s 10.0.0.0/24 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

devrait faire le travail et est assez auto-descriptif, de sorte que cela ne nécessite aucune explication, je suppose. Voici un bon article, facile à lire, sur la façon de prévenir TCP attaques par inondation SYN: Linux Iptables Limitez le nombre d'attaques de connexion TCP/Syn-flood entrantes . Il explique plus en détail les options et fournit une méthode plus étendue (journalisation, chaîne séparée, etc.).

Je ne vois pas l'état actuel de votre iptables à partir d'ici, vous pouvez donc l'ajouter en haut de la chaîne INPUT ou l'intégrer correctement dans vos scripts actuels.


Dans les commentaires que vous avez mentionnés, vous recherchez un moyen automatisé de rechercher ces blocs IP. Eh bien, je devrais simplement laisser de côté le filtre d'adresse source dans la commande (-s 10.0.0.0/8), afin que la limite s'applique au monde entier.

4
gertvdijk

J'ai trouvé une solution similaire. Pas exactement ce que je voulais, mais très similaire:

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT --reject-with tcp-reset

Limite les nouvelles connexions TCP (port 80) à 20 par bloc de classe C. Je l'ai trouvé ici:
Exemple: limitations de la classe C

1
Salvatorelab

Adresse IP de classe C: 192.0.0.0 à 223.255.255.255.

Dans ce cas, l'option --connlimit-mask doit être 192.0.0.0/3 en notation CIDR.

Si vous spécifiez un masque de 24, il s'appliquera également aux classes A et B. Vous devez utiliser la notation CIDR pour spécifier la classe à coup sûr.

--connlimit-mask 192.0.0.0/24 
0
Garfield