philpep's blog - tag OpenBSD philpep's blog - tag OpenBSD rss http://blog.philpep.org fr Tue, 23 Feb 2010 14:09:07 GMT Pblog 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> IPV6 step 1 http://blog.philpep.org/post/IPV6-step-1 http://blog.philpep.org/post/IPV6-step-1 Sun, 21 Feb 2010 23:31:21 GMT <p>Je viens de passer tout (ou presque) mes services en IPV6 (en gardant IPV4 of course) :</p> <div class="codehilite"><pre>% host blog.philpep.org blog.philpep.org is an alias for lenine.philpep.org. lenine.philpep.org has address 82.229.137.130 lenine.philpep.org has IPv6 address 2a01:e35:2e58:9820::5 </pre></div> <p>Donc l'idée c'est de faire un récit de mon passage étant donné le nombre de modifications que j'ai du faire sur la configurations des machines, des softs et des pare feu. Je vais faire tout ça en 2 ou 3 billets.</p> <p>Mon FAI (free) me fournis un préfixe IPV6 2a01:e35:2e58:9820::/64, et ma topologie réseau permet sans se casser la tête de faire fonctionner tout ça. Le réseau est composé de 3 machines (+ quelques intrus en wifi), un routeur OpenBSD, un serveur FreeBSD avec 4 jails et mon laptop FreeBSD. Le mode routeur est activé sur la freebox (sans DHCP) et elle installe un 192.168.0.0/24 sur lequel sont toutes les machines (jails y compris) sont configurés, ainsi toutes les machines sont reliés physiquement sur la freebox ce qui permet d'éviter les problèmes de <a href="http://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6">neighbor solicitation</a> si seul mon routeur serait physiquement relié à la freebox (on peut passer outre avec <a href="http://www.freebsd.org/cgi/man.cgi?query=ndp">ndp(8)</a>)</p> <p>En ipv4 :</p> <div class="codehilite"><pre>+-------------+ +----------------+ +---------+ | SRV + jails |&lt;-----| Routeur |&lt;------| Freebox | +-------------+ +----------------+ +---------+ Filtrage/Routage En IPV4 tout le trafic passe par le routeur qui dispatche sur les jails. </pre></div> <p>Et en ipv6 :</p> <div class="codehilite"><pre>+-------------+ | SRV + jails |&lt;------+ +-------------+ | | +---------+ +----| Freebox | | +---------+ +------------+ | | Routeur |&lt;-------+ +------------+ En IPV6 le traffic est distribué par la freebox, le routeur ne sert plus (à part les services qui sont dessus). </pre></div> <p>La configuration ipv6 des machines sous FreeBSD :</p> <div class="codehilite"><pre># /etc/rc.conf ipv6_enable=&quot;YES&quot; ipv6_ifconfig_rl0=&quot;2a01:e35:2E58:9820::2 prefixlen 64&quot; ipv6_defaultrouter=&quot;2a01:e35:2E58:9820::1&quot; # ... La config jail jail_lenine_ip=&quot;192.168.0.5,2a01:e35:2E58:9820::5&quot; # ... </pre></div> <p>Un petit reboot (où un <code>/etc/rc.d/pleins_de_trucs restart</code>)</p> <p>Sur OpenBSD :</p> <div class="codehilite"><pre># /etc/hostname.vr0 inet 192.168.0.1 255.255.255/0 inet6 2a01:e35:2E58:9820::3 64 # /etc/mygate (freebox) 192.168.0.254 2a01:e35:2E58:9820::1 </pre></div> <p>Après il faut modifier votre <code>pf.conf</code> en supprimant <code>inet</code> de vos règles de filtrage comme ça on sous entend <code>inet</code> et <code>inet6</code>, concernant icmp c'est plus délicat parce qu'il y a deux protocoles.</p> <div class="codehilite"><pre># /etc/pf.conf pass in inet proto icmp pass in inet6 proto icmp6 </pre></div> <p>Ensuite ça devrait tourner :</p> <div class="codehilite"><pre>% ping6 -c 2 www.google.com PING6(56=40+8+8 bytes) 2a01:e35:2e58:9820::2 --&gt; 2a00:1450:8002::67 16 bytes from 2a00:1450:8002::67, icmp_seq=0 hlim=54 time=49.177 ms 16 bytes from 2a00:1450:8002::67, icmp_seq=1 hlim=54 time=53.867 ms --- www.l.google.com ping6 statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 49.177/51.522/53.867/2.345 ms % traceroute6 www.google.com traceroute6: Warning: www.l.google.com has multiple addresses; using 2a00:1450:8002::6a traceroute6 to www.l.google.com (2a00:1450:8002::6a) from 2a01:e35:2e58:9820::2, 64 hops max, 12 byte packets 1 2a01:e35:2e58:9820::1 0.589 ms 0.530 ms 0.480 ms 2 6to4-b8-e3.intf.routers.proxad.net 35.128 ms 33.359 ms 38.152 ms .... # HO LE VILAIN TUNEL ! :&gt; </pre></div> <p>Vous voilà en IPV6, la première chose à faire c'est reconfigurer votre parre feu, normalement vous n'aurez pas à doubler chaque lignes, enlevez juste <code>inet</code> là où il faut et ça passe. Les seules lignes à doubler sont les redirections (<code>rdr</code>), parce qu'il faut envoyer sur une adresse IPV4 ou sur une adresse IPV6.</p> <p>Dans le prochain billet j'expliquerais comment passer petit à petit ses softs sur IPV6.</p> Jouons avec kvm http://blog.philpep.org/post/Jouons-avec-kvm http://blog.philpep.org/post/Jouons-avec-kvm Sat, 13 Feb 2010 02:31:41 GMT <p>J'ai codé un petit programme tout simple qui fait clignoter les leds de mon routeur dès qu'un service est par terre. Ma méthode (qui ne doit pas être la meilleure mais je m'en fout un peu) consiste à regarder régulièrement la liste des processus et détecter l'arrêt d'un service quand le processus associé n'existe plus. J'ai commencé avec un script shell, puis étant assez mauvais pour tout ce qui ressemble de près ou de loin à du script j'ai décidé de le faire en C (langage d'excellence n'est ce pas...?).</p> <p>Je me suis volontairement compliqué la tache en utilisant des fonctions très proches du système, ainsi s'il est possible d'obtenir une liste de processus via <a href="http://www.freebsd.org/cgi/man.cgi?query=ps">ps(1)</a> avec un <a href="http://www.freebsd.org/cgi/man.cgi?query=popen">popen(3)</a> super crade ou encore <a href="http://www.freebsd.org/cgi/man.cgi?query=sysctl&amp;sektion=3">sysctl(3)</a> j'ai voulu utiliser <a href="http://www.freebsd.org/cgi/man.cgi?query=kvm">kvm(3)</a> <code>kernel memory interface</code> qui est en programmation système la méthode la plus appropriée (d'ailleurs 'ps' est codé avec ça), c'est juste une interface qui va nous permettre d'accéder au données du kernel (une copie bien entendu), ici la liste des processus en cours.</p> <p>Le hic c'est que si les fonctions de kvm sont très standard l'implémentation est très différente suivant les systèmes, comme à peu près toute implémentation, l'important c'est que l'interface soit standard. Ainsi à la lecture de la structure qui décrit les processus <code>kinfo_proc</code> de <a href="http://svn.freebsd.org/viewvc/base/head/sys/sys/user.h?view=markup">sys/user.h</a> on se dit chouette pleins d'info à disposition, sauf que sur OpenBSD c'est pas du tout la même forme (ni le même fichier d'ailleurs). D'où l'importance d'une interface riche et c'est ce que nous promet <code>kvm</code>.</p> <p>Assez causé passons au code (je n'explique pas ou peu le code en dehors des fonctions kvm)</p> <div class="codehilite"><pre><span class="cp">#include &lt;stdio.h&gt;</span> <span class="cp">#include &lt;stdlib.h&gt;</span> <span class="cp">#include &lt;string.h&gt;</span> <span class="cp">#include &lt;unistd.h&gt;</span> <span class="cp">#include &lt;err.h&gt;</span> <span class="cp">#include &lt;libgen.h&gt;</span> <span class="cp">#include &lt;fcntl.h&gt;</span> <span class="cp">#include &lt;limits.h&gt;</span> <span class="cp">#include &lt;paths.h&gt;</span> <span class="cp">#include &lt;kvm.h&gt;</span> <span class="cp">#include &lt;sys/param.h&gt;</span> <span class="cp">#include &lt;sys/sysctl.h&gt;</span> <span class="cp">#include &lt;sys/wait.h&gt;</span> <span class="cp">#include &lt;sys/user.h&gt;</span> <span class="kt">void</span> <span class="nf">start_leds</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* Ici on execute /usr/sbin/gioctl -q gpio0 led3 (on|off)</span> <span class="cm"> * suivant la parité du conteur statique &#39;i&#39;</span> <span class="cm"> * 60 fois avec une pause d&#39;une seconde. */</span> <span class="k">static</span> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="k">switch</span><span class="p">(</span><span class="n">fork</span><span class="p">())</span> <span class="p">{</span> <span class="k">case</span> <span class="o">-</span><span class="mi">1</span>: <span class="n">err</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;fork&quot;</span><span class="p">);</span> <span class="k">break</span><span class="p">;</span> <span class="k">case</span> <span class="mi">0</span>: <span class="n">execl</span><span class="p">(</span><span class="s">&quot;/usr/sbin/gpioctl&quot;</span><span class="p">,</span> <span class="s">&quot;gpioctl&quot;</span><span class="p">,</span> <span class="s">&quot;-q&quot;</span><span class="p">,</span> <span class="s">&quot;gpio0&quot;</span><span class="p">,</span> <span class="s">&quot;led3&quot;</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span><span class="o">%</span><span class="mi">2</span><span class="p">)</span> <span class="o">?</span> <span class="s">&quot;on&quot;</span> <span class="o">:</span> <span class="s">&quot;off&quot;</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="nb">NULL</span><span class="p">);</span> <span class="n">err</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;execl&quot;</span><span class="p">);</span> <span class="k">break</span><span class="p">;</span> <span class="nl">default:</span> <span class="n">wait</span><span class="p">(</span><span class="nb">NULL</span><span class="p">);</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span> <span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span><span class="o">++</span> <span class="o">&lt;=</span> <span class="mi">60</span><span class="p">)</span> <span class="k">return</span> <span class="n">start_leds</span><span class="p">();</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="n">kvm_t</span> <span class="o">*</span><span class="n">kd</span><span class="p">;</span> <span class="kt">char</span> <span class="n">berr</span><span class="p">[</span><span class="n">_POSIX2_LINE_MAX</span><span class="p">];</span> <span class="k">struct</span> <span class="n">kinfo_proc</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="o">*</span><span class="n">procs</span><span class="p">;</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">found</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="kt">char</span> <span class="o">**</span><span class="n">pargv</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="n">errx</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;Usage check_proc procs ...&quot;</span><span class="p">);</span> <span class="cm">/* On accède aux données du kernel qui tourne actuellement (NULL) */</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">kd</span> <span class="o">=</span> <span class="n">kvm_open</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">,</span> <span class="n">berr</span><span class="p">)))</span> <span class="n">errx</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;%s&quot;</span><span class="p">,</span> <span class="n">berr</span><span class="p">);</span> <span class="cm">/* On demande la liste des processus, kinfo_proc est décrite</span> <span class="cm"> * dans sys/sysctl.h sur OpenBSD et sys/user.h sur FreeBSD.</span> <span class="cm"> * Il nous la donne dans un tableau continu de pointeurs de</span> <span class="cm"> * taille qu&#39;on récupère dans &#39;n&#39;. */</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">procs</span> <span class="o">=</span> <span class="n">kvm_getprocs</span><span class="p">(</span><span class="n">kd</span><span class="p">,</span> <span class="n">KERN_PROC_ALL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">)))</span> <span class="n">err</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;kvm_getprocs: %s&quot;</span><span class="p">,</span> <span class="n">kvm_geterr</span><span class="p">(</span><span class="n">kd</span><span class="p">));</span> <span class="k">for</span> <span class="p">(</span><span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">argc</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="n">procs</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">,</span> <span class="n">p</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* On accède à la liste des arguments du programme qui a</span> <span class="cm"> * généré le processus courant. */</span> <span class="n">pargv</span> <span class="o">=</span> <span class="n">kvm_getargv</span><span class="p">(</span><span class="n">kd</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">pargv</span> <span class="o">&amp;&amp;</span> <span class="n">pargv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">strstr</span><span class="p">(</span><span class="n">pargv</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">argv</span><span class="p">[</span><span class="n">k</span><span class="p">]))</span> <span class="p">{</span> <span class="n">found</span><span class="o">++</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">==</span> <span class="n">kvm_close</span><span class="p">(</span><span class="n">kd</span><span class="p">))</span> <span class="n">err</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;kvm_close&quot;</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">found</span> <span class="o">!=</span> <span class="n">argc</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">start_leds</span><span class="p">();</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div> <p>Et l'exécution, on veut tester si un processus du nom de 'dhcpd' tourne sur le système, si ce n'est pas le cas on lance le clignotement de la led pendant une minute :</p> <div class="codehilite"><pre># gcc -o check_proc check_proc.c -lkvm # ./check_proc dhcpd </pre></div> <p>Le mien s'exécute dans un cron toute les minutes :</p> <div class="codehilite"><pre>* * * * * /root/bin/check_proc named dhcpd adsuck ntpd </pre></div> Adsuck pour remplacer privoxy http://blog.philpep.org/post/Adsuck-pour-remplacer-privoxy http://blog.philpep.org/post/Adsuck-pour-remplacer-privoxy Thu, 11 Feb 2010 02:27:05 GMT <p>Sur les trois machines clientes chez moi (dont deux avec l'OS à la pomme et de browsers douteux), filtrer les pubs du web au niveau du réseau tout entier est vital, puis il m'arrive de tester des browsers autres que firefox (dans le genre webkit-gtk/bindings vim) et là adblock ne m'est d'aucuns secours.</p> <p>Pendant un temps j'utilisais <a href="http://www.privoxy.org">privoxy</a> sur <a href="/tag/alix">mon routeur OpenBSD</a>, mais je lui ai trouvé plusieurs defauts :</p> <ul> <li>Les regexp de base sont très éfficaces mais il y a malheureusement beaucoup de faux positifs.</li> <li>Le temps de traitement amène une lenteur parfois perceptible.</li> <li>Je l'avais en proxy transparent, donc y'a toujours quelqu'un au bout du 'telnet machin 80' (ça peut être génant)</li> <li>Configuration et maintenance pas franchement agréable.</li> </ul> <p>Du coup en <a href="/post/Alix-fail-et-OpenWrt">reinstallant</a> le routeur j'ai cherché une alternative, et j'ai trouvé <a href="http://www.peereboom.us/adsuck/">adsuck</a>. C'est du filtrage dns, assez violent mais beaucoup plus rapide et tout aussi éfficace.</p> <p>Pour le moment ce soft est codé par et pour OpenBSD, mais ça doit pas être méchant à compiler sur autre chose.</p> <p>L'install :</p> <div class="codehilite"><pre># export PKG_PATH=ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/packages/i386/ # pkg_add adsuck # cat &gt;&gt; /etc/rc.local &lt;&lt; EOF if [ &quot;&quot; != &quot;NO&quot; -a -x /usr/local/sbin/adsuck ]; then echo -n &#39; adsuck&#39;; /usr/local/sbin/adsuck $adsuck_flags fi EOF # cat &gt;&gt; /etc/rc.conf.local &lt;&lt; EOF adsuck_flags=&quot;-c /var/adsuck -l 127.0.0.1 -p 54 -f /files/resolv.conf /files/hosts.small /files/Hosts.pub /files/local.pub&quot; EOF </pre></div> <p>Comme j'ai un vrai serveur DNS (pour le réseau local mais aussi pour mes domaines), j'ai lancé adsuck sur le port 54 (dns normal c'est 53) et fait une redirection pour le réseau local avec <a href="/tag/Packet%20filter">pf</a>, adsuck va lui même servir de proxy entre le réseau local et le serveur DNS qui tourne sur localhost en particulier.</p> <div class="codehilite"><pre># echo &quot;nameserver 127.0.0.1&quot; &gt; /var/adsuck/files/resolv.conf # touch /var/adsuck/files/local.pub </pre></div> <p>On lance une première fois :</p> <div class="codehilite"><pre># adsuck -c /var/adsuck -l 127.0.0.1 -p 54 -f /files/resolv.conf /files/hosts.small /files/Hosts.pub /files/local.pub </pre></div> <p>Si ça se lance, on peut rediriger le traffic du réseau local vers adsuck :</p> <div class="codehilite"><pre>table &lt;local&gt; const { 192.168.0.0/24 } rdr pass on $ext_if proto udp from &lt;local&gt; to $ext_if port domain -&gt; lo0 port 54 # Si vous êtes vraiment méchant vous pouvez enlever le 2ème $ext_if :) </pre></div> <p>Maintenant sur une machine du réseau local :</p> <div class="codehilite"><pre>% host www.smartadserver.com dns1.proxad.net www.smartadserver.com has address 91.103.138.65 % host www.smartadserver.com Host www.smartadserver.com not found: 3(NXDOMAIN) </pre></div> <p>Et vous voilà avec un net plus très neutre mais épuré de toute publicité. Pour rajouter des sites, je vous ai fait créer un <code>/var/adsuck/files/local.pub</code>, la syntaxe est simple :</p> <div class="codehilite"><pre>127.0.0.1 domaine_moisi.com </pre></div> <p>Et pour faire relire les listes à adsuck :</p> <div class="codehilite"><pre># kill -USR1 `pgrep adsuck` </pre></div> Alix fail et OpenWrt http://blog.philpep.org/post/Alix-fail-et-OpenWrt http://blog.philpep.org/post/Alix-fail-et-OpenWrt Mon, 08 Feb 2010 14:46:46 GMT <p>Ce week end j'ai essuyé pas mal d'échecs en tout genres, j'ai une superbe <a href="/tag/alix">alix</a> qui tourne sur <a href="/tag/OpenBSD">OpenBSD</a> et j'ai une carte wifi en minipci dessus qui marche passablement mal sur OpenBSD (tous les modes ne marchent pas et beaucoup de pertes de paquets quand ça marche).</p> <p>Du coup je me mis en tête le fait que ça tournera mieux sous un autre OS, j'ai donc essayé dans l'ordre <a href="/tag/FreeBSD">FreeBSD</a>, Debian et <a href="http://openwrt.org">OpenWrt</a>. Aucuns n'a su faire tourner ma carte même avec les derniers drivers, j'avais même pas d'interface, comme quoi le support matériel sur OpenBSD est pas aussi mauvais qu'on le pense.</p> <p>Donc si quelqu'un à réussi à faire tourner convenablement la carte <a href="http://linitx.com/viewproduct.php?prodid=11331">Engenius NMP-8602+ 400mW a/b/g miniPCI</a> sur un OS libre merci de me faire signe.</p> <p>J'ai donc remis OpenBSD dessus et enlevé la carte wifi (si quelqu'un est intéressé je suis prêt à la céder d'ailleurs, toute neuve jamais servie :&gt;)</p> <p>J'ai quand même beaucoup joué avec le boot pxe sur sortie série Linux/BSD donc je suis bien rodé là dessus maintenant. Et surtout j'ai découvert OpenWrt, une toute petite distribution linux pour l'embarqué, faite à la base pour flasher les firmware proprio sur les routeurs du marché elle tourne aussi bien sur tout autre matériel et c'est un projet très dynamique et original. L'installation par pxe est super simple, il suffit de compiler un <a href="http://en.wikipedia.org/wiki/RAM_disk">ramdisk</a> et de démarrer dessus.</p> <div class="codehilite"><pre>$ ls -l /usr/local/pxe/ total 1796 -rw-r--r-- 1 phil phil 1786396 Feb 7 15:41 openwrt-x86-vmlinuz -rwxr-xr-x 1 root wheel 16466 Feb 6 21:31 pxelinux.0 drwxr-xr-x 2 root wheel 512 Feb 7 15:41 pxelinux.cfg $ cat /usr/local/pxe/pxelinux.cfg/default # Simplement spécifier la vitesse du port série # 38400 ici serial 0 38400 0 console 0 label linux kernel openwrt-x86-vmlinuz append init=/etc/preinit console=tty0 console=ttyS0,38400n8 reboot=bios </pre></div> <p>Après c'est du pxe classique, tftp et dhcpd et ça démarre :</p> <p><img alt="openwrt" src="/static/pub/openwrt.png" /></p> <p>Après il suffit d'envoyer l'image sur le disque dur (soit la votre, soit celle qui est distribuée) :</p> <div class="codehilite"><pre>root@Solo:/# wget http://downloads.openwrt.org/kamikaze/8.09.2/x86/openwrt-x86-squashfs.image root@Solo:/# dd if=openwrt-x86-squashfs.image of=/dev/hda </pre></div> <p>Et <em>c'est tout</em> !</p> <p>À coté de ça vous avez une interface de configuration web convi, un petit sshd <a href="http://matt.ucc.asn.au/dropbear/dropbear.html">dropbear</a> et pleins de packages disponible (très orienté réseau bien sûr). Ça doit être encore plus réjouissant quand on flashe un routeur wifi proprio :)</p> <p>Mais bon, alix mérite qu'on l'exploite plus que ça, j'aime bien l'interface web mais j'aime mieux éditer mon <a href="/tag/Packet%20Filter">pf.conf</a> avec <a href="/tag/vim">vim</a>.</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> Controler les leds sur ALIX 2D3 http://blog.philpep.org/post/Controler-les-leds-sur-ALIX-2D3 http://blog.philpep.org/post/Controler-les-leds-sur-ALIX-2D3 Mon, 02 Nov 2009 21:30:58 GMT <p>Il y a 4 leds sur le devant, la première est réservée par l'alimentation et la dernière par la carte minipci, mais les deux autres sont à disposition pour nos amis scripteur. Ces deux leds se contrôlent sur les broches 25 et 27 du gpio.</p> <p>Il faut les activer avant que securelevel passe à 1. Dans <code>/etc/rc.securelevel</code> :</p> <div class="codehilite"><pre># Configuring the leds echo -n &quot;Configuring the leds : &quot; /usr/sbin/gpioctl gpio0 25 set out led2 /usr/sbin/gpioctl gpio0 27 set out led3 </pre></div> <p>Un petit reboot, et vous pouvez controler vos leds (q = quiet) avec :</p> <div class="codehilite"><pre>gpioctl -q gpio0 led2 off gpioctl -q gpio0 led2 on </pre></div> <p>A vous de scripter ce que vous voulez derrière, style un script qui fait clignoter la led si la passerelle est accessible etc.</p> <ul> <li><a href="http://blog.lekermeur.net/?page_id=565">Exemple de script</a></li> </ul> Spamd http://blog.philpep.org/post/Spamd http://blog.philpep.org/post/Spamd Sat, 31 Oct 2009 13:50:31 GMT <p>Spamd ou comment bloquer les spams sans discriminer à priori des adresses IPs et sans remettre en cause la neutralité du réseau.</p> <p>J'ai écrit une <a href="http://wiki.bender-labs.org/bsd/spamd">page sur spamd</a> sur le principe de fonctionnement et sa mise en place sur OpenBSD.</p> <p>Ce tout nouveau wiki cogéré par <a href="http://www.philpep.org">philpep.org</a> et <a href="http://www.bender-labs.org">bender-labs.org</a> est plus adapté que mon blog pour ce genre de choses car vous pouvez aussi apporter votre contribution pour faire part de votre expérience (ne serait-ce que pour corriger d'éventuelles fautes d'orthographes et de grammaires :-) ).</p> Install OpenBSD 4.6 sur alix 2D3 http://blog.philpep.org/post/Install-OpenBSD-4.6-sur-alix-2D3 http://blog.philpep.org/post/Install-OpenBSD-4.6-sur-alix-2D3 Mon, 26 Oct 2009 01:22:48 GMT <p>Je viens d'acquérir une <a href="http://www.pcengines.ch/alix2d3.htm">carte ALIX 2D3</a> pour m'en servir comme routeur et pour faire tourner certains services critiques à la place de mon serveur qui pourrait décider de tomber en panne un jour. Cette machine n'ayant pas de cartes graphique il y a deux méthodes pour installer un OS sur la carte flash :</p> <ul> <li>Installer un OS depuis un autre ordinateur en y branchant la carte flash.</li> <li>Boot par PXE (réseau) et communication via le port série.</li> </ul> <p>Si comme moi vous n'avez aucuns adaptateur pour brancher la carte flash sur une autre machine il faut le faire en PXE, vous allez voir que même si ça parait compliqué c'est (après coup) assez facile à faire.</p> <p>Nous allons installer <a href="http://www.openbsd.org">OpenBSD</a> 4.6 par PXE depuis une machine FreeBSD 7.2 mais n'importe quelle autre machine pourvue d'une interface réseau ferra l'affaire (je vous laisse le soin de trouver la documentation approprié pour votre OS).</p> <p>Déjà il faut activer le boot PXE dans le bios de la carte alix, donc il vous faudra un cable null-modem (et pas un mini gender changer comme j'ai eu le malheur de faire). Si vous n'avez pas de port série, il vous faut un adaptateur série/USB. Ensuite pour causer au port série j'ai utilisé <a href="http://www.freshports.org/comms/picocom/">comms/picocom</a>, lançons le avec la vitesse indiquée dans <a href="http://www.philpep.org/pub/alix2.pdf">la doc</a>.</p> <div class="codehilite"><pre>picocom -b38400 -fx /dev/ttyU0 </pre></div> <p>Pendant le memcheck tapez sur <code>s</code> pour afficher l'état du bios. Ensuite <code>e</code> pour activer le boot PXE et <code>q</code> pour enregistrer et quitter.</p> <p>Pour booter sur le réseau il faut trois choses :</p> <ol> <li>Un serveur dhcp</li> <li>Un serveur tftp</li> <li>Que alix et le serveur soient branchées ensembles.</li> </ol> <p>Pour le branchement je me suis pas trop cassé la tête vu que les interfaces de la freebox sont sur le même layer. Il suffit donc de brancher alix sur la freebox (avec l'interface à coté de l'alimentation, je ne sais pas si les autres sont capables de démarrer en PXE).</p> <p>Ensuite installez le serveur dhcp, moi j'ai utilisé <a href="http://www.freshports.org/net/isc-dhcp30-server">net/isc-dhcp30-server</a>. Ça se configure dans <code>/usr/local/etc/dhcpd.conf</code></p> <div class="codehilite"><pre>ddns-update-style none; shared-network LOCAL-NET { # Mon DNS cache, utilisez ceux de votre FAI si vous n&#39;en avez pas option domain-name-servers 192.168.0.3; # On attribue une adresse sur le réseau de la freebox subnet 192.168.0.0 netmask 255.255.255.0 { # C&#39;est la freebox qui sert de routeur pour l&#39;instant option routers 192.168.0.254; filename &quot;pxeboot&quot;; range 192.168.0.200 192.168.0.202; next-server 192.168.0.2; # IP sur serveur de boot PXE default-lease-time 86400; max-lease-time 90000; } } </pre></div> <p>Et maintenant le serveur tftp, juste une ligne à décommenter dans <code>/etc/inetd.conf</code> :</p> <div class="codehilite"><pre>tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot </pre></div> <p>Maintenant il faut mettre les bons fichiers au bon endroit :</p> <div class="codehilite"><pre>mkdir /tftpboot &amp;&amp; cd /tftpboot ftp ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/i386/pxeboot ftp ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/i386/bsd.rd </pre></div> <p>Maintenant démarrez votre serveur de boot PXE :</p> <div class="codehilite"><pre>echo dhcpd_enable=\&quot;YES\&quot; &gt;&gt; /etc/rc.conf echo inetd_enable=\&quot;YES\&quot; &gt;&gt; /etc/rc.conf /usr/local/etc/rc.d/isc-dhcpd start /etc/rc.d/inetd start </pre></div> <p>Relancez picocom et redémarrez votre alix. Elle va chercher un serveur DHCP, donc si elle ne trouve pas le votre mais plutôt celui de la freebox, désactivez le dhcp de la freebox momentanément.</p> <p>Ensuite vous voyez le prompt de boot OpenBSD qui echoue parce qu'il ne trouve pas de fichier <code>bsd</code> sur le serveur tftp. Et heureusement parce qu'on a des options à passer au boot (remarque: on aurrait pu les mettre dans /tftpboot/etc/boot.conf, mais je connais pas parfaitement la syntaxe de ce fichier). Il faut lui dire qu'on est sur un terminal série et lui donner la vitesse de celui ci :</p> <div class="codehilite"><pre><span class="n">boot</span><span class="o">&gt;</span> <span class="n">stty</span> <span class="n">com0</span> <span class="mi">38400</span> <span class="n">boot</span><span class="o">&gt;</span> <span class="n">set</span> <span class="n">tty</span> <span class="n">com0</span> <span class="n">boot</span><span class="o">&gt;</span> <span class="n">bsd</span><span class="o">.</span><span class="n">rd</span> </pre></div> <p>Là il va chercher le bsd.rd et démarre l'installateur OpenBSD et vous pouvez suivre <a href="http://www.openbsd.org/faq/fr/faq4.html#Install">la documentation</a>.</p> <ol> <li>Remarque0 : Au moment où j'écris ces lignes la doc d'install n'est pas à jours pour OpenBSD 4.6 , en fait l'installateur est beaucoup plus simple maintenant.</li> <li>Remarque1 : Au moment où il pose la question "Change the default console to com0?" répondez oui, ça évitera de le faire plus tard.</li> </ol> <p>Voilà, sinon j'en suis très heureux de cette petite alix qui me sert maintenant de routeur, j'ai mis un proxy http (privoxy) transparent pour filtrer les pubs sur le web, déplacé le serveur DNS dessus en cas de panne de mon autre machine, un <a href="/tag/Packet%20Filter">pf</a>, un dhcpd etc .</p> <p>Enjoy.</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>