philpep's blog - tag Packet Filter philpep's blog - tag Packet Filter rss http://blog.philpep.org fr Wed, 05 May 2010 00:00:00 GMT Pblog Mon nouveau jouet http://blog.philpep.org/post/Mon-nouveau-jouet http://blog.philpep.org/post/Mon-nouveau-jouet Wed, 05 May 2010 00:00:00 GMT <p>Pris un coup de folie et je me suis procuré le dernier joujou à la mode, un petit nokia n97. Les forfaits c'est vraiment du viol^Wvol, donc clairement je ne vous recommande pas ça, moi j'ai eu l'opportunité de ne pas le payer donc bon. Ce sera nettement plus convi quand il y aura un opérateur mobile valable avec <a href="http://blog.fdn.fr/post/2010/03/22/Pourquoi-l%E2%80%99Internet-mobile-n%E2%80%99est-PAS-Internet">du vrai internet</a>.</p> <p>En attendant tout ça j'ai quand même pu faire des choses sympa, faut dire que Nokia, contrairement à la pomme, laisse pas mal de liberté essentiellement parce qu'on peut installer tout ce qu'on veut sur la machine et ils fournissent tous les outils pour. J'ai le bestiau depuis seulement quelques jours donc j'ai pas encore trop réfléchi sur le coté <code>dev</code>, mais je pense qu'on peut sortir de la prison <code>Internet by orange</code> avec quelques tools réseau bien pensés.</p> <p>Unes des premières appli que j'ai testé c'est <a href="http://s2putty.sourceforge.net/">putty mobile</a>. En wifi sur le réseau local je passe par le port 22 tout marche normal. Seulement sur internet c'est pas sur le port 22 qu'il est mon serveur mais plutôt disons 1234, et avec <code>Internet by orange</code> forcément le port 1234 sortant ça pourrait bien être du contenu pédonazi et alors ça passe pas.</p> <p>Du coup je browse sur un de mes sites, je chope l'IP <code>80.10.46.66</code> de la passerelle nazie dans mes logs, comme c'est bien pensé l'IP de la passerelle change souvent et faut plutôt utiliser <code>80.10.46.0/24</code> (voir plus si ça se trouve).</p> <p>Un petit coup de <code>pf.conf</code> sur la box :</p> <div class="codehilite"><pre>nazis = &quot;80.10.46.0/24&quot; rdr pass proto tcp to port 1234 -&gt; $serv port ssh # Pour les gens normaux rdr pass proto tcp from $nazis to port ssh -&gt; $serv </pre></div> <p>Et taaadaam :</p> <p class="align-center"><img alt="putty symbian" src="http://static.philpep.org/media/public/Scr000005.jpg" /></p> <p>Sûrement à bientôt pour de nouvelles aventures <code>Internet By Orange</code>.</p> Astuce pf du jour http://blog.philpep.org/post/Astuce-pf-du-jour http://blog.philpep.org/post/Astuce-pf-du-jour Tue, 23 Feb 2010 14:09:07 GMT <p>J'ai la chance d'avoir une bibliothèque avec un rayon informatique bien rempli dans mon Université, dernièrement j'y ai emprunté <a href="http://www.eyrolles.com/Informatique/Livre/le-livre-de-packet-filter-9782212125160">ce bouquin</a>. Là dedans j'y ai vu une syntaxe pour décrire le réseau local que j'avais raté quand j'ai lu <a href="http://www.openbsd.org/faq/pf/fr/index.html">la doc</a> :</p> <div class="codehilite"><pre>ext_if = &quot;rl0&quot; # Au lieu de localnet = &quot;{ 192.168.0.0/24, 2a01:e35:2e58:9820::/64 }&quot; # On peut mettre localnet = $ext_if:network # Ou encore localnet = rl0:network </pre></div> <p><a href="http://blog.philpep.org/tag/Packet%20Filter">Pf</a> va lui même calculer le réseau local à l'aide de l'IP du netmask et du prefixe.</p> <p>Attention tout de même si vous avez plusieurs IP (v4 et v6) sur l'interface, ça peut produire des règles redondantes, en cas de doute :</p> <div class="codehilite"><pre>pfctl -sr </pre></div> <p>EDIT (27/02/10) : En fait quand il y a des alias sur l'IP il va les évaluer mais pour ne spécifier que l'adresses (sans les alias) on peut mettre $ext_if:network:0 </p> pfstat http://blog.philpep.org/post/pfstat http://blog.philpep.org/post/pfstat Sun, 06 Dec 2009 02:57:24 GMT <p>J'aime pas franchement les graphe les chiffres tout ça (j'entends déjà rire les gens qui me connaissent devant ce mensonge éhonté). Mais j'avoue que j'aime bien les stats donnée par <a href="http://www.benzedrine.cx/pfstat.html">pfstat</a> (le site est souvent down en ce moment). Ce petit soft récolte des statistiques temporelles sur <a href="/tag/Packet%20Filter">pf</a> et peut les cracher sous forme de graphe.</p> <p>Petit exemple tout de suite, ce graphe représente le traffic entrant/sortant (in/out) autorisé/bloqué (block in/block out) sur mon routeur pour les dernières 24h.</p> <p><img alt="stats solo" src="http://www.philpep.org/stats/solo_packets_day.jpg" /></p> <p>C'est assez interessant, il peut faire une multitude de graphes configurables, je vais pas poser ma conf ici parce que je l'ai honteusement pompée sur <a href="https://calomel.org/pfstat.html">calomel</a>. À noter que pfstat est aussi disponible en daemon (pfstatd), ça permet de générer les images des statistiques d'une autre machine. Il suffit de lancer pfstatd sur la machine ou l'on veut faire des statistiques, et lancer pfstat (dans cron par exemple) avec les options <code>-r host:port</code>.</p> <p>Vous pouvez voir <a href="http://www.philpep.org/stats/">ici</a> ce qui se passe sur mes deux modestes machines qui font exister philpep.org.</p> <p>EDIT 10 janvier 2010 : pfstat ne semble plus maintenu :/ , en tout cas il a du mal avec les dernières versions de pf. Bref les graphes que vous voyez sont <em>vieux</em></p> fail2ban sshd et pf http://blog.philpep.org/post/fail2ban-sshd-et-pf http://blog.philpep.org/post/fail2ban-sshd-et-pf Wed, 18 Nov 2009 18:28:10 GMT <p>Mon <code>/var/log/auth.log</code> est blindé de choses du genre :</p> <div class="codehilite"><pre>Nov 18 17:56:27 lenine sshd[49297]: Invalid user marcio from 24.17.93.35 Nov 18 17:56:27 lenine sshd[49297]: error: PAM: authentication error for illegal user marcio from 24.17.93.35 Nov 18 17:56:27 lenine sshd[49297]: Failed keyboard-interactive/pam for invalid user marcio from 24.17.93.35 port 63330 ssh2 Nov 18 17:58:05 lenine sshd[49312]: Address 92.126.194.108 maps to alfa.navsystem.ru, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT! Nov 18 17:58:05 lenine sshd[49312]: Invalid user marcio from 92.126.194.108 Nov 18 17:58:05 lenine sshd[49312]: error: PAM: authentication error for illegal user marcio from 92.126.194.108 Nov 18 17:58:05 lenine sshd[49312]: Failed keyboard-interactive/pam for invalid user marcio from 92.126.194.108 port 38920 ssh2 </pre></div> <p>C'est une attaque classique par dictionnaire mais distribuée. Ma seule défense pour l'instant c'est mon parre feu qui <a href="http://blog.philpep.org/post/Regles-pf-pour-bloquer-le-ssh-bruteforcing-et-le-deni-de-service">bloquait les bruteforces un peu trop rapides</a>. Alors même si pf en filtre quand même pas mal, les petits malins tournent sur plusieurs IPs pour faire un bruteforce moins visible.</p> <p>J'ai donc décidé de bloquer le reste avec <a href="http://www.fail2ban.org">fail2ban</a>, la conf par défaut n'est pas adapté à ma config, j'ai des besoin précis sur le filtre sshd et il faut que ça marche avec <a href="http://blog.philpep.org/tag/Packet%20Filter">pf</a>.</p> <p>L'install est toujours aussi simple :</p> <div class="codehilite"><pre># make -C /usr/ports/security/py-fail2ban install </pre></div> <p>La conf est dans <code>/usr/local/etc/fail2ban</code></p> <p>En premier lieu, créer l'action pour pf : </p> <p><code>action.d/pf.conf</code></p> <div class="codehilite"><pre>[Definition] actionstart = actionstop = actioncheck = actionban = pfctl -t flood -T add &lt;ip&gt; actionunban = pfctl -t flood -T del &lt;ip&gt; </pre></div> <p>Comme vous voyez on va largement utiliser les tables pf, il y a donc quelques modifs à faire dans votre <code>/etc/pf.conf</code> :</p> <div class="codehilite"><pre><span class="c"># La table</span> table &lt;flood&gt; persist <span class="c"># On laisse passer tout sauf les IP de &lt;flood&gt;</span> pass in inet proto tcp from ! &lt;flood&gt; to <span class="nv">$ext_if</span> port ssh </pre></div> <p>Ensuite on modifie le filtre <code>filter.d/sshd.conf</code> :</p> <div class="codehilite"><pre>[INCLUDES] before = common.conf [Definition] _daemon = sshd failregex = ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from &lt;HOST&gt;\s*$ ^%(__prefix_line)sAddress &lt;HOST&gt; .* POSSIBLE BREAK-IN ATTEMPT\s*$ ignoreregex = </pre></div> <p>Et on active le filtre dans <code>jail.conf</code> :</p> <div class="codehilite"><pre>[ssh-pf] enabled = true filter = sshd action = pf sendmail-whois[name=SSH, dest=root@localhost, sender=noreply@localhost] logpath = /var/log/auth.log maxretry = 1 bantime = 86400 </pre></div> <p>Ils sont bannis pour 1 jours (de quoi leur faire perdre beaucoup de temps). En prime pour chaque ban vous recevez le <code>whois</code> de l'IP concernée par mail.</p> <p>Finalement on oublie pas de lancer fail2ban :</p> <div class="codehilite"><pre># echo fail2ban_enable=\&quot;YES\&quot; &gt;&gt; /etc/rc.conf # /usr/local/etc/rc.d/fail2ban start </pre></div> <p>Ce qui pourrait être intéressant c'est de choper automatiquement les adresses mail <code>Abuse</code> du whois pour envoyer un mail au FAI du méchant pour lui dire tout ce qu'on pense de son client. Mais bon, on ne va pas non plus faire de délation à la HADOPI.</p> Limiter un utilisateur avec pf http://blog.philpep.org/post/Limiter-un-utilisateur-avec-pf http://blog.philpep.org/post/Limiter-un-utilisateur-avec-pf Fri, 11 Sep 2009 17:10:28 GMT <p>OpenBSD Packet Filter permet de filtrer les paquets suivant l'UID de provenance (et peut être même de destination mais ça nous intéresse moins.</p> <p>Vous avez un amis qui se connecte en ssh chez vous pour poser un irssi dans un GNU screen. C'est super sympa de votre part, seulement si on a pas une confiance totale en cet utilisateur il pourrait (lui ou un virus) se servir de son accès pour utiliser votre IP et balancer du spam, lancer une attaque de banque ou je ne sais quoi encore. Résultat : vous êtes responsable.</p> <p>L'idée est simple, nous allons filtrer le trafic sortant de cet utilisateur (de login fictif machin) en lui autorisant uniquement le port IRC 6667 :</p> <div class="codehilite"><pre>pass out on <span class="nv">$ext_if</span> proto tcp to port 6667 user machin tag TAG_MACHIN block out quick on <span class="nv">$ext_if</span> proto tcp all user machin ! tagged TAG_MACHIN </pre></div> <p>La première règle autorise le port 6667 sortant pour machin et tagge le paquet avec TAG_MACHIN. La deuxième bloque tout ce qui vient de machin et qui n'est pas taggé avec TAG_MACHIN. Ce qui fait exactement ce que l'on veut.</p> <p>Le mot clef quick permet a la règle d'être prise en compte immédiatement peu importe les règles suivantes (ce qui protège d'une éventuelle règle qui ferait tout passer ensuite).</p> <p>Pour continuer dans l'exemple, il peut être utile d'autoriser les query DNS pour cet utilisateur (si vous n'avez pas de serveur DNS en interne), ça se passe en 53/udp :</p> <div class="codehilite"><pre>pass out on <span class="nv">$ext_if</span> proto tcp to port 6667 user machin tag TAG_MACHIN pass out on <span class="nv">$ext_if</span> proto udp to port domain user machin tag TAG_MACHIN block out quick on <span class="nv">$ext_if</span> proto tcp all user machin ! tagged TAG_MACHIN </pre></div> <p>On peut même faire des listes sur les port et/ou utilisateurs :</p> <div class="codehilite"><pre><span class="nv">users</span> <span class="o">=</span> <span class="o">{</span> machin, truc <span class="o">}</span> pass out on <span class="nv">$ext_if</span> proto tcp to port <span class="o">{</span> 6667, http <span class="o">}</span> user <span class="nv">$users</span> tag TAG_USERS pass out on <span class="nv">$ext_if</span> proto udp to port domain user <span class="nv">$users</span> tag TAG_USERS block out quick on <span class="nv">$ext_if</span> proto tcp all user <span class="nv">$users</span> ! tagged TAG_USERS </pre></div> Bloquer le trafic sortant de ses jails avec packet filter http://blog.philpep.org/post/Bloquer-le-trafic-sortant-de-ses-jails-avec-packet-filter http://blog.philpep.org/post/Bloquer-le-trafic-sortant-de-ses-jails-avec-packet-filter Fri, 11 Sep 2009 17:04:18 GMT <p>Si comme moi vous utilisez une FreeBSD avec pleins de services/utilisateurs dans des jails, il vous est peut être arrivé de vouloir restreindre un peu plus le possibilité réseau dans vos jails. Par exemple empêcher qu'un de vos utilisateur (réel ou non) utilise votre IP pour faire des choses malsaine (un script qui envoie du spam par exemple).</p> <p>Pour cela j'utilise <a href="http://www.openbsd.org/faq/pf/">Packet filter</a> et ses <a href="http://www.openbsd.org/faq/pf/tagging.html">tags</a>. Le problème c'est qu'une fois que la NAT pour les jails est écrite, le paquet apparaît comme provenant de l'hôte et non de la jail. Comme toujours un bon fichier de conf vaut mieux qu'un long discourt :</p> <div class="codehilite"><pre><span class="nv">ext_if</span> <span class="o">=</span> <span class="s2">&quot;fxp0&quot;</span> <span class="c"># Network Description </span> <span class="nv">jails</span> <span class="o">=</span> <span class="s2">&quot;10.0.0.0/24&quot;</span> <span class="c"># Jails</span> <span class="nb">set </span>block-policy <span class="k">return</span> <span class="nb">set </span>skip on <span class="o">{</span> lo0, lo1 <span class="o">}</span> <span class="nb">set </span>loginterface <span class="nv">$ext_if</span> scrub in <span class="c"># Nat for jails, we tag these packets to make filtering on out packets</span> nat on <span class="nv">$ext_if</span> from <span class="nv">$jails</span> tag TAG_JAILS -&gt; <span class="nv">$ext_if</span> <span class="c"># Block rules</span> block log all <span class="c"># Pass out rules</span> pass out on <span class="nv">$ext_if</span> proto <span class="o">{</span> tcp, udp <span class="o">}</span> all ! tagged TAG_JAILS pass out on <span class="nv">$ext_if</span> proto tcp to port <span class="o">{</span> http ftp ircd 6697 domain 9418 <span class="o">}</span> tagged TAG_JAILS anchor <span class="s2">&quot;ftpsesame/*&quot;</span> on <span class="nv">$ext_if</span> <span class="c"># Antispoofing</span> antispoof log <span class="k">for</span> <span class="o">{</span> <span class="nv">$ext_if</span>, lo0 <span class="o">}</span> inet </pre></div> <p>Voilà, quand le paquet arrive sur la NAT, il est taggé avec TAG_JAIL et on effectue du filtrage ensuite sur ce tag, tout le trafic sortant passe pour les paquets qui ne proviennent pas des jails et le traffic qui provient des jails passe uniquement si le port de direction est autorisé. L'ancre "ftpsesame/*" est là pour autoriser le traffic sortant ftp, ce qui n'est pas aussi évident que l'on pense, voir <a href="/post/Packet-filter-et-ftp-sortant">ce billet</a>.</p> Packet filter et ftp sortant http://blog.philpep.org/post/Packet-filter-et-ftp-sortant http://blog.philpep.org/post/Packet-filter-et-ftp-sortant Fri, 11 Sep 2009 17:01:09 GMT <p>Comme j'ai expliqué dans <a href="/post/De-l-importance-de-filtrer-le-traffic-sortant">ce billet</a>, filtrer le traffic sortant est une bonne habitude à avoir, surtout pour un serveur qui utilise tout le temps les même ports sortant.</p> <p>Le problème c'est le protocole FTP qui a été crée a un moment où la sécurité n'existait pas encore et on se connectait en telnet sans mot de passe. FTP n'est pas fait pour passer les parre feu. Si la connection est initié sur le port 21 le transfert des données se fait sur un autre port qui est négocié soit par le serveur soit par le client (Mode actif et mode passif). Du coup rend le filtrage beaucoup plus compliqué puisqu'on ne connait pas d'avance le port qui va être utilisé.</p> <p>Après avoir lu la doc pour gerer le protocole FTP avec packet filter, j'ai essayé d'utiliser ftp-proxy et tous mes tests se sont soldés par un cuisant echec. Il semblerais que ftp-proxy ne soit pas adapté pour un client en ftp passif protégé par un parre feu local avec un filtrage strict des paquets sortants.</p> <p>J'ai donc trouvé par miracle dans les ports FreeBSD un petit programme qui permet de regler le problème sans trop de difficultés.</p> <p>(Remplacez rl0 par votre interface réseau)</p> <div class="codehilite"><pre>make -C /usr/ports/ftp/ftpsesame install clean <span class="nb">echo</span> <span class="s2">&quot;ftpsesame_enable=\&quot;YES\&quot;\nftpsesame_flags=\&quot;-i rl0\&quot;\n&quot;</span> &gt;&gt; /etc/rc.conf </pre></div> <p>Et la conf pf qui va avec :</p> <div class="codehilite"><pre><span class="c"># L&#39;interface connecté au réseau local</span> <span class="nv">ext_if</span> <span class="o">=</span> <span class="s2">&quot;rl0&quot;</span> <span class="c"># Les ports sortant autorisés</span> <span class="nv">out_tcp</span> <span class="o">=</span> <span class="s2">&quot;{ ssh http ftp https 1213 6600 8000 8021 9418 xmpp-client 5223 }&quot;</span> <span class="nv">out_udp</span> <span class="o">=</span> <span class="s2">&quot;{ domain }&quot;</span> <span class="c"># Options</span> <span class="nb">set </span>loginterface <span class="nv">$ext_if</span> <span class="nb">set </span>skip on lo0 scrub in <span class="c"># Filtering, on bloque tout et on passe ce qui est autorisé</span> block log all pass out on <span class="nv">$ext_if</span> proto icmp all pass out on <span class="nv">$ext_if</span> proto udp to port <span class="nv">$out_udp</span> pass out on <span class="nv">$ext_if</span> proto tcp to port <span class="nv">$out_tcp</span> <span class="c"># On charge les rêgles de ftpsesame</span> anchor <span class="s2">&quot;ftpsesame/*&quot;</span> on <span class="nv">$ext_if</span> <span class="c"># Antispoofing</span> antispoof log <span class="k">for</span> <span class="o">{</span> <span class="nv">$ext_if</span>, lo0 <span class="o">}</span> inet </pre></div> <p>Et hop :</p> <div class="codehilite"><pre><span class="sr">/usr/</span><span class="nb">local</span><span class="sr">/etc/</span><span class="n">rc</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">ftpsesame</span> <span class="n">start</span> <span class="n">pfctl</span> <span class="o">-</span><span class="n">f</span> <span class="sr">/etc/</span><span class="n">pf</span><span class="o">.</span><span class="n">conf</span> </pre></div> <p>Franchement je sais pas comment ftpsesame se débrouille mais ça marche impécablement.</p> De l'importance de filtrer le traffic sortant http://blog.philpep.org/post/De-l-importance-de-filtrer-le-traffic-sortant http://blog.philpep.org/post/De-l-importance-de-filtrer-le-traffic-sortant Fri, 11 Sep 2009 16:57:58 GMT <p>Bien souvent quand on lis des articles sur les milles et unes astuces pour sécuriser un peu plus sa machine on y retrouve très souvent l'idée de "fermer les ports" c'est à dire empecher un traffic entrant qui ne serait pas légitime.</p> <p>C'est une bonne pratique, voici quelques rappels de bas étages sur les sockets (pour ceux qui entendent ce mot pour la première fois).</p> <p>Pour que deux ordinateurs puissent communiquer il faut établir une connection, un tunel bidirectionnel dans lequel on peut lire et écrire des données. L'analogie humaine, une fois n'est pas coutume, est parfaitement adaptée ici. Quand vous discutez avec quelqu'un vous parlez (écrire) et vous écoutez (lire). En informatique un tel tunel s'appelle un socket. C'est un simple fichier que l'on doit créer sur les deux ordinateurs.</p> <p>Mais on ne crée pas une communication aussi simplement, il faut "brancher" nos sockets ensemble, si les humains ont du mal à communiquer avec plusieurs personnes à la fois l'ordinateur peut lui discuter avec environ 65000 de ses homologues en même temps. Pour celà on a crée la notion de port, c'est un nombre entre 1 et 65000 (et des poussières). Pour connecter nos deux sockets, il faut que chaque ordinateur connaisse :</p> <ol> <li>L'adresse de l'autre ordinateur, son IP</li> <li>Le port sur lequel va s'effectuer la communication</li> </ol> <p>Notez que les deux ports ne doivent pas forcement être les mêmes (d'ailleurs ce ne sont jamais les mêmes en pratique). Ensuite il y a la notion de client/serveur (qui est foireuse et c'est bien là dessus que je veux vous amener). C'est à dire que l'un des ordinateurs va jouer le role de serveur et l'autre de client, le serveur va mettre un socket sur écoute sur un certain port et le client va s'y connecter. Et là la communication est effective, nos deux amis peuvent écrire et lire des données qui seront envoyés a celui qui se trouve au bout du socket.</p> <p>Du point de vue du serveur, c'est un traffic entrant et pour le client c'est un traffic sortant. Mais c'est vraiment la seule chose qui différentie le client du serveur, la nature des données qui transitent n'ont rien à voir avec tout ça.</p> <p>Bloquer le traffic entrant permet de bloquer un éventuel intru du système qui mettrait un port sur écoute pour mieux controler votre machine à distance. Mais bloquer le traffic entrant n'est qu'une illusion de sécurité si on ne regarde pas ce qui se passe sur le traffic sortant. Comme je l'ai dit, la nature des données échangés n'a rien à voir et on pourrait très bien imaginer un programme ou le client executerait tout ce que lui dit le serveur.</p> <p>D'ailleurs bon nombre de virus fonctionnent en se connectant sur un serveur IRC pour communiquer avec celui qui dirige à distance l'ordinateur de l'internaute imprudent. Et c'est du traffic sortant.</p> <p>Si maintenant la paranoia vous guette, vous pouvez aller reconfigurer votre parre feu.</p> Regles pf pour bloquer le ssh bruteforcing et le deni de service http://blog.philpep.org/post/Regles-pf-pour-bloquer-le-ssh-bruteforcing-et-le-deni-de-service http://blog.philpep.org/post/Regles-pf-pour-bloquer-le-ssh-bruteforcing-et-le-deni-de-service Thu, 10 Sep 2009 22:06:56 GMT <p>Packet filter, le parre feu d'OpenBSD (disponible et installé dans FreeBSD et NetBSD) nous offre des options de filtrage avancées.</p> <p>Il est possible de contrer le ssh bruteforcing (tentative de trouver le mot de passe en testant une infinité de mots de passe) et le Déni de service (grand nombre de connexion à un serveur pour le faire exploser où empêcher les autres d'y accéder).</p> <p>Pour celà il faut un peu jouer avec max-src-conn , max-src-conn-rate et les tables pf.</p> <p>Voici un exemple commenté :</p> <div class="codehilite"><pre><span class="c"># Interface entrante</span> <span class="nv">ext_if</span> <span class="o">=</span> <span class="s2">&quot;fxp0&quot;</span> <span class="c"># On crée deux tables</span> table &lt;ssh_abuse&gt; persist table &lt;http_abuse&gt; persist <span class="c"># On bloque ceux qui sont dans la table sur les ports concernés</span> <span class="c"># Le &#39;quick&#39; permet d&#39;ignorer toute autre rêgle de filtrage </span> <span class="c"># concernant ces paquets</span> block in quick on <span class="nv">$ext_if</span> proto tcp from &lt;ssh_abuse&gt; port ssh block in quick on <span class="nv">$ext_if</span> proto tcp from &lt;http_abuse&gt; port http <span class="c"># si on a plus de 2 connection toutes les 10 secondes sur</span> <span class="c"># le port ssh, on rajoute l&#39;IP concernée dans la table ssh_abuse</span> pass in inet proto tcp to any port ssh flags S/SA keep state <span class="se">\</span> <span class="o">(</span>max-src-conn-rate 2/10, overload &lt;ssh_abuse&gt; flush global<span class="o">)</span> <span class="c"># Si on a plus de 100 connection avec cet IP ou plus de 20 connexion</span> <span class="c"># en 5 secondes, alors on met l&#39;IP concernée dans la table http_abuse</span> pass in inet proto tcp to any port http flags S/SA keep state <span class="se">\</span> <span class="o">(</span>max-src-conn 100, max-src-conn-rate 20/5, overload &lt;http_abuse&gt; flush<span class="o">)</span> </pre></div>