Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/06/2012, à 11:44

t55555

IPTABLES - Bloquer les scans de port

Bonjour,

J’essaie depuis quelques jours de permettre à mon pare-feu de détecter certains scans de port pour pouvoir les rediriger par la suite (vers des HoneyPots en faite). Actuellement j'essaie simplement de les bloquer.
Ce que je fait est tout simple, je bloque les IP qui essayent d'ouvrir plus d'une vingtaine de connexion TCP avec le flag SYN à 1 et les autres à 0 à la seconde. Cette IP sera bloqué pendant 15 secondes pour faciliter mes tests

Le script fonctionne, mais l'IP est totalement bloqué et je suis obligé de relancé le script si je veux la débloqué.

Donc j'aurais plusieurs questions à vous poser :
1) Cette méthode vous parrait-elle être la bonne pour détecter et bloquer les scans de port ? En connaissez vous une meilleur, plus adapté ?

2) Auriez vous une idée sur la méthode que je pourrait utiliser pour que l'IP soit débloqué au bout de 15 secondes ?

3) Dois-je utiliser "-m recent" depuis le début de la connexion tcp jusqu’à son analyse ?


Voici une partie de mon script : (eth0 = 192.168.168.0; eth1 = 10.0.0.0)

iptables -t nat -F
iptables -t nat -X

## On bloque toutes autres paquets
iptables -P INPUT DROP
iptables -P OUTPUT DROP
#iptables -P FORWARD DROP

## Loopback
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT

## On bloque toutes ip ayant essayer une attaque SYN et on met à jour la
## liste et l'attaque et de nouveau ban pour 15 secondes
iptables -I FORWARD -m recent --name Attaque_Syn -j LOG --log-prefix="Ip_Banned"
iptables -I FORWARD -m recent --name Attaque_Syn --update --seconds 15 -j DROP

## Création de la chaine Syn_Flood qui rajoute l'IP à la liste Attaque_Syn
## et reset de la connexion '"--reject-with tcp-reset
iptables -N Syn_FLood
iptables -I SYn_FLood -m recent --set -name Attaque_Syn -p tcp -j REJECT --reject-with tcp-reset

## Routeur + NAT
iptables -t nat -I POSTROUTING -o eth0 -s 10.0.0.0/24 -j SNAT --to-source 192.168.1.14

## Création de la chaine TesT_Scan et redirection des paquets vers cette ## chaine
iptables -N Test_Scan
iptables -I FORWARD -p tcp -j Test_Scan

## On redirige vers la chaine Syn_Flood si l'on detecte un scan de port
iptables -I Test_Scan -p tcp --tcp-flags ALL SYN -i eth1 -o eth0 -m limit --limit 20/s -j ACCEPT
iptables -I Test_Scan -m state --state NEW -p tcp --tcp-flags ALL SYN -i eth1 -o eth0 -m limit --limit 5/minute -j LOG --log-prefix="SYn_FLood"
iptables -I Test_Scan -m state --state NEW -p tcp --tcp-flags ALL SYN -i eth1 -o eth0 -j Syn_FLood

Merci par avance pour vos réponses !

Hors ligne

#2 Le 11/06/2012, à 13:21

Yann

Re : IPTABLES - Bloquer les scans de port

Salut!

Je dit peut etre une ânerie, mais j'ai toujours utilisé iptables -A au lieu de iptables -I pour rajouter une règle iptables à une chaine. D'après la doc, le -I insère en tête de chaine - donc je comprends pas bien la gueule de ta chaine Test_Scan - tu pourrais faire un iptables -L ?

Sinon j'avoue que je connaissais pas le -m recent, ca a l'air fun - un instant j'ai cru que le set avait quelque chose à voir avec "ipset", qui fait quelque chose de sensiblement similaire (mais pas de tag automatique comme ce module) - mais c'est apparement distinct.

D'après la doc, pour limiter la durée:
       --seconds seconds
              This option must be used in conjunction with one of --rcheck or --update. When  used,  this  will  narrow  the
              match to only happen when the address is in the list and was seen within the last given number of seconds.

C'est pas exactement ce que tu veux, vu que ca va la bannir que apres 15 secondes où l'IP n'a PAS ETE VUE sad

Pour débloquer l'IP, j'imagine que tu as déjà essayé sans succès le --remove ?

Un petit détail sinon: ton truc bloque toute IP qui fait plus de 20 SYN sur n'importe quel port en moins d'une seconde - attention aux false positives, je sais pas, par exemple, comment se comporte un HTTPd sans keepalive de ce côté, par exemple avec un gros réseau natté type université smile  Mais sinon ca me parait pas mal. Rajoute une ligne de log peut etre?


Et pourtant moi, jsuis pas du genre délicat,
Dans un coin de la musse, j'ai posé mon matelas
- Paulo Anarkao

Hors ligne

#3 Le 12/06/2012, à 12:22

t55555

Re : IPTABLES - Bloquer les scans de port

Salut !

Yann a écrit :

Je dit peut etre une ânerie, mais j'ai toujours utilisé iptables -A au lieu de iptables -I pour rajouter une règle iptables à une chaine.

Oui tu à certainement raison, le -A est le plus approprier pour ceux que je veux faire. Je viens donc de changer mes règles.

Yann a écrit :

D'après la doc, pour limiter la durée:
       --seconds seconds
              This option must be used in conjunction with one of --rcheck or --update. When  used,  this  will  narrow  the
              match to only happen when the address is in the list and was seen within the last given number of seconds.
C'est pas exactement ce que tu veux, vu que ca va la bannir que apres 15 secondes où l'IP n'a PAS ETE VUE sad

