philpep's blog - tag FreeBSD philpep's blog - tag FreeBSD rss http://blog.philpep.org fr Thu, 04 Mar 2010 22:13:28 GMT Pblog IPV6 step one two http://blog.philpep.org/post/IPV6-step-one-two http://blog.philpep.org/post/IPV6-step-one-two Thu, 04 Mar 2010 22:13:28 GMT <p>La semaine dernière, j'expliquais <a href="http://blog.philpep.org/post/IPV6-step-1">comment j'avais intégré l'IPV6</a> dans mon réseau. Depuis la donne à fortement changé puisque j'ai mis ma freebox en mode <strong>non</strong> routeur, et donc mon propre routeur sous FreeBSD (ma nouvelle carte wifi marche pas sous OpenBSD).</p> <p>Du coup on en arrive au problème de la freebox qui se comporte en routeur IPV6 même en mode <strong>non</strong> routeur, voyez plutôt <a href="http://www.mail-archive.com/frnog@frnog.org/msg03947.html">cette discussion FRNOG</a> ou on nous explique que ça va peut être changer bientôt. En attendant, pas moyen de router proprement l'IPV6 de Free sans passer par un proxy ndp ou un bridge logiciel, sans compter qu'il n'est pas possible d'avoir un reverse DNS avec l'IPV6 de Free.</p> <p>Grâce à sieur <a href="http://blog.bsdsx.fr/">bsdsx</a> j'ai découvert <a href="http://tunnelbroker.net/">tunnelbrocker.net</a> qui est un service type <a href="http://en.wikipedia.org/wiki/Tunnel_broker">tunnel broker</a> en gros les paquet IPV6 sont encapsulés dans de l'IPV4 entre chez vous et le bout du tunnel (plusieurs sont disponibles suivant votre localisation), ils fournissent un /64 ou un /48 et surtout la possibilité d'avoir un reverse DNS.</p> <p>Sachez qu'il y a encore une troisième façon d'avoir une connectivité IPV6, basé sur la <a href="http://www.ietf.org/rfc/rfc3068.txt">RFC 3068</a> ou encore <a href="http://fr.wikipedia.org/wiki/6to4">6to4</a>, qui permet à n'importe qui d'obtenir un /48 sans demander rien à personne (c'est la passerelle 6to4 la plus proche de vous qui prend en charge le routage de votre traffic), le prefixe est calculé à partir de votre IPV4 publique.</p> <p>J'ai grosso modo donné les 3 manière communes d'accéder au réseau IPV6 quand on est abonné chez Free. Chaque méthode à son avantage (ou pas), vous pouvez lire <a href="http://www.culte.org/listes/linux-31/2008-08/msg00011.html">ce mail</a>.</p> <p>Perso j'ai choisi le tunnel broker Huricane Electrics qui marche bien, il suffit de créer un compte et un tunnel, ils donnent même la config pour FreeBSD mais pour fixer ça en dur dans <a href="http://www.freebsd.org/cgi/man.cgi?query=rc.conf">rc.conf</a> :</p> <div class="codehilite"><pre>ipv6_enable=&quot;YES&quot; ipv6_gateway_enable=&quot;YES&quot; gif_interfaces=&quot;gif0&quot; gifconfig_gif0=&quot;82.229.137.130 216.66.84.46&quot; # Mon IP publique suivie de l&#39;IP du tunnel ipv6_ifconfig_gif0=&quot;2001:470:1f14:7bf::2 2001:470:1f14:7bf::1 prefixlen 128&quot; ipv6_defaultrouter=&quot;2001:470:1f14:7bf::1&quot; # On relie le réseau local (sur l&#39;interface vr1 chez moi) ipv6_ifconfig_vr1=&quot;2001:470:1f15:7bf:dead:c0de::1 prefixlen 96&quot; </pre></div> <p>La conf pf qui va avec :</p> <div class="codehilite"><pre>ext_if = &quot;vr0&quot; int_if = &quot;vr1&quot; gif_if = &quot;gif0&quot; tun_end = &quot;216.66.84.46&quot; # Le bout du tunnel localnet = $int_if:network block log all pass inet proto icmp all icmp-type { echoreq unreach } pass inet6 proto icmp6 all icmp6-type { echoreq unreach timex toobig neighbrsol neighbradv } pass out proto { tcp udp } all pass out on $ext_if from $ext_if to $tun_end # On peut filtre ici (là tout passe sans filtrage) pass in on $gif_if inet6 proto { tcp udp icmp6 } to $localnet </pre></div> <p>En cas de doutes, vous pouvez faire des nmap depuis l'interface web de tunnelbroker.net.</p> <p>Pour la config du reverse DNS c'est pas plus compliqué qu'en IPV4 (juste plus long) :</p> <div class="codehilite"><pre>; master/local6.rev $TTL 3600 ; 1 heure f.b.7.0.5.1.f.1.0.7.4.0.1.0.0.2.ip6.arpa. IN SOA ns.philpep.org. root.philpep.org. ( 2010022601 ; serial 8H ; refresh 4H ; retry 4W ; expire 1D ) ; Min TTL @ IN NS ns.philpep.org. 1.0.0.0.0.0.0.0.e.d.0.c.d.a.e.d IN PTR solo.philpep.org. ; et named.conf zone &quot;f.b.7.0.5.1.f.1.0.7.4.0.1.0.0.2.ip6.arpa&quot; { type master; file &quot;master/local6.rev&quot;; }; </pre></div> <p>Autre chose à savoir, l'IPV6 c'est pas encore ça puisqu'on est encore obligé à un moment ou un autre d'encapsuler l'IPV6 dans l'IPV4 et de passer par des tunnels plus ou moins loin, la connectivité sortante en souffre énormément (allez faire un tour sur youtube.com en IPV6 en passant par un tunnel broker...), du coup ça peut être une bonne idée de préférer l'IPV4 sur la machine où il y a le browser :</p> <div class="codehilite"><pre>/etc/rc.d/ip6addrctl prefer_ipv4 # ou alors QUE pour firefox about:config network.dns.disableIPv6 </pre></div> <p>Si quelqu'un à déjà mis en place son réseau IPV6 en 6to4 avec <a href="http://www.freebsd.org/cgi/man.cgi?query=stf">stf(4)</a>, j'ai lu que la connectivité entrante était moins fiable qu'avec un tunnel broker, je voudrais que quelqu'un m'explique ??</p> <p>Quelques liens :</p> <ul> <li><a href="http://www.gcu-squad.org/2006/02/aaah-mais-si-mais-ah-ah-bien-sur-mais-oui-savait/">Découverte du 6to4 chez gcu.info</a></li> <li><a href="http://fr.wikipedia.org/wiki/6to4">6to4 wikipedia</a></li> <li><a href="http://en.wikipedia.org/wiki/Tunnel_broker">Tunnel broker wikipedia</a></li> <li><a href="http://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers">Liste de Tunnel Broker wikipedia</a></li> <li><a href="http://www.mail-archive.com/frnog@frnog.org/msg03947.html">Il a free mais il a pas tout compris FRNOG</a></li> <li><a href="http://www.culte.org/listes/linux-31/2008-08/msg00011.html">IPV6 au CULTE</a></li> </ul> 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> 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> Lancer lighttpd dans un environnement propre http://blog.philpep.org/post/Lancer-lighttpd-dans-un-environnement-propre http://blog.philpep.org/post/Lancer-lighttpd-dans-un-environnement-propre Thu, 28 Jan 2010 00:45:29 GMT <p>Cela fait quelque temps que je vois mes <a href="http://fr.wikipedia.org/wiki/Common_Gateway_Interface">scripts cgi</a> sous <a href="http://www.lighttpd.net/">lighttpd</a> hériter de l'environnement root (vous savez, les <code>export</code> et autres <code>setenv</code> dans votre <code>~/.$SHELLrc</code>). Et si vous êtes un peu parano comme moi ou que vous avez des données sensibles dans votre environnement il peut s'avérer utile de les cacher du script cgi.</p> <p>Pour cela j'ai modifié mon <code>/usr/local/etc/rc.d/lighttpd</code>, du coup j'en ai même fait <a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=143302">un bug report</a> chez FreeBSD histoire que tout le monde en profite. Il permet même de spécifier certaines des variables d'environnement que l'on veut conserver (comme PATH qui est souvent utilisé dans les script cgi).</p> <p>Avec un peu de chance (et beaucoup de temps :&gt;) il le prendrons et vous l'aurez bientôt dans vos ports. Sinon faite le vous même à partir <a href="http://www.philpep.org/pub/lighttpd_rc.patch">du patch</a> :</p> <div class="codehilite"><pre>cd /root fetch http://www.philpep.org/pub/lighttpd_rc.patch cd /usr/local/etc/rc.d/ patch -p0 &lt; /root/lighttpd_rc.patch </pre></div> <p>L'inconvénient c'est qu'il faut le refaire à chaque mise à jours de lighttpd.</p> git-daemon sous FreeBSD http://blog.philpep.org/post/git-daemon-sous-FreeBSD http://blog.philpep.org/post/git-daemon-sous-FreeBSD Tue, 26 Jan 2010 21:09:39 GMT <p>Si vous avez un serveur git sous FreeBSD, vous aurez très rapidement des problèmes avec <code>/usr/local/etc/rc.d/git_daemon</code>, genre il démarre mal, et refuse de redémarrer.</p> <p>En fait il suffit d'utiliser l'option <code>--reuseaddr</code> qui passe SO_REUSEADDR à <a href="http://www.freebsd.org/cgi/man.cgi?query=setsockopt">setsockopt</a> pendant la création du socket serveur. Du coup il peut redémarrer même si il y avait une connexion active sur le port.</p> <p>En lisant le script <a href="http://www.freebsd.org/cgi/man.cgi?query=rc">rc</a>, on peut même éviter de le modifier et devoir le refaire à chaque mise à jours de git, dans <code>/etc/rc.conf</code></p> <div class="codehilite"><pre>git_daemon_enable=&quot;YES&quot; git_daemon_directory=&quot;--reuseaddr --base-path=/usr/home/git/repositories&quot; </pre></div> <p>EDIT : ce n'est plus nécessaire maintenant <a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=143275">PR ports/143275</a></p> Upgrade FreeBSD 8.0 et jails http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails Wed, 06 Jan 2010 20:11:03 GMT <p>J'ai upgradé ma FreeBSD (ce serveur) et ses 4 jails de FreeBSD 7.2-RELEASE vers FreeBSD 8.0-RELEASE, voilà donc le récit de ce qui est toujours une épopée.</p> <p>Dans un premier temps il faut récupérer les sources du système. J'ai fait ça à coup de <code>csup</code> depuis <code>cvsup1.fr.FreeBSD.org</code> (qui n'est autre que <code>cvsup.free.org</code>).</p> <div class="codehilite"><pre># cat /usr/local/etc/stable-supfile *default host=cvsup1.fr.FreeBSD.org *default base=/var/db *default prefix=/usr *default release=cvs tag=RELENG_8_0 *default delete use-rel-suffix *default compress src-all # csup /usr/local/etc/stable-supfile </pre></div> <p>Pendant ce temps au lieu de te tourner les pouces fais toi un <code>/etc/</code><a href="http://www.freebsd.org/cgi/man.cgi?query=src.conf">src.conf(5)</a> pour customiser un peu ce qu'on va compiler dans le world. Moi <a href="/post/Ssmtp-pour-remplacer-sendmail">je n'utilise plus sendmail</a>, authpf, bind (j'ai déjà un bind sur mon routeur), bluetooth, les jeux, IPfilter (j'utilise pf) ni zfs.</p> <div class="codehilite"><pre># cat /etc/src.conf WITHOUT_AUTHPF=YES WITHOUT_BIND=YES WITHOUT_BLUETOOTH=YES WITHOUT_GAMES=YES WITHOUT_IPFILTER=YES WITHOUT_SENDMAIL=YES WITHOUT_ZFS=YES </pre></div> <p>Quand <code>csup</code> à finit son boulot on peut lancer la compilation qui tue :</p> <div class="codehilite"><pre># cd /usr/src # make buildworld </pre></div> <p>Bois une grosse tasse de café et attend sagement en lisant <a href="http://www.freebsd.org/cgi/man.cgi?query=config">config(8)</a> et $EDITOR ta config kernel dans <code>/usr/src/sys/&lt;arch&gt;/conf/LAPIN</code>, sinon le kernel GENERIC marche bien hein :-).</p> <p>Une fois le buildworld terminé lance la compilation de ton kernel :</p> <div class="codehilite"><pre># cd /usr/src/ # make buildkernel KERNCONF=LAPIN </pre></div> <p>Pendant ce temps mettons à jours les jails. Moi j'arrête complètement les jails, je préfère un service injoignable qu'un service qui pourrait planter. Pour que le <a href="http://www.freebsd.org/cgi/man.cgi?query=mergemaster">mergemaster(1)</a> soit moins long j'ai mis quelques options dans <code>/root/.mergemasterrc</code>.</p> <div class="codehilite"><pre># cat /root/.mergemasterrc FREEBSD_ID=yes # /etc/rc.d/jail stop # cd /usr/src # make installworld DESTDIR=/path/to/jail # mergemaster -i -C -D /path/to/jail </pre></div> <p>Réponds aux questions de mergemaster, c'est long mais nécessaire, si ça te parait trop long rajoutes <code>-U</code> aux options de mergemaster.</p> <p>Refait la manip pour toutes tes jails. Enfin installe le nouveau kernel et reboot en <strong>Single user mode</strong>.</p> <div class="codehilite"><pre># cd /usr/src # make installkernel KERNCONF=LAPIN # shutdown -r now ## MAINTENANT EN SINGLE USER MODE ## # adjkerntz -i # mount -a -t ufs # mergemaster -p # cd /usr/src/ # make installworld # mergemaster -i -C # reboot </pre></div> <p>Nous voilà en FreeBSD 8.0-RELEASE-p1, maintenant il faut réinstaller tous les ports pour que les softs soient liés avec les libs de la 8.0. Alors là plusieurs méthodes possibles.</p> <ul> <li>Par compilation =&gt; portupgrade -a (va faire un tour sur google.com pour plus d'info sur les options crousti de portupgrade).</li> <li>En binaire, c'est ce que j'ai fait via un hack plus crade qu'un porno thaïlandais mais qui marche.</li> </ul> <p><strong>Attention lapin !</strong> , ce script va t'installer des packages avec les options de compilation par défaut des ports. Ça va enlever ton support PGSQL de dovecot et te rajouter toute la libx11 :-), à manipuler avec précaution donc.</p> <p>Mon petit script magique <code>pkg_reinstall</code>:</p> <div class="codehilite"><pre><span class="c">#!/bin/sh</span> <span class="c"># Force la réinstallation des</span> <span class="c"># packages pour la nouvelle release</span> <span class="c"># http://blog.philpep.org/post/Upgrade-FreeBSD-8.0-et-jails</span> <span class="c"># Je ne suis pas responsable de la casse éventuelle :-)</span> <span class="c"># Mirroir pour choper les packages voyez pkg_add(1)</span> <span class="c"># section ENVIRONEMENT.</span> <span class="nb">export </span><span class="nv">PACKAGEROOT</span><span class="o">=</span><span class="s2">&quot;ftp://ftp.fr.freebsd.org&quot;</span> <span class="c"># Liste des packages sur la machine</span> <span class="nv">PKG_LIST</span><span class="o">=</span><span class="sb">`</span>pkg_info | cut -d<span class="s1">&#39; &#39;</span> -f1<span class="sb">`</span> <span class="k">for </span>pkg in <span class="nv">$PKG_LIST</span> <span class="k">do</span> <span class="c"># On coupe la version du package</span> <span class="c"># et on force la réinstallation</span> pkg_add -rvF <span class="s2">&quot;${pkg%-*}&quot;</span> <span class="k">done</span> </pre></div> <p>Je lance donc mon script dans un shell de la jail (dont le JID m'est donné par <a href="http://www.freebsd.org/cgi/man.cgi?query=jls">jls(1))</a> :</p> <div class="codehilite"><pre># jexec 1 sh # sh /root/pkg_reinstall </pre></div> <p>Ensuite tu peux normalement supprimer les anciennes libs et anciens fichiers de ta vielle FreeBSD :</p> <div class="codehilite"><pre># cd /usr/src # yes | make delete-old DESTDIR=/path/to/jail # yes | make delete-old-libs DESTDIR=/path/to/jail </pre></div> <p>Tu peux faire pareil pour l'hote maintenant, un coup de <code>pkg_reinstall</code> et <code>yes | make delete-old(|-libs)</code> et te voilà en 8.0 avec un système super clean.</p> <h3>Bonus spécial pour toi lapin !</h3> <p>Personnellement j'aime bien rester avec mes packages de RELEASE, donc je met pratiquement jamais à jours. Par contre l'idée d'avoir des packages avec des failles de sécurité ça m'insupporte. Donc j'utilise le grand <code>portaudit</code> et si il trouve un package foireux je l'upgrade vers les build de STABLE (qui sont plus récents).</p> <div class="codehilite"><pre># export PACKAGEROOT=&quot;ftp://ftp.fr.freebsd.org&quot; # pkg_add -r portaudit # /usr/local/sbin/portautit -Fda Problem found with phplol see http://machintruc.com/64867/php/6764 </pre></div> <p>Et pour tous les packages faillibles :</p> <div class="codehilite"><pre># export PACKAGESITE=&quot;ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/&quot; # pkg_add -rF phplol </pre></div> <p>Te voilà avec un système très nice nice qui te laissera dormir jusqu'au prochain local root voir même jusqu'à la prochaine release.</p> Ssmtp pour remplacer sendmail http://blog.philpep.org/post/Ssmtp-pour-remplacer-sendmail http://blog.philpep.org/post/Ssmtp-pour-remplacer-sendmail Mon, 04 Jan 2010 23:10:53 GMT <p>Sur mon serveur FreeBSD j'ai 4 <a href="http://en.wikipedia.org/wiki/FreeBSD_jail">jails</a> et par défaut le système envoie régulièrement des <code>security run output</code> à <code>root@localhost</code> pour l'informer de ce qu'il se passe sur le système (nouveau fichiers etc). Tout ça c'est très bien sauf que un hote et 4 jails ça fait 5 compte mail à visiter, c'est pas trop convi et en plus on a pas envie de faire tourner sendmail juste pour ça.</p> <p>J'ai donc décidé d'utiliser un MTA très simple appelé (devinez comment) : <code>Simple smtp agent</code>. Chaque mail envoyé depuis la machine (en appelant sendmail) partira vers un serveur smtp de mon choix, ainsi je récupère tous les mails sur mon compte mail usuel.</p> <div class="codehilite"><pre># cd /usr/ports/mail/ssmtp # make install Information for ssmtp-2.62.3: Install notice: sSMTP has been installed successfully. To replace sendmail with ssmtp type &quot;make replace&quot; # make replace </pre></div> <p>Ensuite j'ai crée mon <code>/usr/local/etc/ssmtp/ssmtp.conf</code> : </p> <div class="codehilite"><pre><span class="c1"># Serveur de mail à contacter pour l&#39;envoi + le port</span> <span class="c1"># par defaut c&#39;est le port 25</span> <span class="n">mailhub</span><span class="o">=</span><span class="n">mail</span><span class="o">.</span><span class="n">philpep</span><span class="o">.</span><span class="n">org:578</span> <span class="c1"># Domaine d&#39;où semble venir le mail</span> <span class="n">rewriteDomain</span><span class="o">=</span><span class="n">philpep</span><span class="o">.</span><span class="n">org</span> <span class="c1"># Domaine à donner pendant le HELO</span> <span class="c1"># À accorder avec le reverse DNS de votre machine</span> <span class="c1"># vu depuis le serveur de mail.</span> <span class="n">hostname</span><span class="o">=</span><span class="n">shen</span><span class="o">.</span><span class="n">philpep</span><span class="o">.</span><span class="n">org</span> </pre></div> <p>Arrangez vous pour que le serveur de mail accepte de vous relayer, moi c'est le cas parce que je suis en local et mon postfix relaie ce qui vient du réseau local. Mais si ce n'est pas le cas (genre vous utilisez le serveur mail de votre fournisseur de mail), on peut configurer l'authentification SMTP, SSL/TLS et tout le reste.</p> <p>Ensuite désactivez sendmail dans <code>/etc/rc.conf</code> puisqu'il ne sert plus :</p> <div class="codehilite"><pre><span class="n">sendmail_submit_enable</span><span class="o">=</span><span class="s">&quot;NO&quot;</span> <span class="n">sendmail_outbound_enable</span><span class="o">=</span><span class="s">&quot;NO&quot;</span> <span class="n">sendmail_msp_queue_enable</span><span class="o">=</span><span class="s">&quot;NO&quot;</span> </pre></div> <p>Pour tester l'envoi :</p> <div class="codehilite"><pre><span class="nv">$</span> <span class="nv">dmesg</span> <span class="o">|</span> <span class="n">mail</span> <span class="o">-</span><span class="n">s</span> <span class="s">&quot;works ?&quot;</span> <span class="n">lapin</span><span class="nv">@barreenfer</span><span class="o">.</span><span class="n">com</span> <span class="nv">$</span> <span class="nv">if</span> <span class="p">[[</span> <span class="vg">$?</span> <span class="o">-</span><span class="ow">ne</span> <span class="mi">0</span> <span class="p">]];</span> <span class="k">then</span> <span class="n">man</span> <span class="n">ssmtp</span><span class="p">;</span> <span class="n">fi</span> </pre></div> <p>EDIT 5/01/10 17:15 </p> <ul> <li>client smtp -&gt; MTA</li> </ul> Upgrader ses packages FreeBSD http://blog.philpep.org/post/Upgrader-ses-packages-FreeBSD http://blog.philpep.org/post/Upgrader-ses-packages-FreeBSD Mon, 28 Dec 2009 02:41:09 GMT <p>J'ai un problème depuis longtemps avec les ports FreeBSD. Dans un premier temps je compilais <em>tout</em>, puis à la longue c'est assez lassant parce que ça prend du temps, des ressources et sur une machine peu puissante c'est pas franchement conseillé. Donc dans la plupart des cas j'utilise maintenant des paquet binaires compilés et distribués par le projet FreeBSD.</p> <p>Je ne vais pas m'attarder à peser le pour et le contre puisqu'en réalité j'utilise aussi bien les ports que les paquets binaires suivant les dépendances du logiciel et le temps de compilation.</p> <p>Environnement : FreeBSD 8.0-RELEASE i386 (à vous de changer suivant votre version et votre CPU)</p> <p>Déjà une bonne chose à savoir :</p> <div class="codehilite"><pre>$ ftp ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/ .... 250-descriptions of each subdirectory. ... 250-packages-*-release directories are built from the ports collection 250-shipped with the release, and are not updated thereafter. 250- 250-packages-*-stable and packages-*-current are updated roughly once a 250-week. .... </pre></div> <p>Les paquets qui nous intéressent sont donc dans <code>packages-8-stable</code>.</p> <p>Pour installer un soft, il suffit d'un</p> <div class="codehilite"><pre># export PACKAGESITE=&quot;ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/Latest/&quot; # pkg_add -r firefox3 </pre></div> <p>Pour mettre à jours c'est nettement moins marrant, surtout si vous utilisez conjointement un arbre des ports à jours dans <code>/usr/ports</code>. Les outils comme <code>portmaster</code> et <code>portupgrade</code> sont assez dur à utiliser pour mettre à jours en se basant non pas sur l'INDEX de <code>/usr/ports</code> mais sur celui du ftp.</p> <p>D'ailleurs si quelqu'un à déjà réussi à faire proprement la manip je veux bien son <code>/usr/local/etc/pkgtools.conf</code> en commentaire de ce billet.</p> <p><a href="http://blog.etoilebsd.net">bapt</a> est en train de porter <a href="http://imil.net/pkgin/">pkgin</a> sur FreeBSD, mais il n'est pas encore tout à fait prêt (il le sera bientôt j'espère, je ferrai un billet pour l'occasion).</p> <p>Il y a une solution que j'ai trouvé sympatique en attendant pkgin, c'est les <code>bsdadminscripts</code> avec l'outil <code>pkg_upgrade</code>. C'est du shell, pas très rapide donc, mais au moins ça marche et c'est facile.</p> <div class="codehilite"><pre># make -C /usr/ports/sysutils/bsdadminscripts install clean </pre></div> <p>Ensuite c'est enfantin, pour tout mettre à jours et en mode verbeux :</p> <div class="codehilite"><pre># setenv PACKAGEROOT ftp://ftp.fr.freebsd.org # setenv BRANCH 8-stable # pkg_upgrade -av </pre></div> <p>Et ça marche ! Il se base sur le md5 du fichier INDEX du ftp pour savoir s'il faut mettre à jours sa base de donnée sur les ports puis compare les version installés avec les versions disponibles.</p> <p>La page de man de <code>pkg_upgrade</code> vous donnera beaucoup d'information sur la manière dont il fonctionne.</p>