<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Univers Libre - pf</title>
    <subtitle>Yet another sysadmin&#39;s personal blog</subtitle>
    <link rel="self" type="application/atom+xml" href="https://univers-libre.net/tags/pf/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://univers-libre.net"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2013-09-05T22:19:19+00:00</updated>
    <id>https://univers-libre.net/tags/pf/atom.xml</id>
    <entry xml:lang="en">
        <title>Limiter le nombre de connexions SSH avec pf</title>
        <published>2013-09-05T22:19:19+00:00</published>
        <updated>2013-09-05T22:19:19+00:00</updated>
        
        <author>
          <name>Romain</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://univers-libre.net/posts/pf-ratelimit/"/>
        <id>https://univers-libre.net/posts/pf-ratelimit/</id>
        
        <content type="html" xml:base="https://univers-libre.net/posts/pf-ratelimit/">&lt;p&gt;Le port SSH doit probablement être parmi les plus testés par les scripts kiddies. Même si le
mieux reste de restreindre l’accès par IP et de n’autoriser l’authentification que
par clé, ce n’est des fois pas possible. Dans ce cas, on se retrouve avec une
avalanche de tentative de connexion et le auth.log qui explose en taille.
Ça devient lourd (dans les 2 sens du terme :-) ).&lt;/p&gt;
&lt;p&gt;Afin de bannir une IP au bout d’un trop grand nombre de connexions par unité de
temps, il existe différents outils qui analysent les logs et ajoutent des
règles dynamiquement comme &lt;a class=&quot;external-link&quot; rel=&quot;external&quot; href=&quot;https://www.fail2ban.org/&quot;&gt;fail2ban&lt;/a&gt;, mais je préfère agir directement au niveau
pare-feu quand c’est possible. Avec iptables sous Linux, il existe le module
limit. Avec Packet Filter, voici comment procéder :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créer une table, qui contiendra les IP bannies :&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;table &amp;lt;badguys&amp;gt; persist&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;on drope donc tous ce qui provient des IP présentes dans la table :&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;block in quick on $wan_if from &amp;lt;badguys&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;et enfin la règle intéressante :&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pass in on $wan_if proto tcp to self port ssh flags S/SA keep state (max-src-conn 3, max-src-conn-rate 5/30, overload &amp;lt;badguys&amp;gt; flush global)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La règle permet de limiter l’établissement d’une connexion sur le port SSH à
3 connexion simultanée (&lt;code&gt;max-src-conn 3&lt;/code&gt;) et avec une limite de 5 connexion
par tranche de 30 secondes (&lt;code&gt;max-src-conn-rate 5/30&lt;/code&gt;). Si une IP dépasse
cette limite, elle est ajoutée à la table badguys (&lt;code&gt;overload &amp;lt;badguys&amp;gt;&lt;/code&gt;) et
tous les états que l’IP aurait déjà pu avoir sont supprimés (&lt;code&gt;flush global&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensuite, on peut faire expirer les IP présentes dans la table avec un simple cron :&lt;/p&gt;
&lt;pre class=&quot;giallo z-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;33 3 * * *  /sbin/pfctl -t badguys -T expire 86400 2&amp;gt;&amp;amp;1 |grep -v &amp;quot;0/0 addresses expired.&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
</feed>