Non justement cela ne fait pas tout à fait ceux que je souhaite, dés que l'IP est revu par le FW, elle remet le compteur à 15.
Je n'ai pas trouver d'info pour pouvoir mettre un compteur de 15 secondes sans pour autant réinitialiser le compteur à chaque fois qu'il vois l'ip ... Il fraudais que le décompte ne se fasse qu'a partir du moment ou il n'y à plus dépassement de 20 syn à la seconde.
Si tu à une idée, je suis preneur.

Yann a écrit :

Un petit détail sinon: ton truc bloque toute IP qui fait plus de 20 SYN sur n'importe quel port en moins d'une seconde - attention aux false positives, je sais pas, par exemple, comment se comporte un HTTPd sans keepalive de ce côté, par exemple avec un gros réseau natté type université smile

C'est vrai j'y est pensais. Mais ce que je compte faire, c'est rediriger en priorité les scan venant de l'extérieur, donc dés que l'IP externe tente de scanner mon serveur web (que je compte intégré en DMZ) elle est directement rediriger, après il y a le problème de l'IP Spoofing qui me fait peur mais je peux ensuite intégré des whitelist en début du script pour éviter ce genre de problème.
Par la suite, peut-être que je me trompe mais, si j’intégrai un serveur DNS et que je bloque également les IP qui flood + de 20 paquet UDP à la seconde je risque de me retrouver avec des faux positifs et donc un serveur DNS banni. Alors, soit j'autorise le serveur DNS à passer cette limite et j'autorise donc les scan udp de mon réseau, soit je met le serveur DNS sur le FW et je bloque directement les clients qui essayent de flood... Ou alors il y a d'autres moyens auquel je n'ai pas pensais.

Yann a écrit :

Rajoute une ligne de log peut etre?

En faite cette ligne me le fait : iptables -I Test_Scan -m state --state NEW -p tcp --tcp-flags ALL SYN -i eth1 -o eth0 -m limit --limit 5/minute -j LOG --log-prefix="SYn_FLood"

Et puis en plus le module recent me stocke les IP (100 au total) dans le fichier /proc/net/xt_recent/Attaque_Syn.

Voila, merci !

Hors ligne

#4 Le 12/06/2012, à 12:40

sorrodje

Re : IPTABLES - Bloquer les scans de port

Je suis un nul en iptables mais par contre je connais portsentry qui fait ce job de ban des scanneurs de port . smile

Dernière modification par sorrodje (Le 12/06/2012, à 12:40)


Utilisateur Debian/Ubuntu depuis 2008 - http://sorrodje.alter-it.org

Hors ligne

#5 Le 14/06/2012, à 01:59

Yann

Re : IPTABLES - Bloquer les scans de port

Bonsoir T55555,

T'as réussi finalement? Jette un oeil à ca, peut être ca va t inspirer, j ai bidouillé un peu, c est non testé..

## Routeur + NAT
iptables -t nat -I POSTROUTING -o eth0 -s 10.0.0.0/24 -j SNAT --to-source 192.168.1.14

## Création de la chaine TesT_Scan et redirection des paquets vers cette ## chaine
iptables -N Test_Scan
iptables -I FORWARD -p tcp -j Test_Scan

# Syn_flood, on arrive ici en cas de nouveau port/scan et/ou synflood
iptables -N Syn_FLood
# Dans ce cas, On logue avec un petit limit
iptables -I FORWARD -m recent --name Attaque_Syn  -m limit --limit 5/minute -j LOG --log-prefix="SYn_FLood"
# Et on flague la source pour 15 secondes (verifier syntaxe, au pire faire en 2 commandes)
iptables -I SYn_FLood -m recent --set -name Attaque_Syn --update --seconds 15 -p tcp -j REJECT --reject-with tcp-reset


# Si la source est déjà flaguée Attaque_syn, on REJECT, sans reset le computeur - le timeout continuera de décroitre
iptables -I FORWARD -m recent --name Attaque_Syn  -j REJECT

# Sinon, et si on a pas affaire a un synflood, on accepte
iptables -I Test_Scan -p tcp --tcp-flags ALL SYN -i eth1 -o eth0 -m limit --limit 20/s -j ACCEPT

# OK, si on arrive ici c'est qu on a affaire a un synflood, et que la source est non taguée
# Soit il s agit d un nouveau syn flood / port scan de quelqu un qui etait deja banni et dont le timeout a expiré
# Soit il s agit d une nouvelle personne
# Dans tous les cas on logue le synflood, et on retourne dans la chain syn_flood
# la chaine synflood va reinitialiser le compteur, et rebannir la personne
iptables -I Test_Scan -m state --state NEW -p tcp --tcp-flags ALL SYN -i eth1 -o eth0 -j Syn_FLood


Et pourtant moi, jsuis pas du genre délicat,
Dans un coin de la musse, j'ai posé mon matelas
- Paulo Anarkao

Hors ligne

#6 Le 18/06/2012, à 19:35

t55555

Re : IPTABLES - Bloquer les scans de port

Salut,

Et bien je pense avoir réussi, merci de m'avoir proposer ton script mais en faite il existe une option que je ne connaissais pas (--rcheck) qui va dont checké l'adresse IP source pour savoir si il y à u pendant les 15 dernières secondes cette adresse IP source. Au bout de 15 secondes, elle est bien ré-autorisé.

J'ai donc remplacé --update par --rcheck et le tout à fonctionner.

Maintenant je vais devoir continuer et améliorer ça en essayant de faire comme de la redirection vers des adresses IP aléatoires (Sachant que je voudrais que l'adresse IP soit rediriger vers la même adresse pendant une période prédéfinie mais qu’après cette période, en cas de nouveau scan il se retrouve à communiquer avec une autre machine).
Si quelqu'un à des idées je suis preneur smile

Merci !

Hors ligne