<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Geekfault &#187; internet</title>
	<atom:link href="http://geekfault.org/categorie/internet/feed/" rel="self" type="application/rss+xml" />
	<link>http://geekfault.org</link>
	<description>If it doesn&#039;t segfault, you&#039;re doing it wrong.</description>
	<lastBuildDate>Tue, 08 May 2012 17:13:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Yubikey : la petite clé qui assure</title>
		<link>http://geekfault.org/2011/04/14/yubikey-la-petite-cle-qui-assure/</link>
		<comments>http://geekfault.org/2011/04/14/yubikey-la-petite-cle-qui-assure/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 10:30:54 +0000</pubDate>
		<dc:creator>LeCoyote</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[aes]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[otp]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=5735</guid>
		<description><![CDATA[Yubikey, c&#8217;est une petite clé USB un peu spéciale. Une petite pastille tactile sur le dessus permet de générer un mot de passe à usage unique, qu&#8217;un service distant saura utiliser pour vous identifier ou non. C&#8217;est pratique, c&#8217;est sûr (si c&#8217;est bien utilisé), et c&#8217;est assez geek pour qu&#8217;on en parle. Le problème Les [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/06/14/guerre-du-warez/' rel='bookmark' title='La petite guerre du Warez'>La petite guerre du Warez</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2011/03/yubikey.jpg" alt="" title="yubikey" width="250" height="167" class="alignleft size-full wp-image-5747" />Yubikey, c&#8217;est une petite clé USB un peu spéciale. Une petite pastille tactile sur le dessus permet de générer un <strong>mot de passe à usage unique</strong>, qu&#8217;un service distant saura utiliser pour vous identifier ou non. C&#8217;est pratique, c&#8217;est sûr (si c&#8217;est bien utilisé), et c&#8217;est assez geek pour qu&#8217;on en parle.</p>
<p><!--more--><br />
<!--pagetitle:Introduction--></p>
<h3>Le problème</h3>
<p>Les mots de passe se multiplient comme des petits pains, surtout chez les geeks. Comme il est impensable de tous les noter dans un petit calepin ou d&#8217;utiliser le même partout (on est d&#8217;accord ?), il faut sans cesse en inventer de nouveaux et les retenir.</p>
<p>Par ailleurs, si on veut être un peu sérieux, il <strong>faut</strong> se méfier du terminal que l&#8217;on utilise, surtout s&#8217;il appartient à un tiers. Qui vous dit que le vilain admin du cyber-café n&#8217;a pas un vilain keylogger sur toutes ses machines ? Plus fourbe, qui vous dit qu&#8217;il n&#8217;y a pas un vilain keylogger malware installé sur le laptop de votre [maman|grand-père|hamster] que vous utilisez en ce moment, &#8220;pour dépanner&#8221; ? Sans parler d&#8217;attaques type MitM et autres joyeusetés &#8230;</p>
<p>Arrive la Yubikey. Sans être une solution miracle à tous les problèmes de mot de passe, c&#8217;est une façon élégante de se simplifier la vie.</p>
<h3>La Yubikey, en bref</h3>
<div id="attachment_5747" class="wp-caption alignright" style="width: 310px"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2011/03/Yubico-Yubikey-USB-Key-300x157.jpg" alt="" title="Yubico-Yubikey-USB-Key" width="300" height="157" class="alignright size-medium wp-image-5742" /><p class="wp-caption-text">Yubikey 2.0, by Yubico</p></div>
<p>Plutôt que de vous pointer vers le manuel de la Yubikey, je vais en synthétiser quelques passage pour commencer.</p>
<p>La Yubikey fonctionne sur n&#8217;importe quel matériel équipé d&#8217;un port USB hôte et tournant sous à peu près n&#8217;importe quel système d&#8217;exploitation supportant un clavier USB (sous Linux, le support HID suffit) : en effet, elle fonctionne en émulant des frappes clavier, sans avoir recours à un driver particulier.</p>
<p>À chaque utilisation, la clé génère une chaîne de caractères unique (appelée <strong>OTP</strong> pour One Time Password), basée entre autres choses sur une identité propre à la clé, un compteur non-volatile, une horloge et un nombre aléatoire. Cette chaîne est ensuite chiffrée à l&#8217;aide d&#8217;une clé AES de 128 bits et envoyée à l&#8217;hôte. Exemples :</p>
<p>[cc]fifjgjgkhchbirdrfdnlnghhfgrtnnlgedjlftrbdeut<br />
fifjgjgkhchbgefdkbbditfjrlniggevfhenublfnrev<br />
fifjgjgkhchblechfkfhiiuunbtnvgihdfiktncvlhck[/cc]</p>
<p><em>(on constate que les 12 premiers caractères sont toujours les mêmes : il s&#8217;agit là de l&#8217;identité de la Yubikey)</em></p>
<p>De l&#8217;autre côté, elle sera déchiffrée à l&#8217;aide de la même clé AES. De par l&#8217;usage d&#8217;un chiffrement symétrique, la sûreté de l&#8217;ensemble repose sur une bonne protection de la clé AES. Celle-ci est stockée dans une mémoire non volatile intégrée au microcontrolleur et n&#8217;est pas accessible, la configuration de la Yubikey se faisant en <strong>écriture seule</strong>. Pour récupérer la clé, il faudrait éventuellement sonder physiquement la puce ou analyser son comportement, ce qui implique de casser physiquement la Yubikey et de disposer de matériel de pointe. En d&#8217;autres termes, si ce n&#8217;est pas complètement adapté aux agents secrets, c&#8217;est probablement suffisamment sûr pour le geek moyen que je suis.</p>
<p>Le résultat est enfin vérifié par un serveur de validation : soit celui de Yubico, soit un serveur fait maison. La validation tient compte de plusieurs critères, au-delà de la simple identité. Notamment, la valeur du compteur est examinée : si elle est inférieure ou égale à la dernière valeur reçue, l&#8217;OTP est rejeté comme étant un &#8220;rejeu&#8221; d&#8217;un OTP plus ancien.</p>
<p> L&#8217;ensemble se résume au schéma suivant (cliquer pour agrandir) :<br />
<div id="attachment_5921" class="wp-caption aligncenter" style="width: 310px"><a href="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-23.png" title="Yubikey_Principe" rel="lightbox.5735"><img src="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-23-300x222.png" alt="" title="Yubikey_Principe" width="300" height="222" class="size-medium wp-image-5921" /></a><p class="wp-caption-text">Fonctionnement de base de la Yubikey</p></div></p>
<p>Une application doit donc être configurée (ou modifiée) afin d&#8217;accepter un login Yubikey. Comme nous utilisons du logiciel libre, ça se fait en général assez facilement. Nous allons donc voir comment utiliser la Yubikey sous Linux de façon basique, puis nous verrons la configuration dune clé pour une utilisation &#8220;indépendante&#8221; avec serveur de validation maison.</p>
<p><!--nextpage--><!--pagetitle:Utilisation simple --></p>
<h3>Utilisation simple</h3>
<p>De base, nous utiliserons les services de validation de Yubico. Il s&#8217;agit ici de configurer simplement Linux pour identifier un utilisateur en utilisant sa clé.</p>
<h4>Application n°1 : login Linux</h4>
<p>Tout bon Linux moderne utilise en général <a href="http://www.kernel.org/pub/linux/libs/pam/">Linux-PAM</a> pour tout ce qui touche à l&#8217;identification utilisateur. Et comme Yubico a la bonne idée de proposer un module PAM, c&#8217;est ce que nous allons utiliser.</p>
<p>Il y a trois dépôts à aller chercher pour construire notre module PAM : celui de la bibliothèque <a href="https://github.com/Yubico/yubico-c-client">yubico-c-client</a>, celui de l&#8217;outil de configuration<a href="https://github.com/Yubico/yubikey-personalization/">yubikey-personalization</a>, et enfin <a href="https://github.com/Yubico/yubico-pam">yubico-pam</a> lui-même. Pour la suite, je suppose que vous avez déjà git d&#8217;installé, en sus des outils habituels (automake, gcc &#8230;), et que vous savez aller installer une dépendance manquante (comme curl) au besoin.</p>
<h5>Compilations</h5>
<p>On commence par compiler la bilbiothèque client.<br />
[cc][smokey@moira yubi]$ git clone https://github.com/Yubico/yubico-c-client<br />
Cloning into yubico-c-client&#8230;<br />
remote: Counting objects: 397, done.<br />
remote: Compressing objects: 100% (194/194), done.<br />
remote: Total 397 (delta 233), reused 319 (delta 201)<br />
Receiving objects: 100% (397/397), 94.17 KiB, done.<br />
Resolving deltas: 100% (233/233), done.<br />
[smokey@moira yubi]$ cd yubico-c-client/<br />
[smokey@moira yubico-c-client]$ autoreconf &#8211;install<br />
[smokey@moira yubico-c-client]$ ./configure<br />
[smokey@moira yubico-c-client]$ sudo make install<br />
[smokey@moira yubico-c-client]$<br />
[/cc]<br />
Rien que du très classique. La bibliothèque est installée comme il se doit dans /usr/local/lib. Je vous laisse d&#8217;ailleurs faire exactement la même chose avec yubikey-personalization dans un répertoire à côté, vous êtes grands après tout.</p>
<p>On peut maintenant répéter l&#8217;opération avec yubico-pam, à une astuce près : la dépendance ykpers-1 (yubikey-personalization) a été ajoutée très récemment et se vérifie via pkg-config. Il faut donc indiquer à ce dernier où trouver le fichier .pc qui va bien via la variable d&#8217;environnement PKG_CONFIG_PATH. Ce qui donne :<br />
[ccW][smokey@moira yubico-pam]$ cd ..<br />
[smokey@moira yubi]$ git clone https://github.com/Yubico/yubico-pam<br />
[smokey@moira yubi]$ cd yubico-pam/<br />
[smokey@moira yubico-pam]$ autoreconf &#8211;install<br />
[smokey@moira yubico-pam]$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig ./configure<br />
[smokey@moira yubico-pam]$ sudo make install<br />
[smokey@moira yubico-pam]$[/ccW]</p>
<p>Le module est installé dans /usr/local/lib/security. Pour que PAM puisse l&#8217;utiliser, il faut le mettre au bon endroit (et donc être root) :<br />
[cc]# mv /usr/local/lib/security/pam_yubico.so /lib/security/[/cc]</p>
<h5>Configuration de PAM</h5>
<p>Il faut maintenant indiquer à PAM que l&#8217;on veut pouvoir utiliser l&#8217;OTP de la Yubikey. Pour ce faire, on modifie <strong>/etc/pam.d/login</strong> pour y faire ajouter la ligne suivante :<br />
[cc]auth            sufficient      pam_yubico.so id=16[/cc]<br />
<strong>Attention :</strong> si vous n&#8217;êtes pas très familiers avec PAM, sachez qu&#8217;il faut ajouter cette ligne au bon endroit. Je vous recommande de la mettre juste au-dessus de celle du module <strong>pam_unix.so</strong>. Si vous la placez trop haut, étant donné que le module est ici <strong>sufficient</strong> (suffisant), il shuntera les modules auth suivants, même s&#8217;ils sont <strong>required</strong> (requis) : pam_securetty ou pam_nologin seraient par exemple rendus inefficaces, ce qui PEUT être grave OU PAS. À vous de voir <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Variantes possibles :</p>
<ul>
<li> avec debug (conseillé en cas de souci)<br />
[cc]auth  sufficient  pam_yubico.so id=16 debug[/cc]</li>
<li> avec gestion centralisée des identités<br />
[cc]auth  sufficient  pam_yubico.so id=16 authfile=<chemin absolu>[/cc]</li>
</ul>
<p><strong>Note :</strong> pour observer les messages de debug, il suffit de créer le fichier <strong>/var/run/pam-debug.log</strong> et de le rendre inscriptible à tous.</p>
<p>Pour finir, il faut renseigner le système sur l&#8217;identité des yubikeys des utilisateurs. Il y a deux façons de le faire :</p>
<ul>
<li> individuellement : il faut alors créer <strong>~/.yubico/authorized_yubikeys</strong> pour chaque utilisateur ;</li>
<li> globalement : le fichier peut se trouver n&#8217;importe où, du moment que le chemin correspond à celui passé à <strong>authfile=</strong> ci-dessus évidemment.</li>
</ul>
<p>Dans les deux cas, le format du fichier est :<br />
[cc]<login>:<yubi ID1>:<yubi ID2>&#8230;[/cc]<br />
Pour le fichier global, ayez soin d&#8217;utiliser une ligne par enregistrement utilisateur. L&#8217;ID de chaque Yubikey peut facilement être récupéré en prenant les 12 premiers caractères de n&#8217;importe quel OTP généré.</p>
<p>Si tout s&#8217;est bien passé, au prochain login, vous devriez voir quelque chose dans ce genre :<br />
<div id="attachment_5857" class="wp-caption aligncenter" style="width: 332px"><img src="http://geekfault.org/wp-content/uploads/2011/03/yubikey-login1.jpg" alt="yubikey login" title="yubikey login" width="322" height="87" class="size-full wp-image-5857" /><p class="wp-caption-text">Login console avec la Yubikey<br />
On effleure la clé, et c'est gagné <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p></div></p>
<h4>Application n°2 : authentification à 2 facteurs avec SSH</h4>
<p>L&#8217;authentification à 2 facteurs est basée, comme son nom l&#8217;indique, sur deux moyens d&#8217;authentification différents. Ici, nous sommes dans le cas typique de &#8220;ce que l&#8217;on connaît&#8221; (un mot de passe classique) combiné avec &#8220;ce que l&#8217;on détient&#8221; (la Yubikey). Les deux seront combinés pour former un mot de passe hybride, que l&#8217;on va charger pam_yupico de valider. En image, ça donne ça :<br />
<div id="attachment_5929" class="wp-caption aligncenter" style="width: 310px"><a href="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-2factorbis1.png" title="YUBIKEY-2factorbis" rel="lightbox.5735"><img src="http://geekfault.org/wp-content/uploads/2011/03/YUBIKEY-2factorbis1-300x249.png" alt="Yubikey 2 Factor" title="YUBIKEY-2factorbis" width="300" height="249" class="size-medium wp-image-5929" /></a><p class="wp-caption-text">Fonctionnement de l&#039;authentification à 2 facteurs avec SHS et PAM</p></div></p>
<p>La marche à suivre est sensiblement la même que précédemment, sauf bien entendu pour ce qui est de la configuration de PAM. Ici, on va s&#8217;intéresser logiquement à <strong>/etc/pam.d/sshd</strong>. Tout d&#8217;abord, on y ajoute la ligne suivante :<br />
[cc]auth       required     pam_yubico.so id=16[/cc]<br />
Par rapport à tout-à-l&#8217;heure, l&#8217;utilisation de la Yubikey est ici requise au lieu d&#8217;être suffisante. Du coup, on ne risque plus de shunter d&#8217;autre modules, mais il faut tout de même placer cette ligne AVANT celle de <strong>pam_unix.so</strong>.</p>
<p>Ensuite, il faut modifier les paramètres du module <strong>pam_unix.so</strong>. Celui-ci peut être configuré directement dans <strong>/etc/pam.d/sshd</strong> (ex. Archlinux), ou être appelé par un <strong>@include</strong> pointant sur <strong>/etc/pam.d/system-auth</strong> (ex. Gentoo) ou <strong>/etc/pam.d/common-auth</strong> (ex. Debian) : à vous d&#8217;adapter en fonction de ce que vous avez sous les yeux. L&#8217;important est d&#8217;ajouter l&#8217;option <strong>try_first_pass</strong>, de façon à ce que la ligne ressemble à ceci :<br />
[cc]auth       required     pam_unix.so try_first_pass nullok[/cc]</p>
<p>Une fois ces modifications faites, il ne reste plus qu&#8217;à vous connecter à la machine distante comme d&#8217;habitude ; mais au lieu de taper simplement <strong>Entrée</strong> pour valider le mot de passe, on va rajouter l&#8217;OTP de la Yubikey. En d&#8217;autres termes, au lieu de faire <strong>mot_de_passe+Entrée</strong>, on fait <strong>mot_de_passe+toucher_la_yubikey</strong>.</p>
<p>Et ça marche ! Sauf si bien sûr vous avez oublié de préciser <strong>PasswordAuthentication yes</strong> dans votre <strong>/etc/ssh/sshd_config</strong> &#8230; c&#8217;était pour voir si vous suiviez <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
<div id="attachment_5870" class="wp-caption aligncenter" style="width: 351px"><img src="http://geekfault.org/wp-content/uploads/2011/03/yubikey_ssh.jpeg" alt="yubikey en ssh" title="yubikey_ssh" width="341" height="70" class="size-full wp-image-5870" /><p class="wp-caption-text">Login SSH. Par défaut, SSH propose d&#039;utiliser la clé publique s&#039;il en trouve une : taper entrée pour passer à l&#039;étape suivante.</p></div></p>
<p><!--nextpage--><!--pagetitle:Utilisation avancée --></p>
<h3>Utilisation avancée</h3>
<p>Dans cette partie, un peu plus technique, nous allons aborder la configuration d&#8217;une Yubikey et le montage d&#8217;un serveur de validation. Mais avant tout &#8230;</p>
<h4>ATTENTION</h4>
<p>La Yubikey est “write-only”. Ceci signifie que lors d&#8217;une opération de configuration, les réglages précédents sont irrémédiablement perdus. Notamment, si vous écrasez la configuration par défaut, votre clé ne pourra plus vous identifier auprès de Yubico.<br />
Par ailleurs, si vous décidez de protéger la clé par un code d&#8217;accès, et que vous oubliez ce code, vous aurez gagné un joli bout de plastique très décoratif &#8230;</p>
<p>Ceci dit, passons aux choses sérieuses.</p>
<h4>Configuration de la clé</h4>
<p>Sous Linux, le seul outil disponible pour l&#8217;instant est en ligne de commande. Si ça vous fait peur, il y a des équivalent pour clicodrome Windows ou Mac OS. <a href="http://www.yubico.com/personalization-tool">Choisissez ici</a> celui qui vous convient le mieux <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Le dépôt de l&#8217;outil de configuration (ou personalization en anglais) est ici : <a href="https://github.com/Yubico/yubikey-personalization.git">https://github.com/Yubico/yubikey-personalization.git</a>. Je ne reviens pas sur la procédure d&#8217;installation, elle est identique aux précédentes et détaillée <a href="https://github.com/Yubico/yubikey-personalization/wiki/Read-Me">sur le wiki du projet</a>. D&#8217;ailleurs, si vous avez suivi la partie sur la configuration de PAM, vous l&#8217;avez déjà installé <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Une fois compilé, je vous engage vivement à jeter un oeil à l&#8217;aide en ligne : [cci]ykpersonalize -h [/cci]</p>
<p>L&#8217;option la plus importante à mes yeux est <strong>-1</strong> ou <strong>-2</strong> : c&#8217;est ainsi que l&#8217;on choisit la configuration que l&#8217;on souhaite modifier. En effet, les Yubikeys version 2.0 et plus possèdent deux “emplacements” différents, contre un seul dans la première version. Par défaut sur une clé 2.0 par exemple, l&#8217;emplacement 1 est paramétré pour une identification OTP auprès des serveurs de Yubico, et l&#8217;emplacement 2 est vide.</p>
<p>Le paramétrage le plus fréquemment rencontré est d&#8217;assigner un <strong>mot de passe statique</strong> à la configuraion 2, mot de passe qui sera accessible par un contact long (≃ 2s). La manipulation est ici très simple :<br />
[cc lines="16"]smokey@moira:~$ sudo ykpersonalize -2<br />
Password:<br />
Firmware version 2.0.2 Touch level 1792 Program sequence 6</p>
<p>Passphrase to create AES key: crévindiou<br />
Configuration data to be written to key configuration 2:</p>
<p>fixed: m:<br />
uid: h:000000000000<br />
key: h:459b2b6c6f4c511d543919efbad3051a<br />
acc_code: h:000000000000<br />
ticket_flags: APPEND_CR<br />
config_flags: STATIC_TICKET|STRONG_PW1|STRONG_PW2|MAN_UPDATE<br />
extended_flags: </p>
<p>Commit? (y/n) [n]:[/cc]<br />
Il ne reste plus qu&#8217;à valider par un &#8220;<strong>y</strong>&#8221; pour sauvegarder la configuration.<br />
Notez que vous n&#8217;êtes pas obligés de taper des bêtises (comme mon &#8220;crévindiou&#8221;) pour créer la clé AES. Le résultat sera ici un mot de passe statique du style :<br />
[cci]è(IFejhdkkjnvrtbdeggeffvbknvbulg[/cci].</p>
<p><strong>Note :</strong> Pourquoi sudo ? tout simplement parce que les permissions de /dev/bus/usb/xxx/yyy n&#8217;autorisent en général pas l&#8217;utilisateur lambda à écrire sur un port USB.</p>
<p>Il est également possible de créer une configuration &#8220;<strong>OTP Yubikey</strong>&#8221; similaire à la configuration par défaut. Je fais ici le choix d&#8217;utiliser l&#8217;emplacement 2, afin de conserver la configuration d&#8217;origine dans l&#8217;emplacement 1. Or, l&#8217;outil ykpersonalize considère par défaut que l&#8217;option -2 va de pair avec une configuration statique ; il faut donc désactiver les options liées au mot de passe statique pour écrire une configuration OTP dans l&#8217;emplacement 2 (d&#8217;où les 4 options -o-xxx). Si ce n&#8217;est pas clair, faites tourner “à vide” (sans écrire) ykpersonalize avec -1 et -2, et observez les différents config_flags. Ici, ça nous donne :<br />
[ccW lines="16"]smokey@moira:~/tmp/yubiserve$ sudo ykpersonalize -2 -o-static-ticket -o-strong-pw1 -o-strong-pw2  -o-man-update -ofixed=cccccccccccc<br />
Firmware version 2.0.2 Touch level 1792 Program sequence 6</p>
<p>Passphrase to create AES key:<br />
Configuration data to be written to key configuration 2:</p>
<p>fixed: m:cccccccccccc<br />
uid: h:000000000000<br />
key: h:8ebfe5cd3dad48f2c5008d686ea5b384<br />
acc_code: h:000000000000<br />
ticket_flags: APPEND_CR<br />
config_flags:<br />
extended_flags: </p>
<p>Commit? (y/n) [n]: y<br />
smokey@moira:~/tmp/yubiserve$<br />
[/ccW]</p>
<p>La configuration 2 de la clé est donc faite pour l&#8217;identité <strong>cccccccccccc</strong> et avec la clé AES <strong>8ebfe5cd3dad48f2c5008d686ea5b384</strong>. Nous allons voir maintenant comment utiliser cette configuration avec un serveur de validation maison.</p>
<h4>Serveur de validation “maison”</h4>
<p>Comme me le faisait remarquer un certain <a href="http://blog.spyou.org/">Spyou</a>, confier à un tiers la vérification du droit d&#8217;accès à son infrastructure n&#8217;est probablement pas l&#8217;idée du siècle. Mon infrastructure se limite à peu de choses, mais tant qu&#8217;à faire, autant garder la vérification en interne. Il s&#8217;agit donc maintenant de monter son propre serveur de vérification. Yubico en référence <a href="http://www.yubico.com/validation-server">quelques-uns</a>, je vais ici détailler l&#8217;installation et la configuration du plus simple, <a href="http://code.google.com/p/yubico-yubiserve/">YubiServe</a>. Et quand je dis simple, je pèse mes mots : le tout tient en 2 scripts Python <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Avant tout, je vous recommande d&#8217;éviter la version 3.1, qui (chez moi en tout cas) contient des &#8220;?&#8221; partout là où on attend des tabulations. Je vais donc partir du trunk svn :<br />
[cc]svn checkout http://yubico-yubiserve.googlecode.com/svn/trunk/ yubiserve[/cc]</p>
<p>Ceci fait, suivons les instructions du README.<br />
Tout d&#8217;abord, on crée un certificat SSL :<br />
[ccW]openssl req -new -x509 -keyout yubiserve.pem -out yubiserve.pem -days 365 -nodes[/ccW]</p>
<p>Ensuite, si vous avez installé Python 2 et 3 sur votre système, il vous faudra peut-être modifier un peu les scripts <strong>dbconf.py</strong> et <strong>yubiserve.py</strong> : soit pour faire pointer l&#8217;interpréteur vers python2, soit pour modifier l&#8217;appel au module sqlite en sqlite3. Par défaut, YubiServe utilisera une base sqlite (déjà présente d&#8217;origine), mais il suffit de modifier le fichier de configuration (yubiserve.cfg) pour utiliser une base MySQL à la place.</p>
<p>Il est temps maintenant d&#8217;ajouter une clé au serveur. Utilisons donc <strong>dbconf.py</strong>, qui prend en arguments un “nickname” permettant d&#8217;identifier facilement la clé, ainsi que l&#8217;uid et la clé AES utilisés lors du paramétrage (cf. plus haut).<br />
[ccW]smokey@moira:~/tmp/yubiserve$ ./dbconf.py -ya smokey cccccccccccc 000000000000 8ebfe5cd3dad48f2c5008d686ea5b384<br />
Key &#8216;smokey&#8217; added to database.<br />
smokey@moira:~/tmp/yubiserve$[/ccW]<br />
On en profite pour ajouter aussi l&#8217;identité <strong>cccccccccccc</strong> dans le /home/utilisateur/.yubico/authorized_yubikeys qui va bien.</p>
<p>Lançons le serveur :<br />
[cc]smokey@moira:~/tmp/yubiserve$ ./yubiserve.py<br />
HTTP Server is running.<br />
[/cc]</p>
<p>Il ne reste plus qu&#8217;à essayer le tout, en faisant pointer un navigateur sur <a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>, ce qui donne normalement ceci :<br />
<a href="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid1.png" title="yubikey_valid1" rel="lightbox.5735"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid1.png" alt="YubiServe" title="yubikey_valid1" width="520" height="273" class="aligncenter size-medium wp-image-5964" /></a></p>
<p>Il suffit alors d&#8217;envoyer l&#8217;OTP dans le champ prévu à cet effet pour obtenir le résultat :<br />
<a href="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid2.png" title="yubikey_valid2" rel="lightbox.5735"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2011/04/yubikey_valid2.png" alt="" title="yubikey_valid2" width="520" height="273" class="aligncenter size-medium wp-image-5966" /></a></p>
<p>Ça fonctionne ! Mais comment faire en sorte d&#8217;interroger ce serveur ? Nous allons voir le cas du module PAM, configuré dans la partie précédente.</p>
<h4>PAM + Serveur de validation maison</h4>
<p>Rappelez-vous, la configuration ressemblait à ça :<br />
[cc]auth       required     pam_yubico.so id=16[/cc]<br />
Nous allons la transformer en ça :<br />
[ccW]auth       required     pam_yubico.so id=1 debug url=http://127.0.0.1:8000/wsapi/2.0/verify?id=%d&#038;otp=%s[/ccW]</p>
<p>Par ailleurs, vous aurez remarqué que l&#8217;on a précisé un <strong>id</strong> en argument à pam_yubico. Cet id numérique sera passé via l&#8217;URL au serveur de validation : il faut donc qu&#8217;il soit défini côté serveur. Nous allons donc ajouter une clé d&#8217;API :<br />
[cc]smokey@moira:~/tmp/yubiserve$ ./dbconf.py -aa test-ssh<br />
New API Key for &#8216;test2&#8242;: &#8216;WGZydWozbHQyVW9BM092cy9nMTk=&#8217;<br />
Your API Key ID is: 1[/cc]<br />
Bien entendu, notre &#8220;API Key ID&#8221; est 1 seulement si c&#8217;est le premier à être créé ; l&#8217;important est qu&#8217;il existe.</p>
<p>C&#8217;est fini ! On peut maintenant s&#8217;identifier auprès de PAM avec la clé re-configurée par nos soins.</p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<h3>N&#8217;oublions pas &#8230;</h3>
<p>Il serait imprudent de penser que la Yubikey est la réponse à tout. Elle n&#8217;est qu&#8217;un élément de plus dans une stratégie de sûreté qui se doit d&#8217;être solide par ailleurs (c&#8217;est toujours le maillon le plus faible qui compte). Si votre login est connu et que vous n&#8217;utilisez *que* la Yubikey pour vous connecter, c&#8217;est déjà beaucoup moins sûr qu&#8217;un schéma à 2 facteurs.</p>
<p>Par ailleurs, comme la Yubikey fonctionne en émulant une saisie clavier, son comportement dépendra du type de clavier utilisé sur le terminal ; si la plupart des dispositions classiques (azerty/qwerty) ne devraient pas poser problème, il en est tout autrement pour les dispositions plus &#8220;exotiques&#8221; (comme bepo) ou utilisant des caractères non-latins (cyrilliques par exemple). Ce n&#8217;est pas un point bloquant en soi, vu qu&#8217;il suffit de changer temporairement la configuration du clavier, mais je me devais de le souligner, vu qu&#8217;on m&#8217;avait posé la question.</p>
<h3>Conclusion et informations additionnelles</h3>
<p>Tout comme une clé SSH avec un user-agent, une Yubikey permet d&#8217;éviter de taper des mots de passe à chaque login. C&#8217;est un gain de temps et de tranquillité d&#8217;esprit. C&#8217;est aussi une sécurité supplémentaire car les mots de passe générés ne sont pas réutilisables, ce qui invalide toute forme d&#8217;attaque par rejeu. Cerise sur le gâteau, on trouve déjà pas mal de solutions logicielles libres, venant de Yubico ou d&#8217;ailleurs, permettant de tirer le maximum de sa clé. Que demander de plus ? <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Liens</h3>
<ul>
<li>Le site de Yubico, le fabricant : <a href="http://www.yubico.com/">http://www.yubico.com/</a></li>
<li>Le lien direct Yubikey du site : <a href="http://www.yubico.com/yubikey">http://www.yubico.com/yubikey</a></li>
<li>La bibliothèque Yubico-C : <a href="https://github.com/Yubico/yubico-c-client">https://github.com/Yubico/yubico-c-client</a></li>
<li>L&#8217;outil de configuration : <a href="https://github.com/Yubico/yubikey-personalization">https://github.com/Yubico/yubikey-personalization</a></li>
<li>Le module Yubico-PAM : <a href="https://github.com/Yubico/yubico-pam">https://github.com/Yubico/yubico-pam</a></li>
<li>Le HOWTO pour SSH : <a href="https://github.com/Yubico/yubico-pam/wiki/YubikeyAndSSHViaPAM">https://github.com/Yubico/yubico-pam/wiki/YubikeyAndSSHViaPAM</a></li>
</ul>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/06/14/guerre-du-warez/' rel='bookmark' title='La petite guerre du Warez'>La petite guerre du Warez</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2011/04/14/yubikey-la-petite-cle-qui-assure/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Reverse SSH : accéder à un serveur derrière un NAT/Firewall</title>
		<link>http://geekfault.org/2011/02/19/reverse-ssh-acceder-a-un-serveur-derriere-un-natfirewall/</link>
		<comments>http://geekfault.org/2011/02/19/reverse-ssh-acceder-a-un-serveur-derriere-un-natfirewall/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 14:30:35 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tunnel]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=5530</guid>
		<description><![CDATA[Le SSH tout le monde le sait, c&#8217;est magique. Mais malheureusement ça ne marche pas OOTB. On a tous en tête plusieurs situations où on s&#8217;est dit &#8220;Damn, si seulement j&#8217;avais un accès SSH sur cette machine&#8221;, la machine étant inaccessible parce que derrière un firewall ou routeur NAT que vous ne contrôlez pas. Imaginez [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/27/lighttpd-php-iphone/' rel='bookmark' title='Serveur Lighttpd avec PHP sur iPhone'>Serveur Lighttpd avec PHP sur iPhone</a></li>
<li><a href='http://geekfault.org/2009/12/14/facebook-lancer-son-serveur-xmpp/' rel='bookmark' title='Facebook s&#8217;apprêterait à lancer son serveur XMPP'>Facebook s&#8217;apprêterait à lancer son serveur XMPP</a></li>
<li><a href='http://geekfault.org/2009/05/14/tunnel-ssh/' rel='bookmark' title='Le tunnel SSH facile'>Le tunnel SSH facile</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/wp-content/uploads/2011/02/ssh.jpg" title="ssh" rel="lightbox.5530"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2011/02/ssh-300x196.jpg" alt="" title="ssh" width="300" height="196" class="alignleft size-medium wp-image-5699" /></a>Le SSH tout le monde le sait, c&#8217;est magique. Mais malheureusement ça ne marche pas OOTB. On a tous en tête plusieurs situations où on s&#8217;est dit &#8220;Damn, si seulement j&#8217;avais un accès SSH sur cette machine&#8221;, la machine étant inaccessible parce que derrière un firewall ou routeur NAT que vous ne contrôlez pas.</p>
<p>Imaginez avoir accès en SSH à la machine de ce noob qui ne sait pas configurer son NAT. Ou bien vous assurer que votre laptop soit toujours joignable en SSH peu importe la connexion sur laquelle il est&#8230;</p>
<p><a href="http://www.youtube.com/watch?v=U4oB28ksiIo&#038;t=3m12s">Cette conférence du DEF-Con</a> m&#8217;a interloqué : comment le mec a repris la main sur une machine qui était probablement derrière un NAT? Peut-être grâce au reverse SSH !<br />
<!--more--></p>
<h3>Principe de fonctionnement</h3>
<p>Le principe est assez simple : c&#8217;est l&#8217;ordinateur derrière le NAT (nous l&#8217;appellerons <strong><em>distant</em></strong>) qui doit établir la première connexion. Il établit en fait un <a href="http://geekfault.org/2009/05/14/tunnel-ssh/">tunnel SSH</a> vers vous (nous l&#8217;appellerons <strong><em>local</em></strong>) et ainsi en remontant le tunnel dans l&#8217;autre sens on accède très facilement à la destination.</p>
<div style="text-align:center;"><img src="http://geekfault.org/wp-content/uploads/2011/02/reverse-ssh.png" alt="" title="reverse-ssh" width="580" height="154" class="alignnone size-full wp-image-5702" /></div>
<p>On suppose donc que la connexion SSH vers l&#8217;ordinateur <strong>local</strong> est aisée (serveur dédié ou NAT bien configuré).</p>
<h3>Avantages</h3>
<p><a href="http://geekfault.org/wp-content/uploads/2011/02/reverse-ssh-firewall.jpg" title="reverse-ssh-firewall" rel="lightbox.5530"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2011/02/reverse-ssh-firewall-300x189.jpg" alt="" title="reverse-ssh-firewall" width="300" height="189" class="alignright size-medium wp-image-5705" /></a>
<ul>
<li>Plus besoin de connaître ou de modifier la configuration du réseau sur lequel est branché distant pour pouvoir y établir une connexion SSH. Tant que le port 22 est ouvert en outgoing ça fonctionnera (on peut même envisager de déplacer le serveur de local sur un port moins restreint tel que le 80 ou 443)</li>
<li>Plus besoin de connaître l&#8217;IP où se trouve distant, c&#8217;est lui qui établit le contact vers local</li>
</ul>
<h3>Vérifiez la configuration du serveur SSH local</h3>
<p>Il faut que le serveur sur local autorise les tunnels (<strong>/etc/ssh/sshd_config</strong>) :<br />
<code>AllowTcpForwarding yes</code></p>
<h3>Let&#8217;s go!</h3>
<p>Sur <strong>distant</strong> (la machine inaccessible), créez le tunnel :<br />
<code>distant$ ssh -NR 22222:localhost:22 user@local</code><br />
Bien entendu local est l&#8217;IP de votre machine et user est un utilisateur qui y a accès.</p>
<p>Une fois le tunnel établi, il ne vous reste plus qu&#8217;à remonter le tunnel pour établir la connexion SSH depuis <strong>local</strong> :<br />
<code>local$ ssh -p 22222 user@127.0.0.1</code></p>
<h3>Service au démarrage</h3>
<p>Avec <strong>autossh</strong> (disponible dans le package manager de votre distro préférée) et une <a href="http://geekfault.org/2009/05/15/ssh-sans-mot-de-passe/">connexion SSH sans mot de passe</a>, vous pouvez très facilement créer un script de démarrage sur distant pour que le tunnel soit toujours récréé sans intervention humaine :<br />
<code># autossh -i /path/to/privateKey.rsa -NR 22222:localhost:22 user@local</code></p>
<p>Il vous suffit d&#8217;ajouter cette commande dans vos scripts de boot (/etc/rc.local par exemple).</p>
<h3>Aller plus loin</h3>
<p>Ici nous utilisons du SSH pour ouvrir l&#8217;accès à un serveur SSH, mais on pourrait envisager d&#8217;ouvrir l&#8217;accès à n&#8217;importe quel serveur qui tournerait sur distant, par exemple un serveur web pour du <a href="http://geekfault.org/2010/02/20/monitoring-munin/">monitoring Munin</a> :<br />
<code>distant$ ssh -NR 22280:localhost:80 user@local<br />
local$ firefox "http://127.0.0.1:22280"</code></p>
<p>Vous l&#8217;aurez compris, vous pouvez aussi centraliser sur votre serveur (&#8220;local&#8221;) des tunnels venant de tous les n00bs que vous aidez régulièrement, l&#8217;astuce est de remplacer 22222 dans les diverses commandes citées sur cette page par un autre code de port compris entre 1024 et 65535. Et de maintenir une liste exhaustive de ceux-ci !</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/27/lighttpd-php-iphone/' rel='bookmark' title='Serveur Lighttpd avec PHP sur iPhone'>Serveur Lighttpd avec PHP sur iPhone</a></li>
<li><a href='http://geekfault.org/2009/12/14/facebook-lancer-son-serveur-xmpp/' rel='bookmark' title='Facebook s&#8217;apprêterait à lancer son serveur XMPP'>Facebook s&#8217;apprêterait à lancer son serveur XMPP</a></li>
<li><a href='http://geekfault.org/2009/05/14/tunnel-ssh/' rel='bookmark' title='Le tunnel SSH facile'>Le tunnel SSH facile</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2011/02/19/reverse-ssh-acceder-a-un-serveur-derriere-un-natfirewall/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La nouvelle mode Geek : avoir son domaine .42</title>
		<link>http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/</link>
		<comments>http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 18:16:50 +0000</pubDate>
		<dc:creator>bragon</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[42registry]]></category>
		<category><![CDATA[bind9]]></category>
		<category><![CDATA[djbdns]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[named]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=5508</guid>
		<description><![CDATA[Ça claque à mort non d&#8217;avoir un nom de domaine en .42 ? Vous l&#8217;avez rêvé ! Ils l&#8217;ont fait ! En clin d’œil à H2G2, pour épater un peu Marvin, et parce que la réponse universelle doit bien être ré-solvable quelque part sur le net Pour le moment pure expérimentation de la 42registry de [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/06/30/geek-en-avion/' rel='bookmark' title='Un geek en vacances'>Un geek en vacances</a></li>
<li><a href='http://geekfault.org/2012/05/08/comment-faire-un-initram-minimal-avec-mode-rescue/' rel='bookmark' title='Comment faire un Initram minimal avec mode rescue'>Comment faire un Initram minimal avec mode rescue</a></li>
<li><a href='http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/' rel='bookmark' title='maintenir son DNS menteur avec Adblock'>maintenir son DNS menteur avec Adblock</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/42big/" rel="attachment wp-att-5511"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/12/42big-283x300.png" alt="" title="42big" width="283" height="300" class="alignleft size-medium wp-image-5511" /></a></p>
<p>Ça claque à mort non d&#8217;avoir un nom de domaine en .42 ?<br />
Vous l&#8217;avez rêvé ! Ils l&#8217;ont fait !<br />
En clin d’œil à H2G2, pour épater un peu Marvin, et parce que la réponse universelle doit bien être ré-solvable quelque part sur le net <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Pour le moment pure expérimentation de la 42registry de ce .42, juste avant de peut être conquérir le monde ! (L&#8217;univers et le reste !)</p>
<p><!--more--></p>
<h3> Pourquoi on vous parle de ça ? </h3>
<p>Bah parce que la <a href="http://42registry.org">42registry.org</a> ils sont cool, on les aimes bien, et on a envie de les aider.<br />
C&#8217;est des fous, et nous chez GeekFault on aime bien les fous.</p>
<p>Vous pouvez d&#8217;ailleurs remarquer que si vous savez résoudre les domaines en .42 <a href="http://geekfault.42">http://geekfault.42</a> est disponible.</p>
<p>Vous pouvez d&#8217;ailleurs remarquer que vous pouvez venir nous parler de geekfault ou de 42registry sur Geeknode : 4.irc.42 / salon #geekfault / et salon : #42</p>
<p>Votre humble serviteur est également lisible sur son .42 : <a href="http://bragon.42">http://bragon.42</a></p>
<h3> Erf, je sais pas résoudre les domaines en .42, comment je fais ? </h3>
<p>3 méthodes pour le moment :<br />
- Je possède mon propre serveur DNS bind9<br />
- Je possède mon propre serveur DNScache DJBDNS.<br />
- Je veux utiliser des serveurs DNS open qui savent résoudre .42</p>
<h4> Je possède Bind </h4>
<p>Et bah je rajoute à mon named.conf (ou named.conf.local selon les distribs): </p>
<p><code><br />
zone “42″ IN {<br />
type forward;<br />
forwarders {81.93.248.69; 81.93.248.68; 91.194.60.196; 193.17.192.53; };<br />
};<br />
</code></p>
<p>Je reload bind, et roulz.<br />
<code><br />
/etc/init.d/bind9 reload<br />
</code><br />
ou<br />
<code><br />
/etc/init.d/named reload<br />
</code></p>
<h4> J&#8217;ai DJB &#8230; Oui Je sais &#8230;. </h4>
<p><code><br />
cd /services/dnscache<br />
echo 91.191.147.246 > root/servers/42<br />
echo 91.191.147.243 >> root/servers/42<br />
svc -t /services/dnscache<br />
</code></p>
<h4> Je suis un pauvre pommé, j&#8217;ai pas de serveur de nom </h4>
<p>Et  bien j&#8217;utilise les openDNS de GeekNode.org :</p>
<p>On édite /etc/resolv.conf<br />
<code><br />
nameserver 81.93.248.69<br />
nameserver 81.93.248.68<br />
</code></p>
<h3> Hey mec ? Comment je réserve mon .42 ? </h3>
<p>Gros poulet ! t&#8217;es pas déjà sur : <a href="http://42registry.org">http://42registry.org</a>, tout est expliqué en long en large et en travers !<br />
Alors va vite réserver ton .42 et faire passer le message.</p>
<p><strong>Merci à la team 42registry pour tout l&#8217;poisson !</strong></p>
<p>(Et surtout à Colin qui se reconnaîtra ;D)</p>
<h3> Liste des domaines enregistrés </h3>
<p>Ils sont disponible ici : <a href="http://bragon.42/42.txt">http://bragon.42/42.txt</a></p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/06/30/geek-en-avion/' rel='bookmark' title='Un geek en vacances'>Un geek en vacances</a></li>
<li><a href='http://geekfault.org/2012/05/08/comment-faire-un-initram-minimal-avec-mode-rescue/' rel='bookmark' title='Comment faire un Initram minimal avec mode rescue'>Comment faire un Initram minimal avec mode rescue</a></li>
<li><a href='http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/' rel='bookmark' title='maintenir son DNS menteur avec Adblock'>maintenir son DNS menteur avec Adblock</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Devenez miroir de Wikileaks sans risque (corrigé)</title>
		<link>http://geekfault.org/2010/12/05/devenez-miroir-de-wikileaks-sans-risque/</link>
		<comments>http://geekfault.org/2010/12/05/devenez-miroir-de-wikileaks-sans-risque/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 23:14:55 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[chroot]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[sftp]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[wikileaks]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=5476</guid>
		<description><![CDATA[Bon, d&#8217;habitude on se refuse de parler politique sur Geekfault&#8230; Mais on ne peut pas se taire plus longtemps sur ce qui se passe du côté de Wikileaks. En tant que geeks nous devons nous lever et protester contre ces atteintes à la liberté d&#8217;expression sur Internet. Wikileaks a aujourd&#8217;hui publié sa solution à la [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/15/ssh-sans-mot-de-passe/' rel='bookmark' title='SSH sans mot de passe'>SSH sans mot de passe</a></li>
<li><a href='http://geekfault.org/2010/05/09/choisir-son-keymap-x-org-1-8-sans-xorg-conf-ni-hack/' rel='bookmark' title='Choisir son keymap X.org 1.8 sans xorg.conf ni hack'>Choisir son keymap X.org 1.8 sans xorg.conf ni hack</a></li>
<li><a href='http://geekfault.org/2010/07/15/zeroconf-reseaux-ip-sans-configuration/' rel='bookmark' title='Zeroconf : Réseaux IP sans configuration'>Zeroconf : Réseaux IP sans configuration</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/wp-content/uploads/2010/12/wikileaks.png" title="wikileaks" rel="lightbox.5476"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/12/wikileaks-130x300.png" alt="" title="wikileaks" width="130" height="300" class="alignleft size-medium wp-image-5479 noborder" /></a>Bon, d&#8217;habitude on se refuse de parler politique sur Geekfault&#8230; Mais on ne peut pas se taire plus longtemps sur ce qui se passe du côté de Wikileaks. En tant que geeks nous devons nous lever et protester contre ces atteintes à la liberté d&#8217;expression sur Internet.</p>
<p>Wikileaks a aujourd&#8217;hui publié sa solution à la censure : le mirroring. Si Wikileaks est consultable sur des centaines de noms de domaine et des centaines d&#8217;IPs, il sera d&#8217;autant plus difficile de tous les faire taire.</p>
<p>A noter que cet article, bien qu&#8217;entièrement orienté autour de ce sujet, s&#8217;applique aussi si vous souhaitez offrir à quelqu&#8217;un <strong>un accès SSH chrooté et aux commandes limitées</strong>.</p>
<p><em><strong>Mise à jour :</strong> Mes mesures de sécurité étaient trop optimistes : Rsync n&#8217;utilise pas du SFTP mais doit pouvoir lancer un serveur Rsync sur sa destination en SSH. Voici donc une nouvelle version de cet article, testé et approuvé.</em><br />
<!--more--></p>
<h3>Le problème</h3>
<p>Pour décentraliser la chose, les administrateurs de Wikileaks demande à tous les volontaires de leur offrir un accès en SSH à leur serveur pour pouvoir y pousser un miroir de Wikileaks et le garder à jour grâce à Rsync.</p>
<p>Ca qui m&#8217;a dérangé c&#8217;est le fait de donner un accès SSH à des inconnus sur mon serveur. Mais la solution existe : <strong>CHROOTER</strong> ce compte à un endroit où il ne peut faire aucun mal au système. Voici comment faire.</p>
<p><strong>Attention : cet article ne porte bien évidemment pas sur la sécurisation de votre serveur. Il présente juste une manière d&#8217;éviter que les administrateurs de Wikileaks (que vous ne connaissez pas) aient trop de libertés sur votre serveur (et, oui, je suis paranoïaque sur le coup).</strong></p>
<p><em>NB : Si vous souhaitez devenir très simplement un miroir Wikileaks et que vous leur faites entièrement confiance, les étapes &#8220;<a href="#creerutilisateur">Créer l’utilisateur</a>&#8220;, &#8220;<a href="#virtualhost">Configurer un nom de domaine et un VirtualHost</a>&#8221; et &#8220;<a href="#soumettre">Soumettre votre miroir à Wikileaks</a>&#8221; sont suffisantes.</em></p>
<h3>Sécuriser OpenSSH</h3>
<p>On va donner à Wikileaks (ou toute personne ayant leur clé RSA privée) un accès SSH sur notre serveur. Mais on ne veut prendre aucun risque : cet accès n&#8217;aura aucune autre possibilité que de déposer des fichiers là où on l&#8217;y autorise, c&#8217;est-à-dire dans sa <em>home</em>.</p>
<p>Pour cela, modifiez votre fichier <strong>/etc/ssh/sshd_config</strong>. Vérifiez d&#8217;abord que vous avez ces trois lignes qui autorisent la <a href="http://geekfault.org/2009/05/15/ssh-sans-mot-de-passe/">connexion avec une clé publique RSA</a>.<br />
<code>RSAAuthentication yes<br />
PubkeyAuthentication yes<br />
AuthorizedKeysFile      %h/.ssh/authorized_keys</code></p>
<p>Dernièrement, à la fin du fichier créez une nouvelle règle d&#8217;override telle que celle-ci :<br />
<code>Match user wikileaks<br />
         ChrootDirectory /home/wikileaks<br />
         X11Forwarding no<br />
         AllowTcpForwarding no</code><br />
Cette règle est assez explicite et fait simplement en sorte que l&#8217;utilisateur <strong>wikileaks</strong> soit Chrooté dans sa home. Redémarrez SSHd.</p>
<h3 id="creerutilisateur">Créer l&#8217;utilisateur</h3>
<p>Rien de bien sorcier :<br />
<code># mkdir /home/wikileaks<br />
# useradd -d /home/wikileaks -s /bin/bash wikileaks<br />
# chown wikileaks:wikileaks /home/wikileaks</code></p>
<p>Ensuite autorisons la connexion des administrateurs de Wikileaks :<br />
<code># su - wikileaks<br />
$ mkdir ~/.ssh<br />
$ wget http://wikileaks.ch/id_rsa.pub -O ~/.ssh/authorized_keys<br />
$ chmod 600 ~/.ssh/authorized_keys</code></p>
<p>Pour finir, n&#8217;oublions pas de créer le répertoire où sera hébergé le miroir :<br />
<code>$ mkdir ~/www</code></p>
<h3>Créer l&#8217;environnement chroot</h3>
<p>Pour qu&#8217;un chroot fonctionne correctement, il faut que sa racine appartienne à root. Nous créons aussi les deux répertoires indipensables à l&#8217;exécution d&#8217;un rsync : <strong>/bin</strong> et <strong>/lib</strong>.<br />
<code># chown root:root /home/wikileaks<br />
# mkdir /home/wikileaks/bin<br />
# mkdir /home/wikileaks/lib</code></p>
<p>Ensuite copions les binaires nécessaires pour faire un Rsync :<br />
<code># cp `which bash` /home/wikileaks/bin/bash<br />
# cp `which rsync` /home/wikileaks/bin/rsync</code></p>
<p>Pour que ces binaires fonctionnent, il faut aussi copier les librairies nécessaires. Pour lister ces librairies vous pouvez exécuter un <strong>ldd</strong> puis copiez une à une ces libraires<br />
<code># ldd `which bash` `which rsync`<br />
# cp /lib/libncurses.so.5 /home/wikileaks/lib/<br />
...</code><br />
Attention : si votre serveur est un système <strong>64bits</strong> il faudra créer le dossier <strong>/home/wikileaks/lib64/</strong> et le peupler avec les librairies venant de <strong>/lib64</strong>.</p>
<p>Au final vous devriez arriver à une structure proche de celle-ci :<br />
<code>bin<br />
 |- bash<br />
 |- rsync<br />
lib<br />
 |- ld-linux.so.2<br />
 |- libacl.so.1<br />
 |- libattr.so.1<br />
 |- libc.so.6<br />
 |- libdl.so.2<br />
 |- libncurses.so.5<br />
 |- libpopt.so.0</code><br />
Dès maintenant, si on se chroote dans /home/wikileaks on n&#8217;aura que très très peu de possibilités : les commandes internes à bash et rsync.</p>
<h3>Un dummyshell</h3>
<p>Oui, je suis d&#8217;accord, les commandes internes de bash c&#8217;est encore trop! Nous permettons un accès SSH qui pourrait potentiellement lancer une fork bomb par exemple. Nous allons donc créer un shell stupide qui ne permet que de lancer un serveur Rsync. Créez le fichier <strong>/home/wikileaks/bin/dummyshell</strong> :<br />
<code lang="bash">#!/bin/bash<br />
if (( $# == 0 )); then<br />
        printf "%s\n" "shell access is disabled. sorry."<br />
        exit 1<br />
elif (( $# == 2 )) &#038;&#038; [[ $1 == "-c" &#038;&#038; $2 == "rsync --server"* ]]; then<br />
        exec $2<br />
fi</code></p>
<p>Il faut ensuite le rendre exécutable et utilisé comme shell par défaut de l&#8217;utilisateur :<br />
<code># chmod +x /home/wikileaks/bin/dummyshell<br />
# ln -s /home/wikileaks/bin/dummyshell /bin/dummyshell<br />
# usermod -s /bin/dummyshell wikileaks</code><br />
C&#8217;est maintenant officiel, <strong>l&#8217;utilisateur wikileaks ne peut rien faire de plus que lancer un serveur Rsync</strong> ! Et il y a aussi la sécurité du Chroot.</p>
<h3>Test</h3>
<p>Je vous recommande de tester le tout, pour être sûr que Wikileaks pourra uploader son site sur votre serveur. Pour cela ajoutez votre propre clé RSA dans une nouvelle ligne de /home/wikileaks/.ssh/authorized_keys et tentez d&#8217;envoyer un fichier :<br />
<code>$ rsync -ave ssh test.html wikileaks@votreServeur:/www</code></p>
<p>Vous pouvez également éprouver la sécurité en tentant de vous connecter en SSH ou d&#8217;exécuter une commande en SSH -t.</p>
<h3 id="virtualhost">Configurer un nom de domaine et un VirtualHost</h3>
<p>Je suppose que vous vous en sortirez sur ce point-là : créez un nom de domaine (ou un sous-domaine) pour votre miroir et configurez votre serveur web en conséquence.</p>
<p>Le DocumentRoot à spécifier est bien <strong>/home/wikileaks/www</strong></p>
<p>Profitez-en pour empêcher l&#8217;exécution de scripts sur le répertoire :<br />
<code lang="xml"><Directory "/home/wikileaks/www"><br />
        AllowOverride None<br />
        Options -ExecCGI<br />
</Directory></code></p>
<h3 id="soumettre">Soumettre votre miroir à Wikileaks</h3>
<p>Rendez-vous sur <a href="http://46.59.1.2/mass-mirror.html">http://46.59.1.2/mass-mirror.html</a> et soumettez votre miroir !</p>
<p>Sous &#8220;<em>absolute path where we should upload the html data</em>&#8221; mettez simplement <strong>&#8220;/www/&#8221;</strong>.<br />
<a href="http://geekfault.org/wp-content/uploads/2010/12/wikileaks-submit.png" title="wikileaks-submit" rel="lightbox.5476"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/12/wikileaks-submit-580x225.png" alt="" title="wikileaks-submit" width="580" height="225" class="aligncenter size-large wp-image-5480" /></a></p>
<p>Normalement Wikileaks pushera l&#8217;entièreté du site sur votre serveur. Félicitations, vous défendez la liberté d&#8217;expression sans risque majeur pour votre serveur !</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/15/ssh-sans-mot-de-passe/' rel='bookmark' title='SSH sans mot de passe'>SSH sans mot de passe</a></li>
<li><a href='http://geekfault.org/2010/05/09/choisir-son-keymap-x-org-1-8-sans-xorg-conf-ni-hack/' rel='bookmark' title='Choisir son keymap X.org 1.8 sans xorg.conf ni hack'>Choisir son keymap X.org 1.8 sans xorg.conf ni hack</a></li>
<li><a href='http://geekfault.org/2010/07/15/zeroconf-reseaux-ip-sans-configuration/' rel='bookmark' title='Zeroconf : Réseaux IP sans configuration'>Zeroconf : Réseaux IP sans configuration</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/12/05/devenez-miroir-de-wikileaks-sans-risque/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Ifconfig.me, connaitre son IP publique en un rien de temps</title>
		<link>http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/</link>
		<comments>http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 10:03:07 +0000</pubDate>
		<dc:creator>roidelapluie</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[ifconfig.me]]></category>
		<category><![CDATA[ip publique]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=5376</guid>
		<description><![CDATA[Beaucoup d&#8217;entre nous sont le plus souvent connectés en NAT derrière un routeur ou connectés derrière un proxy, voire un VPN. Difficile donc de connaitre son IP publique ou son ISP en quelques instants. Certes, pas mal de sites de type «What is my IP?» permettent d&#8217;accéder à ce genre d&#8217;infos, mais ma préférence va [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/09/24/allocation-dadresses-ipv4-publiques-over-vpn/' rel='bookmark' title='Allocation d&#8217;adresses IPv4 publiques over VPN'>Allocation d&#8217;adresses IPv4 publiques over VPN</a></li>
<li><a href='http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/' rel='bookmark' title='maintenir son DNS menteur avec Adblock'>maintenir son DNS menteur avec Adblock</a></li>
<li><a href='http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/' rel='bookmark' title='La nouvelle mode Geek : avoir son domaine .42'>La nouvelle mode Geek : avoir son domaine .42</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/08/iconfig.me_3-150x150.png" alt="Page d&#039;accueil du site" title="ifconfig.me" width="150" height="150" class="alignleft size-thumbnail wp-image-5387" />Beaucoup d&#8217;entre nous sont le plus souvent connectés en NAT derrière un routeur ou connectés derrière un proxy, voire un VPN. Difficile donc de connaitre son IP publique ou son ISP en quelques instants. Certes, pas mal de sites de type «What is my IP?» permettent d&#8217;accéder à ce genre d&#8217;infos, mais ma préférence va vers <a href="http://ifconfig.me">ifconfig.me</a>.<br />
<!--more--><br />
Si vous ouvrez cette URL depuis un navigateur internet, vous y verrez les informations habituelles que ce genre de site offre: IP, ISP, informations sur le navigateur, et géolocalisation de l&#8217;IP. Ce n&#8217;est pas cela qui rend ce site pratique et indispensable.</p>
<p><a href="http://ifconfig.me">Ifconfig.me</a> a la particularité d&#8217;être utilisable en ligne de commande, avec le célèbre client <a href="http://curl.haxx.se/">cURL</a>. Prenons un exemple simple:</p>
<p><code>$ curl ifconfig.me</code></p>
<p>Renverra l&#8217;adresse IP publique directement. Ni plus, ni moins. Pas besoin d&#8217;ouvrir un navigateur internet, ni de devoir parcourir une page à la recherche de l&#8217;élément recherché.</p>
<p>Il existe d&#8217;autres commandes, telles que:</p>
<p><code>$ curl ifconfig.me/host<br />
$ curl ifconfig.me/ua<br />
$ curl ifconfig.me/all</code></p>
<p>Ces trois commandes renverront respectivement l&#8217;éventuel hostname lié à votre IP publique, votre user agent et l&#8217;ensemble des infos données par le site. La liste complète des commandes est disponible sur <a href="http://ifconfig.me">le site</a>.</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/09/24/allocation-dadresses-ipv4-publiques-over-vpn/' rel='bookmark' title='Allocation d&#8217;adresses IPv4 publiques over VPN'>Allocation d&#8217;adresses IPv4 publiques over VPN</a></li>
<li><a href='http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/' rel='bookmark' title='maintenir son DNS menteur avec Adblock'>maintenir son DNS menteur avec Adblock</a></li>
<li><a href='http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/' rel='bookmark' title='La nouvelle mode Geek : avoir son domaine .42'>La nouvelle mode Geek : avoir son domaine .42</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Eeegw &#8211; part III &#8211; Quality Of Service aka QOS</title>
		<link>http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/</link>
		<comments>http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/#comments</comments>
		<pubDate>Mon, 24 May 2010 15:53:13 +0000</pubDate>
		<dc:creator>bragon</dc:creator>
				<category><![CDATA[eeegw]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[QoS]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2225</guid>
		<description><![CDATA[La Quality Of Service (QOS) , qualité de service en français, intervient principalement au niveau 3 du modèle OSI. Il faut donc placer ses scripts de QOS sur la passerelle de votre réseau, c&#8217;est la raison pour laquelle, mettre en place de la QOS sur la eeegw prend tout son sens. N&#8217;hésitez pas à revenir [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/' rel='bookmark' title='EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.'>EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.</a></li>
<li><a href='http://geekfault.org/2009/09/24/allocation-dadresses-ipv4-publiques-over-vpn/' rel='bookmark' title='Allocation d&#8217;adresses IPv4 publiques over VPN'>Allocation d&#8217;adresses IPv4 publiques over VPN</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle: Introduction à la QOS --><br />
<a href="http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/qos/" rel="attachment wp-att-4812"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/05/QOS-251x300.png" alt="" title="QOS" width="151" height="200" class="alignleft size-medium wp-image-4812" /></a></p>
<p>La Quality Of Service (QOS) , qualité de service en français, intervient principalement au niveau 3 du modèle OSI.<br />
Il faut donc placer ses scripts de QOS sur la passerelle de votre réseau, c&#8217;est la raison pour laquelle, mettre en place de la QOS sur la <strong> eeegw </strong> prend tout son sens.</p>
<p>N&#8217;hésitez pas à revenir sur les précédents articles sur la eeegw :<br />
<a href="http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/">eeegw part I</a><br />
<a href="http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/">eeegw part II</a><br />
<!--more--><br />
Si vous avez besoin d&#8217;un rafraîchissement sur le concept, je vous oriente vers la page <a href="http://fr.wikipedia.org/wiki/Qualit%C3%A9_de_service">Qualité de service</a> de Wikipedia.</p>
<p>La partie qui clairement nous intéresse ici est décrite au chapitre Ordonnancement :<br />
<strong>L&#8217;ordonnancement désigne l&#8217;ensemble des méthodes visant à modifier l&#8217;ordre de départ des paquets, en remplacement de la règle du « premier arrivé, premier servi ».</strong></p>
<p>Une de ses applications les plus courantes consistera ainsi à donner priorité à certains types de trafic.</p>
<p>Grosso modo j&#8217;ai mis en place de la QOS sur ma eeegw car j&#8217;en avais marre que mes communications SIP (Téléphonie voir futur article :p) ne soient pas de bonne qualité, lors d&#8217;upload de pièces jointes via mon mailer ou lorsque j&#8217;avais besoin d&#8217;utiliser beaucoup d&#8217;upload en même temps qu&#8217;une communication téléphonique.</p>
<p><!--nextpage--><br />
<!--pagetitle: QOS Exemple1 : HTB --><br />
Voici mon tout premier script de QOS, ill date un peu et est loin de bien fonctionner <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Je vous le montre afin que vous voyez un peu à quoi on s&#8217;attaque en parlant de QOS :</p>
<h4> Script de QOS exemple1 basé sur HTB </h4>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

#Constantes
LOCALNET=&quot;213.41.xx.xx/255.255.255.255&quot;
MARKPRIO1=&quot;1&quot;
MARKPRIO2=&quot;2&quot;
MARKPRIO3=&quot;3&quot;
MARKPRIO4=&quot;4&quot;
MARKPRIO5=&quot;5&quot;
MARKPRIO6=&quot;6&quot;
MARKPRIO7=&quot;7&quot;

IFACE=eth0

UPRATE=&quot;8mbit&quot;
DOWNRATE=&quot;0.8mbit&quot;

PRIORATE1=&quot;5mbit&quot;
PRIORATE2=&quot;3mbit&quot;
PRIORATE3=&quot;2mbit&quot;
PRIORATE4=&quot;0.5mbit&quot;

QUANTUM1=&quot;12187&quot;
QUANTUM2=&quot;8625&quot;
QUANTUM3=&quot;5062&quot;
QUANTUM4=&quot;1500&quot;

BURST1=&quot;1000k&quot;
BURST2=&quot;400k&quot;
BURST3=&quot;200k&quot;
BURST4=&quot;10k&quot;

CBURST1=&quot;300k&quot;
CBURST2=&quot;200k&quot;
CBURST3=&quot;10k&quot;
CBURST4=&quot;1k&quot;

iptables -t mangle -F OUTPUT
iptables -t mangle -F FORWARD

iptables -t mangle -A FORWARD -p icmp -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p icmp -j MARK --set-mark $MARKPRIO1

iptables -t mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1

iptables -t mangle -A FORWARD -p tcp --dport 687 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --dport 687 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p tcp --dport 687 -j MARK --set-mark $MARKPRIO1

iptables -t mangle -A FORWARD -p udp --dport 687 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p udp --dport 687 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p udp --dport 687 -j MARK --set-mark $MARKPRIO1

iptables -t mangle -A FORWARD -p tcp --dport 5060 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --dport 5060 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p tcp --dport 5060 -j MARK --set-mark $MARKPRIO1

iptables -t mangle -A FORWARD -p udp --dport 5060 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p udp --dport 5060 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p udp --dport 5060 -j MARK --set-mark $MARKPRIO1

iptables -t mangle -A FORWARD -p tcp --dport 25 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark $MARKPRIO3

iptables -t mangle -A FORWARD -p tcp --dport 143 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 143 -j MARK --set-mark $MARKPRIO3

iptables -t mangle -A FORWARD -p tcp --dport 80 -j MARK --set-mark $MARKPRIO2
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark $MARKPRIO2
iptables -t mangle -A INPUT -p tcp --dport 80 -j MARK --set-mark $MARKPRIO2

iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark $MARKPRIO2
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark $MARKPRIO2
iptables -t mangle -A INPUT -p tcp --dport 443 -j MARK --set-mark $MARKPRIO2

iptables -t mangle -A FORWARD -p tcp --dport 21 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 21 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A INPUT -p tcp --dport 21 -j MARK --set-mark $MARKPRIO3

ifconfig $IFACE txqueuelen 128

tc qdisc add dev $IFACE root handle 1:0 htb default 103 r2q 1
tc class add dev $IFACE parent 1:0 classid 1:1 htb rate $UPRATE burst $BURST1 cburst $CBURST1

tc class add dev $IFACE parent 1:1 classid 1:101 htb rate $PRIORATE1 ceil $UPRATE quantum $QUANTUM1 burst $BURST1 cburst $CBURST1 prio 0
tc class add dev $IFACE parent 1:1 classid 1:102 htb rate $PRIORATE2 ceil $UPRATE quantum $QUANTUM2 burst $BURST2 cburst $CBURST2 prio 1
tc class add dev $IFACE parent 1:1 classid 1:103 htb rate $PRIORATE3 ceil $UPRATE quantum $QUANTUM3 burst $BURST3 cburst $CBURST3 prio 2
tc class add dev $IFACE parent 1:1 classid 1:104 htb rate $PRIORATE4 ceil $P2PRATE quantum $QUANTUM4 burst $BURST4 cburst $CBURST4 prio 3

tc filter add dev $IFACE parent 1:0 protocol ip prio 0 handle $MARKPRIO1 fw classid 1:101
tc filter add dev $IFACE parent 1:0 protocol ip prio 1 handle $MARKPRIO2 fw classid 1:102
tc filter add dev $IFACE parent 1:0 protocol ip prio 2 handle $MARKPRIO3 fw classid 1:103
tc filter add dev $IFACE parent 1:0 protocol ip prio 3 handle $MARKPRIO4 fw classid 1:104

tc qdisc add dev $IFACE parent 1:101 sfq perturb 16 quantum $QUANTUM1
tc qdisc add dev $IFACE parent 1:102 sfq perturb 16 quantum $QUANTUM2
tc qdisc add dev $IFACE parent 1:103 sfq perturb 16 quantum $QUANTUM3
tc qdisc add dev $IFACE parent 1:104 sfq perturb 16 quantum $QUANTUM4
</pre>
<p>Ce script est loin d&#8217;être optimisé.<br />
Son but était de marquer via iptables certain type de flux, afin de les faire passer via des règles de tc/qdisc pour en limiter la bande passante. il utilise HTB (voir plus loin)<br />
Ce script manque clairement de flexibilité.</p>
<p><!--nextpage--><br />
<!--pagetitle: Ce qu'il convient d'activer dans le noyau GNU/Linux --></p>
<p>Soyons clairs, la QOS sous GNU/Linux est un cauchemar à gérer.<br />
Autre concept à bien avoir en tête, vous ne pouvez gérer la QOS que de votre lien sortant, en aucun cas vous ne pouvez gérer ce qui rentre via votre lien. Par analogie, vous ne pouvez pas contrôler la pluie qui tombe dans votre piscine, par contre vous pouvez contrôler l&#8217;eau que vous enlevez, et l&#8217;eau que vous décidez de rajouter.<br />
Il existe quelques bidouilles afin de réussir tout de même à gérer ce trafic entrant, nous allons essayer de vous présenter ça un peu plus loin dans l&#8217;article.</p>
<p>Nous allons donc utiliser Mangle de iptables (pour qos.sh) ainsi que la fonction de mark des packets de iptables.<br />
Il faut donc aller activer cela dans le noyau.</p>
<p><code><br />
#<br />
# QoS and/or fair queueing<br />
#<br />
CONFIG_NET_SCHED=y<br />
CONFIG_NET_SCH_CBQ=m<br />
CONFIG_NET_SCH_HTB=m<br />
CONFIG_NET_SCH_CSZ=m<br />
CONFIG_NET_SCH_PRIO=m<br />
CONFIG_NET_SCH_RED=m<br />
CONFIG_NET_SCH_SFQ=m<br />
CONFIG_NET_SCH_TEQL=m<br />
CONFIG_NET_SCH_TBF=m<br />
CONFIG_NET_SCH_GRED=m<br />
CONFIG_NET_SCH_DSMARK=m<br />
CONFIG_NET_SCH_INGRESS=m<br />
CONFIG_NET_QOS=y<br />
CONFIG_NET_ESTIMATOR=y<br />
CONFIG_NET_CLS=y<br />
CONFIG_NET_CLS_TCINDEX=m<br />
CONFIG_NET_CLS_ROUTE4=m<br />
CONFIG_NET_CLS_ROUTE=y<br />
CONFIG_NET_CLS_FW=m<br />
CONFIG_NET_CLS_U32=m<br />
CONFIG_NET_CLS_RSVP=m<br />
CONFIG_NET_CLS_RSVP6=m<br />
CONFIG_NET_CLS_POLICE=y<br />
</code></p>
<p><!--nextpage--></p>
<p><!--pagetitle: Mise en place des outils. --></p>
<h3> Scheduler / Ordonnanceur </h3>
<h4> Mise en place des outils </h4>
<p>En tout premier lieu vous aurez besoin de iptables et de iproute2<br />
iproute2 est une suite d&#8217;utilitaires en ligne de commande qui vous permettent de manipuler les structures kernel liées aux couches réseau de votre machine.</p>
<p>Gentoo :</p>
<p><code><br />
emerge -av iproute2 iptables<br />
</code></p>
<p>Debian :<br />
<code><br />
apt-get install iptables iproute2<br />
</code></p>
<p>Verifiez que vous avez bien l&#8217;utilitaire tc :</p>
<p><code></p>
<p>eeegw:~# tc<br />
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }<br />
       tc [-force] -batch file<br />
where  OBJECT := { qdisc | class | filter | action | monitor }<br />
       OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [file] }</p>
<p></code></p>
<h4> Traduction du manuel de tc </h4>
<p>Les &#8220;classful qdiscs&#8221; sont :</p>
<li> <strong> CBQ </strong> </li>
<p>  &#8220;Class  Based  Queueing&#8221;  implémente une hierarchie de classes.  il contient des éléments de shaping  comme des fonctions de prioritisations.  Le shape est calculé à partir de latence et de taille de packets</p>
<li> <strong>HTB</strong> </li>
<p>  &#8220;Hierarchy Token Bucket&#8221;<br />
HTB permet de garantir de la bande passante a une classe, définir des limites entre les classes et de fixer des priorités entre elles.</p>
<li><strong>PRIO</strong>
<li>
PRIO qdisc n&#8217;effectue pas de traffic shapping en tant que tel, il permet juste de fixer des priorités entre les différents type de protocoles transitant dans le lien.<br />
PRIO permet de classifier les classes qui prennent en priorité de la bande passante, en ne laissant aux autres que ce qui reste de bande passante disponible.</p>
<h4> Qu&#8217;est-ce qu&#8217;une classe </h4>
<p>Une classe forme, en fait, un arbre avec des branches.<br />
Le but est de former une classe root qui va permettre de faire rentrer tout le trafic et, en fonction des protocoles, on va faire passer le traffic dans différentes branches.</p>
<p>ici nous définissons nos classes root :</p>
<pre class="brush: bash; title: ; notranslate">
## On met en place la classe root pour la BP disponible.
/sbin/tc qdisc add dev $EXTERNAL_IFACE root handle 1: cbq avpkt 1000 bandwidth $BNDWIDTH
## Match ici l'upload de la connexion
/sbin/tc class add dev $EXTERNAL_IFACE parent 1: classid 1:1 cbq rate ${UPLINK}kbit allot 1500 prio 5 bounded isolated
</pre>
<h3> Datagrame IPv4 et Type Of Service : TOS </h3>
<p><a href="http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/ipformat/" rel="attachment wp-att-4754"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/05/ipformat-300x241.png" alt="" title="ipformat" width="300" height="241" class="aligncenter size-medium wp-image-4754" /></a></p>
<h4> Tableau des TOS possible dans un Datagram IPv4 </h4>
<p><TABLE CELLPADDING=3 BORDER="1"><TR><TH ALIGN="LEFT"><SPAN  CLASS="textbf">Binaire</SPAN></TH><TH ALIGN="LEFT"><SPAN CLASS="textbf">Décimal</SPAN></TH><TH ALIGN="LEFT"><SPAN  CLASS="textbf">Signification</SPAN></TH></TR><TR><TD ALIGN="LEFT">1000</TD><br />
<TD ALIGN="LEFT">8</TD><TD ALIGN="LEFT">Minimise le Délai (Minimize delay) (md)</TD></TR><TR><TD ALIGN="LEFT">0100</TD><TD ALIGN="LEFT">4</TD><TD ALIGN="LEFT">Maximalise le Débit (Maximize throughput) (mt)</TD></TR><TR><TD ALIGN="LEFT">0010</TD><TD ALIGN="LEFT">2</TD><TD ALIGN="LEFT">Maximalise la Fiabilité (Maximize reliability) (mr)</TD></TR><TR><TD ALIGN="LEFT">0001</TD><TD ALIGN="LEFT">1</TD><TD ALIGN="LEFT">Minimalise le Coût Monétaire (Minimize monetary cost) (mmc)</TD></TR><TR><TD ALIGN="LEFT">0000</TD><TD ALIGN="LEFT">0</TD><TD ALIGN="LEFT">Service Normal</TD></TR></TABLE></p>
<p><TABLE CELLPADDING=3 BORDER="1"><TR><TH ALIGN="LEFT"><SPAN  CLASS="textbf">TOS</SPAN></TH><TH ALIGN="LEFT"><SPAN  CLASS="textbf">Binaire</SPAN></TH><TH ALIGN="CENTER"><SPAN  CLASS="textbf">Décimal</SPAN></TH><TH ALIGN="LEFT"><SPAN  CLASS="textbf">Signification</SPAN></TH><TH ALIGN="LEFT"><SPAN  CLASS="textbf">Priorité</SPAN> <SPAN  CLASS="textbf">Linux</SPAN></TH><TH ALIGN="LEFT"><SPAN  CLASS="textbf">Bande</SPAN></TH></TR><TR><TD ALIGN="LEFT">0&#215;0</TD><TD ALIGN="LEFT">0000</TD><TD ALIGN="CENTER">0</TD><TD ALIGN="LEFT">Service Normal</TD><TD ALIGN="LEFT">0 Best Effort</TD><TD ALIGN="LEFT">1</TD></TR><TR><TD ALIGN="LEFT">0&#215;2</TD><TD ALIGN="LEFT">0001</TD><TD ALIGN="CENTER">1</TD><TD ALIGN="LEFT">Minimise le Coût Monétaire (mmc)</TD><TD ALIGN="LEFT">1 Filler</TD><TD ALIGN="LEFT">2</TD></TR><TR><TD ALIGN="LEFT">0&#215;4</TD><TD ALIGN="LEFT">0010</TD><TD ALIGN="CENTER">2</TD><TD ALIGN="LEFT">http://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI</TD><TD ALIGN="LEFT">0 Best Effort</TD><TD ALIGN="LEFT">1</TD></TR><TR><TD ALIGN="LEFT">0&#215;6</TD><TD ALIGN="LEFT">0011</TD><TD ALIGN="CENTER">3</TD><TD ALIGN="LEFT">mmc+mr</TD><TD ALIGN="LEFT">0 Best Effort</TD><TD ALIGN="LEFT">1</TD></TR><TR><TD ALIGN="LEFT">0&#215;8</TD><TD ALIGN="LEFT">0100</TD><TD ALIGN="CENTER">4</TD><TD ALIGN="LEFT">Maximalise le Débit (mt)</TD><TD ALIGN="LEFT">2 Masse</TD><TD ALIGN="LEFT">2</TD></TR><TR><TD ALIGN="LEFT">0xa</TD><TD ALIGN="LEFT">0101</TD><TD ALIGN="CENTER">5</TD><TD ALIGN="LEFT">mmc+mt</TD><TD ALIGN="LEFT">2 Masse</TD><TD ALIGN="LEFT">2</TD></TR><TR><TD ALIGN="LEFT">0xc</TD><TD ALIGN="LEFT">0110</TD><TD ALIGN="CENTER">6</TD><TD ALIGN="LEFT">mr+mt</TD><TD ALIGN="LEFT">2 Masse</TD><TD ALIGN="LEFT">2</TD></TR><TR><TD ALIGN="LEFT">0xe</TD><TD ALIGN="LEFT">0111</TD><TD ALIGN="CENTER">7</TD><TD ALIGN="LEFT">mmc+mr+mt</TD><TD ALIGN="LEFT">2 Masse</TD><TD ALIGN="LEFT">2</TD></TR><TR><TD ALIGN="LEFT">0&#215;10</TD><TD ALIGN="LEFT">1000</TD><TD ALIGN="CENTER">8</TD><TD ALIGN="LEFT">Minimise le Délai (md)</TD><TD ALIGN="LEFT">6 Interactive</TD><TD ALIGN="LEFT">0</TD></TR><TR><TD ALIGN="LEFT">0&#215;12</TD><TD ALIGN="LEFT">1001</TD><TD ALIGN="CENTER">9</TD><TD ALIGN="LEFT">mmc+md</TD><TD ALIGN="LEFT">6 Interactive</TD><TD ALIGN="LEFT">0</TD></TR><TR><TD ALIGN="LEFT">0&#215;14</TD><TD ALIGN="LEFT">1010</TD><TD ALIGN="CENTER">10</TD><TD ALIGN="LEFT">mr+md</TD><TD ALIGN="LEFT">6 Interactive</TD><TD ALIGN="LEFT">0</TD></TR><TR><TD ALIGN="LEFT">0&#215;16</TD><TD ALIGN="LEFT">1011</TD><TD ALIGN="CENTER">11</TD><TD ALIGN="LEFT">mmc+mr+md</TD><TD ALIGN="LEFT">6 Interactive</TD><TD ALIGN="LEFT">0</TD></TR><TR><TD ALIGN="LEFT">0&#215;18</TD><TD ALIGN="LEFT">1100</TD><TD ALIGN="CENTER">12</TD><TD ALIGN="LEFT">mt+md</TD><TD ALIGN="LEFT">4 Int. Masse</TD><TD ALIGN="LEFT">1</TD></TR><TR><TD ALIGN="LEFT">0x1a</TD><TD ALIGN="LEFT">1101</TD><TD ALIGN="CENTER">13</TD><TD ALIGN="LEFT">mmc+mt+md 4 Int. Masse 1</TD><TD ALIGN="LEFT">4 Int. Masse</TD><TD ALIGN="LEFT">1</TD></TR><TR><TD ALIGN="LEFT">0x1c</TD><TD ALIGN="LEFT">1110</TD><TD ALIGN="CENTER">14</TD><TD ALIGN="LEFT">mr+mt+md</TD><TD ALIGN="LEFT">4 Int. Masse</TD><TD ALIGN="LEFT">1</TD></TR><TR><TD ALIGN="LEFT">0x1e</TD><TD ALIGN="LEFT">1111</TD><TD ALIGN="CENTER">15</TD><TD ALIGN="LEFT">mmc+mr+mt+md</TD><TD ALIGN="LEFT">4 Int. Masse</TD><TD ALIGN="LEFT">1</TD></TR></TABLE></p>
<h4> Exemple de ce qu&#8217;on peut faire avec TOS </h4>
<p>L&#8217;intérêt de la QoS sous Linux est très souvent associé à la priorisation de flux interactifs via iptables.<br />
Par exemple, vous ne souhaitez pas que votre session ssh lag à cause d&#8217;un utilisateur qui est en train de monopoliser la bande passante de votre réseau en téléchargeant une bande annonce sur internet ?<br />
Nous allons ici, à titre d&#8217;exemple, optimiser les trafics courants avec iptables, à savoir ssh :</p>
<pre class="brush: bash; title: ; notranslate">
# Priorisation des connexions ftp et ssh
iptables -A PREROUTING -t mangle -p tcp -sport ssh -j TOS -set-tos Minimize-Delay
# On donne un maximum de débit aux transferts scp
iptables -A PREROUTING -t mangle -p tcp -sport ssh -j TOS -set-tos Maximize-Throughput
</pre>
<p><!--nextpage--></p>
<p><!--pagetitle: Script final --><br />
Voici le script de QOS final basé sur CTB et PRIO (celui que j&#8217;utilise en production)</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
### Script de reservation de bande passante par bragon

## On fixe quelques variables

EXTERNAL_DOWNLINK_KBPS=&quot;6400&quot;
## je sais downloader à  ~800ko/s ma limite est donc a 6400 Kbps
EXTERNAL_DL_IPSEC_KBPS=&quot;1024&quot;
EXTERNAL_DL_PPTP_KBPS=&quot;&quot;
EXTERNAL_DL_ICA_KBPS=&quot;&quot;
EXTERNAL_DL_TSE_KBPS=&quot;128&quot;
EXTERNAL_DL_SMTP_KBPS=&quot;512&quot;
EXTERNAL_DL_HTTP_KBPS=&quot;1024&quot;
EXTERNAL_DL_OTHERTCP_KBPS=&quot;2048&quot;
EXTERNAL_DL_OTHERTCP_PORT=&quot;2048&quot;
## je sais uploader à environ 80Ko/s je fixe donc ma limite a 512 afin d'être sûr de ne pas engendrer de lag.
EXTERNAL_UPLINK_KBPS=&quot;512&quot;
EXTERNAL_UL_IPSEC_KBPS=&quot;&quot;
EXTERNAL_UL_IPSEC_SHARE=&quot;&quot;
EXTERNAL_UL_PPTP_KBPS=&quot;&quot;
EXTERNAL_UL_PPTP_SHARE=&quot;&quot;
EXTERNAL_UL_ICA_KBPS=&quot;&quot;
EXTERNAL_UL_ICA_SHARE=&quot;&quot;
EXTERNAL_UL_TSE_KBPS=&quot;512&quot;
EXTERNAL_UL_TSE_SHARE=&quot;512&quot;
EXTERNAL_UL_SMTP_KBPS=&quot;256&quot;
EXTERNAL_UL_SMTP_SHARE=&quot;256&quot;
EXTERNAL_UL_HTTP_KBPS=&quot;32&quot;
EXTERNAL_UL_HTTP_SHARE=&quot;&quot;
EXTERNAL_UL_OTHERTCP_KBPS=&quot;&quot;
EXTERNAL_UL_OTHERTCP_SHARE=&quot;&quot;
EXTERNAL_UL_OTHERTCP_PORT=&quot;&quot;
EXTERNAL_UL_VOIP_KBPS=&quot;256&quot;
EXTERNAL_UL_VOIP_SHARE=&quot;isolated&quot;
EXTERNAL_DEV_BANDWIDTH=&quot;&quot; 

## CE script de QOS s'applique à toutes les interface dans MON cas cela convient.
## Je vous conseille de retirer votre interface LAN du match si vous avez plusieurs interfaces reseau.
## La commande va permettre de lister toutes les interfaces et d'appliquer les regles de QOS dessus.
## On match aussi les interfaces tap

if [ -n &quot;$EXTERNAL_DOWNLINK_KBPS&quot; ] &amp;&amp; [ -n &quot;$EXTERNAL_UPLINK_KBPS&quot; ] &amp;&amp; echo $INTERFACE | egrep -q &quot;(eth[023]|ppp[0-9]|ippp0|tap[0-3])&quot; ; then

#In kilobits
DOWNLINK=$EXTERNAL_DOWNLINK_KBPS
UPLINK=$EXTERNAL_UPLINK_KBPS
BNDWIDTH=$EXTERNAL_DEV_BANDWIDTH

if [ -z &quot;$BNDWIDTH&quot; ]; then
    BNDWIDTH=&quot;100mbit&quot;
fi

## on clean deja les parametres en tout premier lieu
## On vide toutes les regles pouvant deja etre en place.
/sbin/tc qdisc del dev $EXTERNAL_IFACE root    2&gt; /dev/null &gt; /dev/null
/sbin/tc qdisc del dev $EXTERNAL_IFACE ingress 2&gt; /dev/null &gt; /dev/null

# install root CBQ # On met en place la policy root, les autres policies seront liées à celle-ci
## cbq avpkt : la taille moyenne des packets en bytes sont necessaire afin de calculer l'idle maximum
## bandwidth rate : pour determiner l'idle time cbq doit forcement connaitre la bande passante de l'interface physique.
/sbin/tc qdisc add dev $EXTERNAL_IFACE root handle 1: cbq avpkt 1000 bandwidth $BNDWIDTH

## allot bytes : utile pour calculer le temps de transmission des packets entre tables, valeur liée à avpkt
/sbin/tc class add dev $EXTERNAL_IFACE parent 1: classid 1:1 cbq rate ${UPLINK}kbit allot 1500 prio 5 bounded isolated

# voip (udp sip 5060 et asterisk 4569)
## Tout ce qui match cette règle possede une reservation CBQ de $EXTERNAL_UL_VOIP_KBPS | priorité numéro 1 !
if [ -n &quot;$EXTERNAL_UL_VOIP_KBPS&quot; ]; then
/sbin/tc class add dev $EXTERNAL_IFACE parent 1:1 classid 1:5 cbq rate ${EXTERNAL_UL_VOIP_KBPS}kbit allot 1600 prio 1 avpkt 1000 $EXTERNAL_UL_VOIP_SHARE

## pfifo : pure 'premier entré premier sortie' qdisc, évite la congestion de packet dans la classid 1:5
/sbin/tc qdisc add dev $EXTERNAL_IFACE parent 1:5 handle 5: pfifo limit 10

 # sip prioritaire 5 !
## filter: utile afin de savoir dans quel classfull qdisc, un packet va etre envoye.
## on peut filter les packets a partir de leur TOS : Type Of Service
/sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 5 u32 match ip sport 5060 0xffff match ip protocol 17 0xff flowid 1:5
/sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 5 u32 match ip dport 5060 0xffff match ip protocol 17 0xff flowid 1:5

# rtp (tos 0x10 et udp) (voir le tableau recap de TOS)
/sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 5 u32 match ip tos 0x10 0xff match ip protocol 17 0xff flowid 1:5

let UPLINK=UPLINK-EXTERNAL_UL_VOIP_KBPS
fi

# SMTP
if [ -n &quot;$EXTERNAL_UL_SMTP_KBPS&quot; ]; then
 /sbin/tc class add dev $EXTERNAL_IFACE parent 1:1 classid 1:44 \
 cbq rate ${EXTERNAL_UL_SMTP_KBPS}kbit allot 1600 prio 1 avpkt 1000 $EXTERNAL_UL_SMTP_SHARE
 /sbin/tc qdisc add dev $EXTERNAL_IFACE parent 1:44 handle 44: sfq perturb 10

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 44 u32 \
 match ip dport 25 0xffff match ip protocol 6 0xFF match ip firstfrag flowid 1:44

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 44 u32 \
 match ip dport 2525 0xffff match ip protocol 6 0xFF match ip firstfrag flowid 1:44

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 44 u32 \
 match ip dport 587 0xffff match ip protocol 6 0xFF match ip firstfrag flowid 1:44

let UPLINK=UPLINK-EXTERNAL_UL_SMTP_KBPS
fi

# HTTP
if [ -n &quot;$EXTERNAL_UL_HTTP_KBPS&quot; ]; then
 /sbin/tc class add dev $EXTERNAL_IFACE parent 1:1 classid 1:46 \
 cbq rate ${EXTERNAL_UL_HTTP_KBPS}kbit allot 1600 prio 1 avpkt 1000 $EXTERNAL_UL_HTTP_SHARE
 /sbin/tc qdisc add dev $EXTERNAL_IFACE parent 1:46 handle 46: sfq perturb 10

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 46 u32 \
 match ip dport 80 0xffff match ip protocol 6 0xFF match ip firstfrag flowid 1:46
 let UPLINK=UPLINK-EXTERNAL_UL_HTTP_KBPS
fi

# OTHERTCP
if [ -n &quot;$EXTERNAL_UL_OTHERTCP_KBPS&quot; ]; then
 /sbin/tc class add dev $EXTERNAL_IFACE parent 1:1 classid 1:48 \
 cbq rate ${EXTERNAL_UL_OTHERTCP_KBPS}kbit allot 1600 prio 1 avpkt 1000 $EXTERNAL_UL_OTHERTCP_SHARE
 /sbin/tc qdisc add dev $EXTERNAL_IFACE parent 1:48 handle 48: sfq perturb 10

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 48 u32 \
 match ip dport $EXTERNAL_UL_OTHERTCP_PORT 0xffff match ip protocol 6 0xFF match ip firstfrag \
 flowid 1:48
 let UPLINK=UPLINK-EXTERNAL_UL_OTHERTCP_KBPS
fi

if [ $UPLINK -gt 0 ]; then

# classe interactive
/sbin/tc class add dev $EXTERNAL_IFACE parent 1:1 classid 1:10 cbq rate ${UPLINK}kbit allot 1600 prio 2 avpkt 1000
/sbin/tc qdisc add dev $EXTERNAL_IFACE parent 1:10 handle 10: sfq perturb 10

 # TOS Minimum Delay (ssh, NOT scp) in 1:10: donc on lui donne un priorité de 1000
 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 1000 u32 match ip tos 0x10 0xff  flowid 1:10

 # ICMP (ip protocol 1) dans la classe interactive 1:10 donc on lui donne un priorité de 1001
 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1:0 protocol ip prio 1001 u32 match ip protocol 1 0xff flowid 1:10

 # Pour accélérer le downaload lorsqu'un upload est en court il faut bien faire les ACK dans la classe interactive.

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1: protocol ip prio 1002 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10

# classe bulk

 /sbin/tc class add dev $EXTERNAL_IFACE parent 1:1 classid 1:20 cbq rate $[9*$UPLINK/10]kbit \
   allot 1600 prio 3 avpkt 1000
 /sbin/tc qdisc add dev $EXTERNAL_IFACE parent 1:20 handle 20: sfq perturb 10

 /sbin/tc filter add dev $EXTERNAL_IFACE parent 1: protocol ip prio 1003 u32 \
   match ip dst 0.0.0.0/0 flowid 1:20

else
 echo &quot;Error: no bandwidth left for uplink on $EXTERNAL_IFACE: $UPLINK&quot; 1&gt;&amp;2
 /sbin/tc qdisc del dev $EXTERNAL_IFACE root    2&gt; /dev/null &gt; /dev/null
fi

#
# Il faut ralentir les download afin d'éviter que l'ISP mette en queue ce qui engendre le lag
# Les ISP ont tendance à avoir des queues énormes afin d'être sûrs que les downloads seront rapides.
#
# police ingress:

/sbin/tc qdisc add dev $EXTERNAL_IFACE handle ffff: ingress

# voip
# tout ce qui est voip ne doit pas être limité, donc on fait un match simple
# iax2

/sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 5 u32 \
  match ip sport 4569 0xffff match ip protocol 17 0xff flowid :1
 /sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 5 u32 \
  match ip dport 4569 0xffff match ip protocol 17 0xff flowid :1

# sip # priorite 5 !
/sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 5 u32 \
  match ip sport 5060 0xffff match ip protocol 17 0xff flowid :1
/sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 5 u32 \
  match ip dport 5060 0xffff match ip protocol 17 0xff flowid :1

/sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 5 u32 \
match ip sport 5061 0xffff match ip protocol 17 0xff flowid :1

# rtp (tos 0x10 et udp) # priorte 5 !
/sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 5 u32 \
  match ip tos 0x10 0xff match ip protocol 17 0xff flowid :1

# SMTP
if [ -n &quot;$EXTERNAL_DL_SMTP_KBPS&quot; ]; then
 /sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 44 u32 \
 match ip sport 25 0xffff match ip protocol 6 0xFF match ip firstfrag \
 police rate ${EXTERNAL_DL_SMTP_KBPS}kbit burst 10k drop flowid :1
 let DOWNLINK=DOWNLINK-EXTERNAL_DL_SMTP_KBPS
fi

# HTTP
if [ -n &quot;$EXTERNAL_DL_HTTP_KBPS&quot; ]; then
 /sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 46 u32 \
 match ip sport 80 0xffff match ip protocol 6 0xFF match ip firstfrag \
 police rate ${EXTERNAL_DL_HTTP_KBPS}kbit burst 10k drop flowid :1
 let DOWNLINK=DOWNLINK-EXTERNAL_DL_HTTP_KBPS
fi

# OTHERTCP qui ne matchent pas les règles précédentes
if [ -n &quot;$EXTERNAL_DL_OTHERTCP_KBPS&quot; ]; then
 /sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 48 u32 \
 match ip sport $EXTERNAL_DL_OTHERTCP_PORT 0xffff match ip protocol 6 0xFF match ip firstfrag \
 police rate ${EXTERNAL_DL_OTHERTCP_KBPS}kbit burst 10k drop flowid :1
 let DOWNLINK=DOWNLINK-EXTERNAL_DL_OTHERTCP_KBPS
fi

##règles de burst
if [ $DOWNLINK -gt 0 ]; then
 /sbin/tc filter add dev $EXTERNAL_IFACE parent ffff: protocol ip prio 1000 u32 \
 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
else
 echo &quot;Error: no bandwidth left for downlink on $EXTERNAL_IFACE: $DOWNLINK&quot; 1&gt;&amp;2
 /sbin/tc qdisc del dev $EXTERNAL_IFACE ingress 2&gt; /dev/null &gt; /dev/null
fi

# initial if (are the 2 required variables defined?)
fi
</pre>
<p>N&#8217;hésitez pas à le tester, il déboite <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/' rel='bookmark' title='EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.'>EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.</a></li>
<li><a href='http://geekfault.org/2009/09/24/allocation-dadresses-ipv4-publiques-over-vpn/' rel='bookmark' title='Allocation d&#8217;adresses IPv4 publiques over VPN'>Allocation d&#8217;adresses IPv4 publiques over VPN</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>maintenir son DNS menteur avec Adblock</title>
		<link>http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/</link>
		<comments>http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/#comments</comments>
		<pubDate>Tue, 11 May 2010 16:39:21 +0000</pubDate>
		<dc:creator>ckg</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[adblock]]></category>
		<category><![CDATA[bind9]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=3712</guid>
		<description><![CDATA[<a href="http://geekfault.org/wp-content/uploads/2010/05/yoyo_polish_abp_geekfault.png"><img src="http://geekfault.org/wp-content/uploads/2010/05/yoyo_polish_abp_geekfault.png" alt="" title="yoyo_polish_abp_geekfault" width="128" height="128" class="alignleft size-full wp-image-4102" /></a>Filtrer les web-espions (google analytics, xiti ...) n'est qu'un début. Le nombre de fichiers javascript, css et images en tout genre destinés à vous profiler est non négligeable, mais le pire est en fait le nombre de publicités pourrissant votre expérience utilisateur. Comment peut-on intégrer dans bind9,  les filtres adblock que l'on a construit minutieusement ?
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/04/24/dns-menteur/' rel='bookmark' title='DNS menteur, une autre méthode anti-curieux'>DNS menteur, une autre méthode anti-curieux</a></li>
<li><a href='http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/' rel='bookmark' title='La nouvelle mode Geek : avoir son domaine .42'>La nouvelle mode Geek : avoir son domaine .42</a></li>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/wp-content/uploads/2010/05/yoyo_polish_abp_geekfault.png" title="yoyo_polish_abp_geekfault" rel="lightbox.3712"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/05/yoyo_polish_abp_geekfault.png" alt="" title="yoyo_polish_abp_geekfault" width="128" height="128" class="alignleft size-full wp-image-4102" /></a>Filtrer les web-espions (google analytics, xiti &#8230;) n&#8217;est qu&#8217;un début. Le nombre de fichiers javascript, css et images en tout genre destinés à vous profiler est non négligeable, mais le pire est en fait le nombre de publicités pourrissant votre expérience utilisateur. Comment peut-on intégrer dans bind9,  les filtres adblock que l&#8217;on a construit minutieusement ?</p>
<p>Les régies de publicité ne sont pas honnêtes, elles proposent de la pornographie (bon ça c&#8217;est pas grave), des jeux en ligne (ça ne touche que les cons qui croient gagner face à un logiciel), des faux antivirus (là c&#8217;est moins drôle) voire des mouchards (là je ne ris plus du tout).<br />
Filtrer les pubs est parfois considéré comme une attitude hostile vis à vis de l&#8217;éditeur du contenu que vous vous apprêtez à consommer. Vous refusez la contrepartie d&#8217;un service gratuit, vous êtes <strong>fourbes</strong>, vous mériteriez d&#8217;aller casser des cailloux à <a href="http://fr.wikipedia.org/wiki/Bagne_de_Cayenne">Cayenne</a> et qu&#8217;on fasse un <a href="http://lolcat.com/gallery/1.html">lolcat</a> avec votre chien.<br />
<!--more--></p>
<h3>Plan du site</h3>
<p>Dans cette page nous allons capitaliser sur le travail bienveillant des <a href="#yoyo">furieux de chez yoyo.org</a>, utiliserons <del>les excellentes listes de <strong>fanboy et de liam</strong></del> une liste <a href="#polonaise">adblock polonaise</a> et nous finirons par intégrer la liste adblock de notre <a href="#profilfirefox">profil firefox</a>.<br />
Les trois source seront formatées en un <a href="#blackhole">fichier de configuration</a> pour notre DNS menteur.</p>
<p><a name="yoyo"></a></p>
<h3>Chez yoyo.org</h3>
<p>Chez yoyo ils sont très geek. Il est possible de télécharger une liste toute prête des données qui nous intéresse. Ce qui nous importe le plus, c&#8217;est le formulaire de la section <a href="http://pgl.yoyo.org/adservers/index.php">adservers</a>. Nous allons choisir le format de sortie &#8220;AdBlock&#8221; pour le champ &#8220;list ad server hostnames:&#8221;.<br />
Nous invoquerons cette liste par l&#8217;URL suivante <a href="http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock">http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock</a> pour ne plus avoir à faire du clic-clic lors des mises à jour.</p>
<p>L&#8217;objectif est d&#8217;obtenir des hosts de cette liste, ce qui se fait très simplement par :<br />
<code><br />
curl -s 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock' | egrep '^[a-z0-9]*\.[a-z0-9]*' | sort -u<br />
</code><br />
Ce qui donne  :<br />
<code><br />
a.collective-media.net<br />
a.consumer.net<br />
(...)<br />
kliks.nl<br />
klipads.dvlabs.com<br />
(...)<br />
zintext.com<br />
zmedia.com<br />
</code><br />
Le site pgl.yoyo.org est très riche, la section adservers est une mine d&#8217;information pour le filtrage responsable en environnement réseau très hétérogènes.</p>
<p><a name="polonaise"></a></p>
<h3>Liste adblock polonaise</h3>
<p>Commençons par une digression sur la Creative Commons : c&#8217;est un concept de licence que je n&#8217;apprécie pas. La notion de paternité pour un fichier de configuration me sidère.<br />
Les excellentes listes adblock de Fanboy et Liam sont en CC NC BY SA, leur réutilisation est incompatible avec la licence <strong>initiale</strong> (WTFPL) compatible avec la licence utilisée par Geekfault pour les articles. Bref, nous allons nous orienter vers une liste plus amicale.</p>
<p>Ce qui nous emmène à l&#8217;utilisation de la <a href="http://adblocklist.org/adblock-pxf-polish.txt">liste</a> du site <a href="http://adblocklist.org/">AdblockList.org</a> (en polonais).<br />
Voici les 4 structures possibles :<br />
<code><br />
(...)</p>
<p>http://*.statcounter.com/*</p>
<p>(...)</p>
<p>http://partner.ceneo.pl/pp/*</p>
<p>(...)<br />
|http://mklik.gazeta.pl/*<br />
(...)<br />
||nuggad.net/*<br />
(...)<br />
</code><br />
<em>La différence entre webespion.com, |webespion.com et ||webespion.com est documenté dans la section <a href="http://adblockplus.org/fr/filters">filters</a> de AdblockPlus.</em><br />
Ce qui nous conduit a l&#8217;expression régulière suivante :<br />
<code>'^|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$'</code><br />
Utilisable par exemple comme ceci :<br />
<code>$ curl -s http://adblocklist.org/adblock-pxf-polish.txt | egrep '^\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$'</p>
<p>http://r.reklama.biz/*</p>
<p>http://*stats.wordpress.com/*</p>
<p>|http://mklik.gazeta.pl/*</p>
<p>http://rek.www.wp.pl/*</p>
<p>http://kropka.onet.pl/*</p>
<p>http://csr.onet.pl/*</p>
<p>||nuggad.net/*<br />
(...)<br />
</code><br />
Avec perl nous allons, en une seule ligne (merci <a href="/author/madx/">madx</a>), regrouper le egrep ET nettoyer la sortie<br />
<code><br />
$ curl -s http://adblocklist.org/adblock-pxf-polish.txt | perl -ne 'm;^\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^\|{0,2}(http://)?\*?.?([^/#]*)/; &#038;&#038; print $2."\n";'<br />
r.reklama.biz<br />
stats.wordpress.com<br />
mklik.gazeta.pl<br />
rek.www.wp.pl<br />
kropka.onet.pl<br />
csr.onet.pl<br />
nuggad.net<br />
(...)<br />
</code><br />
<a name="profilfirefox"></a></p>
<h3>La liste adblock de notre profil Firefox</h3>
<p>Maintenant que nous savons sélectionner depuis une liste adblock, les filtres intégrables à bind9 et que nous savons nettoyer nous pouvons parcourir la liste adblock dans nos profils firefox :<br />
<code>$ (for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^|{0,2}(http://)?*?.?([^/#]*)/; &#038;&#038; print $2." <-- ".$_."n";' < $i;done;) | sort -u | less</code><br />
Ce qui donne chez moi :<br />
<code><br />
(...)<br />
5killspyware.eu <-- ||5killspyware.eu/<br />
5l2o8.com <-- ||5l2o8.com/<br />
5mariasara.cn <-- ||5mariasara.cn/<br />
5may2009.com <-- ||5may2009.com/<br />
5removespyware.com <-- ||5removespyware.com/<br />
5rublei.com <-- ||5rublei.com/<br />
5w90.co.cc <-- ||5w90.co.cc/<br />
5we5.com <-- ||5we5.com/<br />
5yttrre.cn <-- ||5yttrre.cn/<br />
6-tube-world.com <-- ||6-tube-world.com/<br />
60sys60.cn <-- ||60sys60.cn/<br />
</code><br />
On peut donc parcourir la liste temporaire et regarder si il n'y a pas trop de faux positifs. A plusieurs milliers de lignes (21282 très précisément sur mes profils firefox) il ne faut pas hésiter à faire un lecture étalée dans le temps.<br />
Normalement il n'y aura pas trop de surprises, nous obtenons une liste de hosts correctes comme ceci :<br />
<code><br />
(for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^|{0,2}(http://)?*?.?([^/#]*)/; &#038;&#038; print $2."n";' < $i;done;) | sort -u </code></p>
<p><a name="blackhole"></a></p>
<h3>Création du fichier blackhole.conf</h3>
<p>Pour rappel, notre structure de blackhole.conf est:<br />
<code>zone "HOTE_A_FILTRER" { type master; notify no; file "null.zone.file"; };</code><br />
Nous savons que la commande pour extraire HOTE_A_FILTRER avec :</p>
<ul>
<li>la liste de chez yoyo :</li>
</ul>
<p><code>curl -s 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock' | egrep '^[a-z0-9]*\.[a-z0-9]*'</code></p>
<ul>
<li>la liste adblock polonaise :</li>
</ul>
<p><code>curl -s http://adblocklist.org/adblock-pxf-polish.txt | perl -ne 'm;^\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^\|{0,2}(http://)?\*?.?([^/#]*)/; &#038;&#038; print $2."\n";'</code></p>
<ul>
<li>notre liste adblock maison :</li>
</ul>
<p><code>(for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^\|{0,2}(http://)?\*?.?([^/#]*)/; &#038;&#038; print $2."\n";' < $i;done;)</code></p>
<p>Nous pouvons donc écrire notre générateur de blackhole.conf en une seule ligne (bash) :<br />
<code>(for i in `((curl -s 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock' | egrep '^[a-z0-9]*\.[a-z0-9]*');(curl -s http://adblocklist.org/adblock-pxf-polish.txt | perl -ne 'm;^\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^\|{0,2}(http://)?\*?.?([^/#]*)/; &#038;&#038; print $2."\n";');(for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; &#038;& m;^\|{0,2}(http://)?\*?.?([^/#]*)/; &#038;&#038; print $2."\n";' < $i;done;) ) | sort -u `; do echo "zone "$i" { type master; notify no; file \"null.zone.file\"; };";done;)> blackhole.conf</code></p>
<p><a name="conclusion"></a></p>
<h3>Conclusion</h3>
<p>Nous voila donc avec un blackhole.conf prêt a être injecté dans notre bind9 local comme expliqué dans <a href="/2010/04/24/dns-menteur/">l'article de base du dns menteur</a>. </p>
<p>J'attire votre attention sur le fait que cette liste brute a de grandes chances de ne pas être tout à fait conforme à votre utilisation du web. Sur plus de 22000 entrées (ce qui est mon cas), il y a de grandes chances d'avoir des doublons genre xyz.webespion.org et webespion.org par exemple.<br />
Le principal risque des listes adblock est le faux-positif, ce risque est transmis intégralement. Je vous invite à manier tout ceci avec prudence.</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/04/24/dns-menteur/' rel='bookmark' title='DNS menteur, une autre méthode anti-curieux'>DNS menteur, une autre méthode anti-curieux</a></li>
<li><a href='http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/' rel='bookmark' title='La nouvelle mode Geek : avoir son domaine .42'>La nouvelle mode Geek : avoir son domaine .42</a></li>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>DNS menteur, une autre méthode anti-curieux</title>
		<link>http://geekfault.org/2010/04/24/dns-menteur/</link>
		<comments>http://geekfault.org/2010/04/24/dns-menteur/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 13:30:37 +0000</pubDate>
		<dc:creator>ckg</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[named]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[stats]]></category>
		<category><![CDATA[xiti]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=3229</guid>
		<description><![CDATA[StatsCounter, SiteMeter, Google Analytics &#038; Urchin, Xiti&#8230; sont les plus populaires des outils de statistiques proposés aux webmestres. Ils sont très simples à mettre en œuvre et proposent des résultats très pertinents. L&#8217;intérêt de ces outils est surtout le profilage à des fins techniques (versions, systèmes d&#8217;exploitations et résolutions des navigateurs&#8230;) et à des fins [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/' rel='bookmark' title='maintenir son DNS menteur avec Adblock'>maintenir son DNS menteur avec Adblock</a></li>
<li><a href='http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/' rel='bookmark' title='La nouvelle mode Geek : avoir son domaine .42'>La nouvelle mode Geek : avoir son domaine .42</a></li>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:Introduction --><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/Geeknnochiault.png" alt="GeekFault en pinnochio" title="Geeknnochiault" width="128" height="128" class="alignleft size-full wp-image-3424" />StatsCounter, SiteMeter, Google Analytics &#038; Urchin, Xiti&#8230; sont les plus populaires des outils de statistiques proposés aux webmestres. Ils sont très simples à mettre en œuvre et proposent des résultats très pertinents. </p>
<p>L&#8217;intérêt de ces outils est surtout le profilage à des fins techniques (versions, systèmes d&#8217;exploitations et résolutions des navigateurs&#8230;) et à des fins de positionnement sur le web (liens directs, liens indirects, durée moyenne de lecture).</p>
<p>La contre-partie de la gratuité de ces outils est la valorisation commerciale de vos profils. <strong>Le webmestre rémunère l&#8217;éditeur du service avec votre profil&#8230; sans votre consentement</strong>.</p>
<p>D&#8217;un point de vue éthique, ce procédé est peu honorable. D&#8217;un point de vue technique c&#8217;est guère mieux : augmentation sensible du nombre de requêtes, charge processeur superflue, stockage de cookies inutile, bande passante gaspillée.<br />
<!--more--></p>
<h3>WebSpy : l&#8217;autre côté obscur de la Force</h3>
<p>Comment fonctionne le profilage sur le Ternet ? Est-ce généralisé ? Est-ce grave ? Quels sites profilent qui ? Quelles méthodes sont employées ? Quels types de sites communiquent aux <em>méchants espions</em> ? Comment maitriser ces informations sortantes ? Comment assurer cette maitrise sur un logiciel, une machine, un réseau ?</p>
<p>Évidemment, <a href="http://desencyclopedie.wikia.com/wiki/42">LA</a> réponse universelle s&#8217;applique à toutes ces questions. Mais ne  nous privons pas d&#8217;une approche plus technique en prenant comme sujet d&#8217;étude Geekfault. Il parait que c&#8217;est vendeur de critiquer Google, ne boudons pas notre plaisir et stigmatisons son outil de statistiques : Google Analytics. </p>
<h3>Plan de l&#8217;article</h3>
<p>Dans la section suivante, nous allons <strong>illustrer et quantifier ce gâchis</strong> avec des outils simples d&#8217;accès. Si vous êtes déjà adepte du NoScript, Adblock, Privoxy, Squid+adzap vous pouvez aller directement au chapitre 5.<br />
Après avoir abordé les <strong>protections individuelles</strong>, nous traiterons des protections collectives de type <strong>proxies filtrants</strong>.<br />
On abordera ensuite le vif du sujet avec le <strong>filtrage par DNS menteur</strong> de manière théorique pour mieux appréhender cette autre protection collective.<br />
Le principe sera ensuite présenté dans deux scenarii avec bind :  <strong>Gentoo/Linux + Lighttpd</strong> et <strong>FreeBSD + Apache</strong>.<br />
On  fera un bref récapitulatif des avantages et des inconvénients de chaque solutions et on rendra à César ce qui appartenait a feu CiteWeb dans la <strong>conclusion</strong>.</p>
<p>Bonne lecture !<br />
<!--nextpage--><!--pagetitle:Présentation et quantification de la nuisance--></p>
<h3>Présentation et quantification de la nuisance</h3>
<p>Cette nuisance est pénalisante sur les faibles configurations et les gadgets comme les smartphones et les consoles portables. Elle est également perceptible sur les lignes ADSL à faible débit.</p>
<h3>Une navigation &#8220;vanilla&#8221; c&#8217;est en fait ça :</h3>
<ol>
<li>La première étape pour afficher la page d&#8217;accueil de <a href="http://www.geekfault.org">Geekfault</a> est la résolution du nom de domaine en adresse IP par un DNS externe :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur01.png" title="DNSMenteur01" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur01-300x222.png" alt="" title="DNSMenteur01" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a>
</li>
<li>Une connexion directe sur la machine par <abbr title="HyperText Transfer Protocol">HTTP</abbr> permet de récupérer le fichier index (typiquement index.php) :<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur02.png" title="DNSMenteur02" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur02-300x222.png" alt="" title="DNSMenteur02" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur lit cette page pour établir la liste des fichiers à télécharger en plus (<abbr title="Ecma Script">js</abbr>,<abbr title="Portable Network Graphic">png</abbr>,<abbr title="Cascaded Style Sheet">css</abbr>,&#8230;) et la liste des éléments externes au site (dont ceux des web-espions). Les éléments externes doivent d&#8217;abord être recherchés par leur adresse IP toujours  avec un DNS externe :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur03.png" title="DNSMenteur03" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur03-300x222.png" alt="" title="DNSMenteur03" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur télécharge et traite les fichiers présents sur le serveur de Geekfault :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur04.png" title="DNSMenteur04" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur04-300x222.png" alt="" title="DNSMenteur04" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>En même temps que l&#8217;étape 4, le navigateur télécharge les éléments tiers. Dans la réalité ça donne ça : Vous êtes fichés !<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur05.png" title="DNSMenteur05" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur05-300x222.png" alt="" title="DNSMenteur05" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
</ol>
<h3>Bande passante</h3>
<p>Vous pouvez visualiser la bande passante consommée avec des outils externes comme <a href="http://analyze.websiteoptimization.com/">WebsiteOptimization</a> &#038; <a href="http://rapid.searchmetrics.com/en/seo-tools/site-analysis/website-speed-test,46.html">SearchMetrics</a> ou des outils intégrés aux navigateurs comme <a href="http://developer.yahoo.com/yslow/">YSlow</a>, <a href="http://code.google.com/intl/fr/speed/page-speed/">PageSpeed</a> illustré ici : <a href="http://geekfault.org/wp-content/uploads/2010/04/PageSpeed.png" title="Google analytics pointé par PageSpeed" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/PageSpeed-300x107.png" alt="Google analytics pointé par PageSpeed" title="Google analytics pointé par PageSpeed" width="300" height="107" class="aligncenter size-medium wp-image-3283" /></a>ou les outils de monitoring de <abbr title="Attention, logiciel partiellement sale">Webkit</abbr> illustré ici :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/WebKit.png" title="Google Analytics pointé par WebKit" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/WebKit-300x115.png" alt="Google Analytics pointé par WebKit" title="Google Analytics pointé par WebKit" width="300" height="115" class="aligncenter size-medium wp-image-3286" /></a></p>
<p><!--nextpage--><!--pagetitle:Protections Individuelles--></p>
<h3>Protections individuelles</h3>
<p>Lorsque une protection individuelle existe, elle est généralement simple à mettre en place. De manière générale, la simplicité convoie son lot d&#8217;inconvénients, ici il n&#8217;y aura pas d&#8217;exceptions&#8230;</p>
<h3>Filtrage au niveau du navigateur</h3>
<p>Le cas le plus fréquent est l&#8217;extension (Firefox, Chromium, Safari) au navigateur ou carrément intégré comme Opera. Les navigateurs de mobiles, consoles ou carrément intégrés à des applications ne sont généralement <strong>pas éligibles à cette méthode</strong>. Les points 1 à 4 sont identiques à la navigation Vanilla.</p>
<ol>
<li value="5">Le navigateur télécharge et traite les fichiers externes <strong>sauf les éléments filtrés</strong>:<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur06.png" title="DNSMenteur06" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur06-300x222.png" alt="" title="DNSMenteur06" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li><del>Ça y&#8217;est vous êtes fichés !</del>Mission accomplie, mais sans grande classe, nous n&#8217;avons protégé qu&#8217;une partie de nos terminaux.</li>
</ol>
<h3>Au niveau du fichier /etc/hosts</h3>
<p>Cas valable pour Linux,*BSD, *Solaris et Mac OS X (< 10.6). Les systèmes d'exploitations de mobiles, consoles, ne sont généralement <strong>pas éligibles à cette méthode</strong>. Les points 1 à 3 sont identiques à la navigation Vanilla.</p>
<ol>
<li value="4">Les éléments externes doivent d&#8217;abord être recherchés par leur adresse IP toujours avec <strong>/etc/hosts en premier</strong> et les adresses non résolues sont transmises au DNS externe :<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur13.png" title="DNSMenteur13" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur13-300x222.png" alt="" title="DNSMenteur13" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur télécharge et traite les fichiers externes. Si il n&#8217;y a pas de serveur HTTP en écoute sur l&#8217;ip spécifiée dans le /etc/hosts vous allez au devant de ralentissements du navigateur  ainsi que des messages d&#8217;erreur :<a href="http://geekfault.org/wp-content/uploads/2010/04/Firefoxerreur.png" title="Firefoxerreur" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/Firefoxerreur-580x318.png" alt="" title="Firefoxerreur" width="580" height="318" class="aligncenter size-large wp-image-3314" /></a></li>
<li><del>Ça y&#8217;est vous êtes fichés !</del>Mission accomplie, mais sans grande classe, nous n&#8217;avons protégé qu&#8217;une partie de nos terminaux.</li>
</ol>
<h3>Qu&#8217;en conclure ?</h3>
<p>En <abbr title="Qualité Hygiène Sécurité Environnement">QHSE</abbr> les protections individuelles montrent très rapidement leurs limites. Dans le cas présenté dans cette section, on se retrouve devant des difficultés non négligeables comme des extensions de logiciels non portables aux autres logiciels, la modification de fichiers systèmes réservés aux administrateurs, la difficile synchronisation des filtres entre plusieurs terminaux.<br />
La plus difficile reste le déploiement de ces techniques sur les terminaux verrouillés comme les téléphones, les consoles portables, les TV. </p>
<p><!--nextpage--><!--pagetitle:Les proxies filtrants--></p>
<h3>Proxies filtrants</h3>
<p>Si le responsable du réseau est un pratiquant du <abbr title="Free Libre Open Source Software">FLOSS</abbr> il utilisera très certainement une solution à base de proxies filtrants tels que <a href="www.privoxy.org/">Privoxy</a>, <a href="www.squid-cache.org/">Squid</a> ou encore <a href="http://www.pps.jussieu.fr/~jch/software/polipo/">Polipo</a> (je vous conseille <a href="http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/">l&#8217;excellent article de bragon</a>).</p>
<h3>Fonctionnement générique d&#8217;un proxy filtrant</h3>
<p>Nous sommes toujours dans notre scénario d&#8217;une visite de courtoisie sur Geekfault.</p>
<ol>
<li>La première étape pour afficher la page d&#8217;accueil de <a href="http://www.geekfault.org">Geekfault</a> est la résolution du nom de domaine en adresse IP par un DNS externe (configuration par défaut des navigateurs et des proxies communs)  :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur01.png" title="DNSMenteur01" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur01-300x222.png" alt="" title="DNSMenteur01" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Une connexion <strong>IN</strong>directe sur la machine par <abbr title="HyperText Transfer Protocol">HTTP</abbr> permet de récupérer le fichier index (typiquement index.php) à travers un proxy:<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur06bis.png" title="DNSMenteur06bis" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur06bis-300x222.png" alt="" title="DNSMenteur06bis" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur lit cette page pour établir la liste des fichiers à télécharger en plus (<abbr title="Ecma Script">js</abbr>,<abbr title="Portable Network Graphic">png</abbr>,<abbr title="Cascaded Style Sheet">css</abbr>, &#8230;) et la liste des éléments externes au site (dont ceux des web-espions). Les éléments externes doivent d&#8217;abord être recherchés par leur adresse IP toujours  avec un DNS externe :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur03.png" title="DNSMenteur03" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur03-300x222.png" alt="" title="DNSMenteur03" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur télécharge et traite les fichiers présents sur le serveur de Geekfault :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur20.png" title="DNSMenteur20" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur20-300x222.png" alt="" title="DNSMenteur20" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>En même temps que l&#8217;étape 4, le navigateur tente de télécharger les éléments tiers, mais le proxy filtrant l&#8217;en empêchera.<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur08.png" title="DNSMenteur08" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur08-300x222.png" alt="" title="DNSMenteur08" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
</ol>
<h3>Qu&#8217;en conclure ?</h3>
<p>Le proxy filtrant est la solution généralement la plus efficace. Les filtres à base d&#8217;<a href="http://fr.wikipedia.org/wiki/Expression_rationnelle">expression régulières</a> permettent un action chirurgicale sans égal, la contrepartie est que pour proxifier une centaine de poste client la machine doit être correctement dimensionnée.<br />
Comme nous le rappelle <a href="http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/#comment-322">khemael</a> le proxy transparent çaymal® mais c&#8217;est le prix à payer pour protéger<strong> les terminaux qui ne proposent pas de réglages relatifs au proxy </strong>(au hasard une TV&#8230;).<br />
Le dernier inconvénient est que <strong>les systèmes espions ne communiquent pas tous sur HTTP</strong>. </p>
<p>Les avantages l&#8217;emportant largement sur les inconvénients, la popularité de ce système est facilement compréhensible. Néanmoins il existe une autre approche basée sur les DNS menteurs que nous allons aborder dans le prochain chapitre. </p>
<p><!--nextpage--><!--pagetitle:Le DNS menteur--></p>
<h3>DNS menteur</h3>
<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/Geeknnochiault.png" alt="Geekfault en pinnochio" title="Geeknnochiault" width="128" height="128" class="alignleft size-full wp-image-3424" />Dans notre réseau, le <attr title="Domain Name Server">DNS</attr> est donné automatiquement aux terminaux par <attr title="Dynamic Host Configuration Protocol">DHCP</attr>. Dans le scenario qui suit le DNS interne ne sera pas un modèle de franchise. Dans certains cas il refusera d&#8217;interroger un DNS externe et affirmera que certains noms de domaine, pourtant externes à notre réseau, ont une adresse IP locale que l&#8217;on appellera <em><strong>blackhole</strong></em>. <strong>Le DNS ment</strong> !</p>
<p>Pour éviter d&#8217;avoir des <a href="http://geekfault.org/wp-content/uploads/2010/04/Firefoxerreur.png">messages d&#8217;erreurs</a> dans les navigateurs, il y a un serveur HTTP en écoute sur <em><strong>blackhole</strong></em>.</p>
<h3>Scénario</h3>
<p>Nous sommes toujours dans notre scénario d&#8217;une visite de courtoisie sur Geekfault.</p>
<ol>
<li>La première étape pour afficher la page d&#8217;accueil de <a href="http://www.geekfault.org">Geekfault</a> est la résolution du nom de domaine en adresse IP par un DNS externe (configuration par défaut des navigateurs et des proxies communs)  :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur09.png" title="DNSMenteur09" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur09-300x222.png" alt="" title="DNSMenteur09" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a>
</li>
<li>Une connexion directe sur la machine par <abbr title="HyperText Transfer Protocol">HTTP</abbr> permet de récupérer le fichier index (typiquement index.php) :<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur10.png" title="DNSMenteur10" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur10-300x222.png" alt="" title="DNSMenteur10" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur lit cette page pour établir la liste des fichiers à télécharger en plus (<abbr title="Ecma Script">js</abbr>,<abbr title="Portable Network Graphic">png</abbr>,<abbr title="Cascaded Style Sheet">css</abbr>, &#8230;) et la liste des éléments externes au site (dont ceux des web-espions). Les éléments externes doivent d&#8217;abord être recherchés par leur adresse IP toujours  avec un DNS externe :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur11.png" title="DNSMenteur11" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur11-300x222.png" alt="" title="DNSMenteur11" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>Le navigateur télécharge et traite les fichiers présents sur le serveur de Geekfault :<br />
<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur14.png" title="DNSMenteur14" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur14-300x222.png" alt="" title="DNSMenteur14" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
<li>En même temps que l&#8217;étape 4, le navigateur tente de télécharger les éléments tiers. Mais les requêtes initialement destinées aux web-espions échoueront sur <strong><em>blackhole</em></strong> .<a href="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur21.png" title="DNSMenteur21" rel="lightbox.3229"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/DNSMenteur21-300x222.png" alt="" title="DNSMenteur21" width="300" height="222" class="aligncenter size-medium wp-image-3302" /></a></li>
</ol>
<h3>Qu&#8217;en conclure ?</h3>
<p>La protection par DNS menteur est très économe en terme de puissance : le mécanisme se limite à quelques requêtes DNS que le client cachera et une requête HTTP sur un fichier vide qui contient par exemple ceci :<br />
<code><html></html></code><br />
Le filtrage par DNS est en tout-ou-rien. Ou le domaine est bloqué ou tout passe, nous sommes bien loin de la souplesse apportée par les expressions régulières du chapitre précédent. En revanche cette méthode permet de filtrer ce qui n&#8217;est pas HTTP.<br />
Passons maintenant à la pratique avec deux systèmes d&#8217;exploitation et deux serveurs HTTP distincts.</p>
<p><!--nextpage--><!--pagetitle:Cas n°1 Gentoo/Linux + Lighttpd--></p>
<h3>Cas n°1 Gentoo/Linux + Lighttpd</h3>
<p>Notre premier cas s&#8217;applique actuellement à un réseau domestique/<abbr title"Très Petite Entreprise">tpe</abbr> sous ma responsabilité. L&#8217;environnement est hétérogène avec de l&#8217;environnement propre, terreux et sale, des téléphones et consoles sous environnement sale. Une fonera (double SSID) est présente. Les serveurs DNS et HTTP sont sur une machine en Gentoo/Linux.</p>
<h3>Bind9</h3>
<p>Il existe pléthore de cours sur le Ternet pour en monter un en 5 minutes douche comprise. Je vais considérer que vous avez déjà un daemon DNS interne fonctionnel.<br />
À la fin de votre /etc/namedb/named.conf ajoutez ceci<code>include "antistats.conf";</code><br />
Éditez ensuite /etc/namedb/antistats.conf<br />
<code><br />
zone "addfreestats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "estats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "freestats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "goldstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "google-analytics.com" { type master; notify no; file "null.zone.file"; };<br />
zone "gostats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "hitometer.com" { type master; notify no; file "null.zone.file"; };<br />
zone "indexstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "masterstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "megastats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "revstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "rightstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "sitemeter.com" { type master; notify no; file "null.zone.file"; };<br />
zone "stats.blogger.com" { type master; notify no; file "null.zone.file"; };<br />
zone "stats.wordpress.com" { type master; notify no; file "null.zone.file"; };<br />
zone "stats4all.com" { type master; notify no; file "null.zone.file"; };<br />
zone "superstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "topstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "topstats.net" { type master; notify no; file "null.zone.file"; };<br />
zone "www-google-analytics.l.google.com" { type master; notify no; file "null.zone.file"; };<br />
zone "xiti.com" { type master; notify no; file "null.zone.file"; };<br />
zone "analytics.engagd.com" { type master; notify no; file "null.zone.file"; };<br />
zone "histats.com" { type master; notify no; file "null.zone.file"; };<br />
</code><br />
Éditez ensuite /etc/namedb/null.zone.file<br />
<code><br />
$TTL 3600<br />
@ IN SOA <votre SOA>. hostmaster.<votre SOA>. (<br />
2010041800 3600 3600 3600000 3600 )<br />
@ IN NS blackhole.<br />
@ IN A 192.168.1.127<br />
* IN A 192.168.1.127<br />
</code><br />
Adaptez à votre environnement, notamment votre SOA, le TTL et les autres délais. Ne prêtez pas attention à <em>loopback.</em> et utilisez plutôt vos valeurs &#8220;normales&#8221;. En ce qui concerne <strong><em>blackhole</em></strong> il faut que ce nom pointe réellement vers l&#8217;ip choisie (ici 192.168.1.127) et vice versa : que l&#8217;ip choisie soit résolue en <strong><em>blackhole</em></strong>. Rien de bien extraordinaire dans une configuration de DNS local.</p>
<p>Il faut ensuite relancer Bind9 et normalement nous avons ceci :<br />
<code><br />
$ host -v -t A xiti.com<br />
Trying "xiti.com"<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22544<br />
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0</p>
<p>;; QUESTION SECTION:<br />
;xiti.com.			IN	A</p>
<p>;; ANSWER SECTION:<br />
xiti.com.		60	IN	A	192.168.1.127</p>
<p>;; AUTHORITY SECTION:<br />
xiti.com.		60	IN	NS	blackhole.</p>
<p>Received 65 bytes from 192.168.1.210#53 in 1 ms<br />
</code><br />
Bingo ! Le domaine xiti.com est résolu en 192.168.1.127 comme prévu. Mais également :<br />
<code><br />
$ host -v -t A er.erer.Erer.xiti.com<br />
Trying "er.erer.Erer.xiti.com"<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17999<br />
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0</p>
<p>;; QUESTION SECTION:<br />
;er.erer.Erer.xiti.com.		IN	A</p>
<p>;; ANSWER SECTION:<br />
er.erer.Erer.xiti.com.	60	IN	A	192.168.1.127</p>
<p>;; AUTHORITY SECTION:<br />
xiti.com.		60	IN	NS	blackhole.</p>
<p>Received 78 bytes from 192.168.1.210#53 in 1 ms<br />
</code><br />
Nous avons donc un filtre de type *.xiti.com !</p>
<h3>Adresse IP locale</h3>
<p>J'ai choisi 192.168.1.127 pour une raison arbitraire. Gentoo permet de l'assigner automatiquement dans /etc/conf.d/net<br />
<code><br />
# cat /etc/conf.d/net<br />
config_eth0=( "dhcp"<br />
        "192.168.1.127" )<br />
</code><br />
Ce qui me permet d'avoir eth0 par dhcp (il y a des raisons <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) et créer eth0:1 avec pour IP  192.168.1.127 dès le boot de la machine.<br />
<code><br />
# ifconfig<br />
eth0      Lien encap:Ethernet  HWaddr 00:11:2f:00:00:00<br />
          inet adr:192.168.1.210  Bcast:192.168.1.255  Masque:255.255.255.0<br />
(...)<br />
eth0:1    Lien encap:Ethernet  HWaddr 00:11:2f:3e:e0:b8<br />
          inet adr:192.168.1.127  Bcast:192.168.1.255  Masque:255.255.255.0<br />
(...)<br />
</code><br />
Cette étape est purement optionnelle, vous avez le droit de pourrir les logs de votre serveur web avec des requêtes qui ne lui sont pas destinées.</p>
<h3>Lighttpd</h3>
<p>Ajouter ceci à votre /etc/lighttpd/lighttpd.conf<br />
<code><br />
$SERVER["socket"] == "192.168.1.127:80" {<br />
 server.name = "blackhole.<votre nom de domaine interne>"<br />
 url.rewrite = ( ".*" => "/index.html" )<br />
 server.document-root = "/var/www/localhost/blackhole/"<br />
 accesslog.filename = var.logdir + "/blackhole-access.log"<br />
}<br />
</code><br />
Il faut bien entendu adapter a votre sauce,  server.errorlog n'est a priori pas nécessaire.<br />
Finalement on obtient ceci<br />
<code><br />
192.168.1.16 www.google-analytics.com - [18/Apr/2010:19:29:51 +0200] "GET /ga.js HTTP/1.1" 200 14 "http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/3/" "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"<br />
</code></p>
<p><!--nextpage--><!--pagetitle:Cas n°2 FreeBSD + Apache--></p>
<h3>Cas n°2 FreeBSD + Apache</h3>
<p>Notre second cas s'applique actuellement à un sous réseau autonome d'une moyenne entreprise sous ma responsabilité. L'environnement est hétérogène avec de l'environnement propre  (pas assez), terreux (surtout) et sale (peu), des téléphones et diverses machines outils sous environnement sale. Les serveurs DNS et HTTP présentés ici sont sur une machine virtualisée FreeBSD. Ces services sont isolés du serveur principal.</p>
<h3>Bind9</h3>
<p>Il existe pléthore de cours sur le Ternet pour en monter un en 5 minutes douche comprise. Je vais considérer que vous avez déjà un daemon DNS interne fonctionnel.<br />
À la fin de votre /var/named/etc/namedb/named.conf ajoutez ceci<code>include "antistats.conf";</code><br />
Éditez ensuite /var/named/etc/namedb/antistats.conf<br />
<code><br />
zone "addfreestats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "estats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "freestats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "goldstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "google-analytics.com" { type master; notify no; file "null.zone.file"; };<br />
zone "gostats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "hitometer.com" { type master; notify no; file "null.zone.file"; };<br />
zone "indexstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "masterstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "megastats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "revstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "rightstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "sitemeter.com" { type master; notify no; file "null.zone.file"; };<br />
zone "stats.blogger.com" { type master; notify no; file "null.zone.file"; };<br />
zone "stats.wordpress.com" { type master; notify no; file "null.zone.file"; };<br />
zone "stats4all.com" { type master; notify no; file "null.zone.file"; };<br />
zone "superstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "topstats.com" { type master; notify no; file "null.zone.file"; };<br />
zone "topstats.net" { type master; notify no; file "null.zone.file"; };<br />
zone "www-google-analytics.l.google.com" { type master; notify no; file "null.zone.file"; };<br />
zone "xiti.com" { type master; notify no; file "null.zone.file"; };<br />
zone "analytics.engagd.com" { type master; notify no; file "null.zone.file"; };<br />
zone "histats.com" { type master; notify no; file "null.zone.file"; };<br />
</code><br />
Éditez ensuite /var/named/etc/namedb/null.zone.file<br />
<code><br />
$TTL 3600<br />
@ IN SOA <votre SOA>. hostmaster.<votre SOA>. (<br />
2010041800 3600 3600 3600000 3600 )<br />
@ IN NS blackhole.<br />
@ IN A 192.168.4.127<br />
* IN A 192.168.4.127<br />
</code><br />
Adaptez à votre environnement, notamment votre SOA, le TTL et les autres délais. Ne prêtez pas attention à <em>loopback.</em> et utilisez plutôt vos valeurs "normales". En ce qui concerne <strong><em>blackhole</em></strong> il faut que ce nom pointe réellement vers l'ip choisie (ici 192.168.4.127) et vice versa : que l'ip choisie soit résolue en <strong><em>blackhole</em></strong>. Rien de bien extraordinaire dans une configuration de DNS local.</p>
<p>Il faut ensuite relancer Bind9 et normalement nous avons ceci :<br />
<code><br />
$ host -v -t A xiti.com<br />
Trying "xiti.com"<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22544<br />
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0</p>
<p>;; QUESTION SECTION:<br />
;xiti.com.			IN	A</p>
<p>;; ANSWER SECTION:<br />
xiti.com.		60	IN	A	192.168.4.127</p>
<p>;; AUTHORITY SECTION:<br />
xiti.com.		60	IN	NS	blackhole.</p>
<p>Received 65 bytes from 192.168.4.10#53 in 1 ms<br />
</code><br />
Bingo ! Le domaine xiti.com est résolu en 192.168.4.127 comme prévu. Mais également :<br />
<code><br />
$ host -v -t A er.erer.Erer.xiti.com<br />
Trying "er.erer.Erer.xiti.com"<br />
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17999<br />
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0</p>
<p>;; QUESTION SECTION:<br />
;er.erer.Erer.xiti.com.		IN	A</p>
<p>;; ANSWER SECTION:<br />
er.erer.Erer.xiti.com.	60	IN	A	192.168.4.127</p>
<p>;; AUTHORITY SECTION:<br />
xiti.com.		60	IN	NS	blackhole.</p>
<p>Received 78 bytes from 192.168.4.210#53 in 1 ms<br />
</code><br />
Nous avons donc un filtre de type *.xiti.com !</p>
<h3>Adresse IP locale</h3>
<p>J'ai choisi 192.168.4.127 pour une raison arbitraire. Freebsd permet de l'assigner (par exemple) via /etc/rc.local<br />
<code><br />
$ cat /etc/rc.local<br />
ifconfig ed0 inet 192.168.4.127 alias</code><br />
Ce qui me permet d'avoir une deuxième IP pour ed0 avec pour valeur 192.168.1.127, dès le boot de la machine.<br />
<code><br />
$ ifconfig ed0<br />
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500<br />
        ether 00:be:ef:00:fa:ce<br />
        inet 192.168.4.10 netmask 0xffffff00 broadcast 192.168.4.255<br />
        inet 192.168.4.127 netmask 0xffffffff broadcast 192.168.4.127<br />
        media: Ethernet autoselect (10baseT/UTP)<br />
</code><br />
Cette étape est purement optionnelle, vous avez le droit de pourrir les logs de votre serveur web avec des requêtes qui ne lui sont pas destinées.</p>
<h3>Apache</h3>
<p>Créez /usr/local/etc/apache22/Includes/blackhole.conf et<br />
<code><br />
Listen 192.168.4.127:80<br />
Listen 192.168.4.127:443</p>
<p><VirtualHost 192.168.4.127><br />
    Options +MultiViews<br />
    AddOutputFilterByType DEFLATE text/html<br />
    LogLevel alert<br />
    CustomLog /var/log/httpd-blackhole combined<br />
    ServerAdmin webmaster@dummy-host.example.com<br />
    DocumentRoot /usr/local/www/apache22/data/www/blackhole<br />
    ErrorDocument 404 /index.php<br />
    ServerSignature Off<br />
</VirtualHost><br />
</code><br />
Le premier listen est intelligible, le 2ème nécessite un peu de bidouille. Le MultiViews permet de correctement intercepter les arborescences dans blackhole. Le 404 permet de nous orienter vers index.php (préférez un index.xhtml).</p>
<p><code><br />
macbookpro - - [19/Apr/2010:11:48:42 +0200] "GET /hit.xiti?s=345082&#038;s2=2&#038;p=News::Commenter::mac-apple-jobs-bkuray-youtube&#038;hl=11x48x43&#038;lng=en-US&#038;jv=1&#038;r=1440x900x24x24&#038;re=1440x678&#038;ref=http://www.generation-nt.com/mac-apple-jobs-bkuray-youtube-actualite-999491.html HTTP/1.1" 404 38 "http://www.generation-nt.com/commenter/mac-apple-jobs-bkuray-youtube-actualite-999491.html" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.5pre) Gecko/20100418 Namoroka/3.6.5pre"<br />
</code></p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<h3>Conclusion</h3>
<p>Ce système présente des limites et ses avantages. Laissez-vous tenter par l'expérience et approfondissez le sujet !</p>
<h3>Limites évidentes</h3>
<p>La principale limite concerne les web-espions qui utilisent des IP plutot que des noms de domaine.<br />
Le principal effet de bord est le filtrage non désiré de CSS ou des JavaScripts importants pour un site BIEN mais hébergés par un site MAL (merci les scripts eye-candy hebergés chez google !), la réciproque est aussi un effet de bord : avoir des fichiers non désirés mais nécessaires sur un site BIEN (grrrr le tracking de Viadeo).<br />
Bind9 doit être rechargé à chaque modifications, vous pouvez également l'adosser à une base de données type mysql pour gagner en souplesse d'administration. La granularité des filtres est très approximative : appelons un chat, un chat, c'est une technique de bourrin (c'est tout moi ça).</p>
<h3>Gains immédiats</h3>
<p>Pour commencer la charge cpu daemon dns + daemon http est amortie au delà d'une dizaine de surfeur des bahines (concept antérieur au surfeur niçois).</p>
<p>Le combat contre les web-espions ne se limite pas à l'HTTP, on peut envisager de filtrer les espions qui téléphonent à la maison via un autre protocole voire à un autre niveau sous-jacent (UDP).</p>
<p>Le plus grand avantage que j'y trouve est éthique : avec ce système vous ne serez jamais tenté de faire le bâtard en privant vos administrés de leur pause méritée. Non ce n'est pas faire le <a href="http://bofh.ch/">BOFH</a> mais la sous-merde exécutante, nuance. Les astuces pour modifier le fichier /etc/hosts se rependront et vous passerez pour une buse.</p>
<p>Pour finir, le dns-menteur peut être positionné en complément d'un proxy filtrant, soulageant ce dernier de requêtes superflues. Le gain de performance pourrait être l'occasion d'un autre article <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<h3>Liens pour approfondir</h3>
<ul>
<li><a href="http://www.bortzmeyer.org/dns-menteur.html">Les mauvais DNS menteurs par Stéphane Bortzmeyer</a></li>
<li><a href="http://www.commentcamarche.net/contents/intranet/resdns.php3">Faire un DNS intranet par  CCN.net</a></li>
<li><a href="http://www.hongkiat.com/blog/top-14-free-web-statistics-tools/">Quelques outils de stats par Hongkiat</a></li>
</ul>
<p><em>Le concept original (2001) est à mettre au crédit de feu pub.CiteWeb.net sous license WTFPL. Merci aux petits gars de yoyo.org pour les noms de domaine.</em></p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/05/11/maintenir-son-dns-menteur-avec-adblock/' rel='bookmark' title='maintenir son DNS menteur avec Adblock'>maintenir son DNS menteur avec Adblock</a></li>
<li><a href='http://geekfault.org/2010/12/19/la-nouvelle-mode-geek-avoir-son-domaine-42/' rel='bookmark' title='La nouvelle mode Geek : avoir son domaine .42'>La nouvelle mode Geek : avoir son domaine .42</a></li>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/04/24/dns-menteur/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Les autres nouveautés de l&#8217;HTML 5</title>
		<link>http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/</link>
		<comments>http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 23:14:32 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2951</guid>
		<description><![CDATA[Quand on parle de la dernière version de l&#8217;HTML introduite par le W3C, beaucoup le résument à l&#8217;élément &#60;video&#62;. Pourtant, le W3C a introduit de nombreux autres balises, attributs et API pour mieux coller au web d&#8217;aujourd&#8217;hui, ainsi que des innovations qui vont permettre de rattraper l&#8217;écart entre les applications natives et les WebApps tout [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/26/plowshare-megaupload-rapidshare-en-cli/' rel='bookmark' title='Plowshare : MegaUpload, RapidShare et autres en CLI'>Plowshare : MegaUpload, RapidShare et autres en CLI</a></li>
<li><a href='http://geekfault.org/2009/04/18/nouveautes-sur-geekfault/' rel='bookmark' title='Nouveautés sur Geekfault'>Nouveautés sur Geekfault</a></li>
<li><a href='http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/' rel='bookmark' title='Ifconfig.me, connaitre son IP publique en un rien de temps'>Ifconfig.me, connaitre son IP publique en un rien de temps</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/html5.jpg" alt="" title="html5" width="225" height="222" class="alignleft size-full wp-image-3205" />Quand on parle de la dernière version de l&#8217;HTML introduite par le W3C, beaucoup le résument à l&#8217;élément <span style="font-family: monospace;"><strong>&lt;video&gt;</strong></span>. Pourtant, le W3C a introduit de <strong>nombreux autres balises, attributs et API</strong> pour mieux coller au web d&#8217;aujourd&#8217;hui, ainsi que des innovations qui vont permettre de rattraper l&#8217;écart entre les applications natives et les <strong>WebApps</strong> tout en rendant le web plus <strong>accessible</strong>.<br />
<!--more--></p>
<h3>Allez, les balises audio et video</h3>
<p>D&#8217;accord, on en a assez parlé, mais ça constitue une bonne introduction à cet article <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Parmi les nombreuses innovations de l&#8217;HTML 5 qui vont permettre au web de <strong>se séparer d&#8217;Adobe Flash Player</strong> (vous savez, cette extension qui fait planter tous les navigateurs et bouffe <em>au moins</em> un des cores de votre CPU), les tags <span style="font-family: monospace;"><strong>&lt;audio&gt;</strong></span> et <span style="font-family: monospace;"><strong>&lt;video&gt;</strong></span> sont les plus connus. Insérer une vidéo dans un article est maintenant devenu aussi simple qu&#8217;y insérer une image :<br />
<code lang="html"><video width="480" height="360" src="jaimeLesFrites.ogv"><br />
Mais quelle saloperIE, ton navigateur ne supporte pas les vidéos HTML 5 <img src='http://geekfault.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
</video></code><script type="text/javascript"><!--
cancel=false;
function autoriseRestore() {
    cancel=false;
}
function maximizeVideo() {
    cancel=true;
    video=document.getElementById('tbbt');
    video.height=270;
    video.width=480;
    setTimeout('autoriseRestore()', 500);
}
function restoreVideo() {
    if(cancel) { return; }
    video=document.getElementById('tbbt');
    video.height=135;
    video.width=240;
}
--></script><video id="tbbt" width="240" height="135" controls style="float: right; margin: 0 0 4px 4px;" onmouseover="maximizeVideo()" onmouseout="setTimeout('restoreVideo()',500);"><source src="http://geekfault.org/wp-content/uploads/2010/04/TBBT.ogg" type='video/ogg; codecs="theora, vorbis"'>  <source src="http://geekfault.org/wp-content/uploads/2010/04/TBBT.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>Mais installe un vrai navigateur rooooh! <a href="http://getfirefox.com">Get Firefox!</a></video>Remarquez la rétro-compatibilité avec les navigateurs HTML4 : puisqu&#8217;ils ne vont pas interpréter ce tag, ils afficheront un gentil petit mot. Pensez éventuellement à y mettre un lien vers http://getFirefox.com ^_^ .</p>
<p>Bien sûr ces balises ont des attributs et une API qui leur sont propre, mais ce n&#8217;est pas le sujet de l&#8217;article.</p>
<h4>La limitation du codec</h4>
<p>La grosse limitation pour ces attributs est <strong>l&#8217;implémentation des codecs</strong>. Les principaux navigateurs libres n&#8217;implémentent que des codecs libres (<strong>Ogg Theora+Vorbis</strong>) mais par exemple Safari ou même Android n&#8217;implémentent que le h264. <strong>La W3C ne résoud pas ce problème</strong>, ce serait comme imposer le PNG dans les éléments <span style="font-family: monospace;">&lt;img&gt;</span> alors que le JPEG (propriétaire) est largement répandu.</p>
<p>Sa solution est donc de fournir les vidéos dans les deux formats, pour que tous les navigateurs compatibles HTML 5 puissent les décoder:<br />
<code lang="html"><video width="320" height="240"><br />
  <source src="Bravo.ogv" type='video/ogg; codecs="theora, vorbis"'><br />
  <source src="GrosVilain.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'><br />
</video></code></p>
<p>Malheureusement la plupart des éditeurs vont privilégier un seul format, que ce soit par idéologie ou par contraintes techniques (temps de conversion, espace de stockage). Déjà aujourd&#8217;hui <strong>YouTube</strong>, dans sa beta HTML 5, ne diffuse ses vidéos que en <strong>h264</strong>, ce qui le rend incompatible avec, entre autres, Firefox.</p>
<h3>La balise canvas</h3>
<p>Un <span style="font-family: monospace;">canvas</span> n&#8217;est pas un dessin à proprement parler mais une zone possédant une API complète pour dessiner des formes en 2D grâce à un JavaScript. Rien de mieux qu&#8217;un petit exemple je pense :<br />
<code lang="javascript"><br />
<canvas id="myCanvas" width="300" height="150"><br />
Votre navigateur n'est pas compatible<br />
</canvas></code><br />
<canvas id="canvas1" width="150" height="120" style="float: right; margin: 0 0 5px 5px;">Votre navigateur n&#8217;est pas compatible</canvas>Et si vous avez un navigateur compatible, vous devriez voir le résultat ci-contre.</p>
<p>L&#8217;API permet de tracer des <strong>rectangles</strong>, des <strong>ronds</strong>, des <strong>traits</strong>, des <strong>pixels</strong> et même d&#8217;insérer des <strong>images</strong> ou du <strong>texte</strong>. On peut aussi jouer avec des <strong>ombres</strong>, des <strong>flous</strong> ou des <strong>dégradés</strong> de couleurs. Très pratique pour faire des manipulations de style sur un texte par exemple :<br />
<script type="text/javascript"><!--
window.addEventListener('load', function () {
  var elem = document.getElementById('canvas2');
  if (!elem || !elem.getContext) { return; }
  var context = elem.getContext('2d');
  if (!context) { return; }
  var color, hue = [
    [255,   0,   0 ], // 0, Red,       0°
    [255, 255,   0 ], // 1, Yellow,   60°
    [  0, 255,   0 ], // 2, Green,   120°
    [  0, 255, 255 ], // 3, Cyan,    180°
    [  0,   0, 255 ], // 4, Blue,    240°
    [255,   0, 255 ], // 5, Magenta, 300°
    [255,   0,   0]], // 6, Red,     360°
    gradient = context.createLinearGradient(0, 0, elem.width, 0);
    for (var i = 0; i <= 6; i++) {
      color = 'rgb(' + hue[i][0] + ', ' + hue[i][1] + ', ' + hue[i][2] + ')';
      gradient.addColorStop(i * 1/6, color);
    }
    context.fillStyle = gradient;
    context.shadowOffsetX = 5;
    context.shadowOffsetY = 5;
    context.shadowBlur    = 4;
    context.shadowColor   = 'rgba(0, 0, 0, 0.5)';
    context.font = 'bold 36px sans-serif';
    context.textBaseline = 'top';
    if (context.fillText) { context.fillText('Ceci n\'est pas une image', 0, 0, 500); }
    context.strokeStyle = '#666';
    if (context.strokeText) { context.strokeText('Ceci n\'est pas une image', 0, 0, 500); }
}, false);
    // --></script><canvas id="canvas2" width="500" height="50">Votre navigateur n&#8217;est pas compatible</canvas><br />
Pour être exact c&#8217;est une image, mais elle a été générée par votre navigateur (comment ça c&#8217;est moche? xD)</p>
<p>Et puis comme c&#8217;est basé sur le JavaScript, l&#8217;image générée peut être entièrement <strong>dynamique</strong> comme ce <a href="http://www.benjoffe.com/code/demos/interpolate/">plotter dynamique</a> ou le <a href="http://www.benjoffe.com/code/demos/canvascape/textures">très impressionnant 3D Walker</a>.</p>
<p><!--pagetitle:Remplacer Adobe Flash Player--><!--nextpage--><!--pagetitle:De la WebApp à l'application Native--></p>
<h3>Standardisation de Google Gears</h3>
<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/Google-Gears.gif" alt="" title="Google-Gears" width="153" height="43" class="alignleft size-full wp-image-3180" />Le HTML 5 a intégré en standard de nombreuses nouveautés introduites par <strong>Google Gears</strong> :</p>
<ul>
<li>Mettre en cache des pages et scripts pour un <strong>accès hors-ligne</strong></li>
<li><strong>Stocker localement des données</strong></li>
<li>Faire tourner les <strong>scripts en arrière-plan</strong></li>
<li>Laisser les applications <strong>interagir</strong> naturellement avec votre environnement</li>
</ul>
<p>Ces fonctionnalités étaient les prémices du rapprochement les applications natives et les <strong>WebApps</strong>. On aime ou on aime pas, mais la standardisation du W3C permettra d&#8217;accélérer ce phénomène proche du <strong>Cloud Computing</strong>.</p>
<h3>Accès hors-ligne</h3>
<p><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2010/04/Offline.png" alt="" title="Offline" width="120" height="120" class="alignright size-full wp-image-3207" />En HTML 5 il est très aisé de forcer un navigateur à garder des données en cache et ainsi permettre au visiteur de revoir cette page même s&#8217;il n&#8217;a plus de connexion. Il suffit de créer un <strong>fichier manifeste</strong> page.manifest listant les fichiers et scripts à garder en cache :<br />
<code>CACHE MANIFEST<br />
CACHE:<br />
page.htm<br />
style.css<br />
image.jpg<br />
script.js</code></p>
<p>Ensuite il suffit de rajouter l&#8217;attribut au tag HTML :<br />
<code lang="html"><html manifest="page.manifest"></code><br />
Et voilà, <span style="font-family: monospace;">page.htm, style.css, image.jpg et script.js</span> seront accessibles même hors ligne!</p>
<h3>Base de donnée locale</h3>
<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/Database.jpg" alt="" title="Database" width="134" height="134" class="alignleft size-full wp-image-3208" />Le HTML 5 définit une nouvelle API JavaScript <span style="font-family: monospace;"><strong>window.localStorage</strong></span> qui permet de stocker des données dans la mémoire du navigateur. Ses deux principales méthodes sont très simples:<br />
<code lang="javascript">window.localStorage.setItem(key, value);<br />
window.localStorage.getItem(key);</code><br />
Le <span style="font-family: monospace;">localStorage</span> est lié à un nom de domaine et les données stockées le restent <strong>même si l&#8217;utilisateur quitte son navigateur</strong> et revient plus tard. Si vos données n&#8217;ont pas besoin d&#8217;une telle persistance, vous pouvez aussi profiter de l&#8217;API <span style="font-family: monospace;"><strong>sessionStorage</strong></span> qui, comme vous l&#8217;aurez compris, permet de stocker des informations tant que l&#8217;utilisateur n&#8217;a pas quitté le site.</p>
<p>La plupart des navigateurs permettent à chaque <a href="http://fr.wikipedia.org/wiki/Domaine_de_deuxi%C3%A8me_niveau">domaine de deuxième niveau</a> de stocker 10Mo, mais le W3C recommande de demander l&#8217;autorisation de l&#8217;utilisateur si l&#8217;application a besoin de plus de place.</p>
<p>Attention, même s&#8217;ils se ressemblent, le Storage et les <strong>cookies</strong> n&#8217;ont pas la même utilité : n&#8217;oubliez pas que les cookies sont envoyés vers le serveur <strong>à chaque requête</strong>, ce qui pourrait rendre le trafic trop important si vous stockez de nombreuses données. À l&#8217;opposé, les données du Storage restent en local, accessibles via JavaScript.</p>
<p>Finalement, pour faire du vrai traitement de <strong>bases de données</strong>, il suffit de combiner le <span style="font-family: monospace;">localStorage</span> avec un <a href="http://www.json.org/jsonfr.html"><span style="font-family: monospace;"><strong>JSON</strong></span></a> ou implémenter votre propre version de l&#8217;interface <span style="font-family: monospace;">Database</span> standardisée par le W3C.</p>
<h3>Scripts en tâche de fond</h3>
<p>Lorsqu&#8217;il exécute une opération très lourde, un JavaScript <strong>immobilise</strong> toute la page web. Parfois même l&#8217;interface du navigateur ne répond plus tant que le script n&#8217;a pas terminé. Heureusement en HTML 5, l&#8217;API <span style="font-family: monospace;"><strong>Worker</strong></span> permet de profiter de faire tourner de tels scripts en <strong>tâche de fond</strong>.<br />
<code lang="javascript">var worker = new Worker("worker.js");<br />
worker.postMessage(0); /* Lance le Woker avec le paramètre 0 */<br />
worker.onmessage = function (evt) { /* Action lorsque le Worker a fini */<br />
    alert(evt.data);<br />
};</code></p>
<p>Et le <span style="font-family: monospace;">worker.js</span> :<br />
<code lang="javascript">onmessage = function (evt) {<br />
    // evt.data est le paramètre 0<br />
    for (var i=evt.data, il=1000001; i<il; i++) {<br />
        postMessage(i);<br />
    };<br />
};</code><br />
Ce code va nécessiter pas mal de travail au cours de ses 1 000 000 itérations mais ne devrait pas immobiliser le navigateur.</p>
<h3>Remplacer une application desktop</h3>
<p>Finalement, les WebApps peuvent s'enregistrer elles-même pour <strong>gérer les liens vers un certain protocole ou un certain type de fichiers</strong>. On peut ainsi imaginer un client IRC en ligne qui reconnait les liens <span style="font-family: monospace;">irc://</span> ou un éditeur de documents qui ouvre un nouvel onglet plutôt qu'OpenOffice lorsqu'il y a un lien vers un .odt :<br />
<code lang="javascript">navigator.registerProtocolHandler("irc",<br />
                                  "https://www.example.com/?uri=%s",<br />
                                  "Client IRC en ligne");<br />
navigator.registerContentHandler("application/vnd.oasis.opendocument.text",<br />
                                 "http://www.example.com/?uri=%s",<br />
                                 "Lecteur de documents en ligne");</code><br />
Malheureusement, pour des raisons de <strong>sécurité</strong>, un site ne peut s'enregistrer que pour ses propres liens : si vous tombez sur un lien <span style="font-family: monospace;">irc://</span> sur <span style="font-family: monospace;">Geekfault.org</span> vous ne serez pas redirigé vers <span style="font-family: monospace;">example.com</span>.<br />
<!--nextpage--><!--pagetitle:Mais encore...--></p>
<h3>Géolocalisation</h3>
<p>Très intéressant sur le web qui devient de plus en plus <strong>mobile</strong> aujourd'hui, l'HTML 5 intègre une API qui permet d'aisément obtenir les coordonnées géographiques du visisteur :<br />
<code lang="javascript"></code></p>
<p>Normalement le navigateur demande à l'utilisateur l'<strong>autorisation</strong> d'envoyer sa position. Sur un iPhone par exemple, elle sera calculée grâce à la puce GPS. Sur un navigateur desktop, la méthode est variable (triangulation WiFi, puce GPS, services de localisation d'IP ou simplement demander l'adresse de l'utilisateur). </p>
<div style="text-align: center;"><br />
<input type="button" value="Hahaaaa, essaye de me géolocaliser pour voir..." onclick="locateMe()" /></div>
<h3>ContentEditable</h3>
<p contenteditable="true"><em>(Attention, paragraphe très... personnel ^^)</em> Alors là je suis fan de cette fonctionnalité : elle permet de <strong>rendre n'importe quelle partie d'une page éditable</strong>. On voyait ça apparaître de plus en plus dans les applications en ligne, et maintenant c'est standardisé et extrêmement facile à mettre en place. La preuve? <strong>Essayez de cliquer sur ce paragraphe !</strong></p>
<p>Et en plus c'est du <a href="http://fr.wikipedia.org/wiki/WYSIWYG">WYSIWYG</a> ! Essayez <strong>Ctrl+B</strong> ou <em>Ctrl+I</em> (sous Chromium) ! Et voilà le code source qui m'a permis de faire ça :<br />
<code lang="html">
<p contenteditable="true">Owi, édite-moi</p>
<p></code><br />
Je vois déjà toutes les possibilités ouvertes par une fonctionnalité si simple à mettre en place, comme par exemple corriger une erreur dans nos articles ou modifier une page de WikiPédia en deux clics.</p>
<h3>Nouveaux inputs</h3>
<p>Essentiellement dans le soucis de rendre le web encore plus <strong>accessible</strong> (aux handicapés) et aux système d'<strong>auto-remplissage</strong>, le HTML 5 intègre une dizaine de nouveaux types d'inputs textuels : <span style="font-family: monospace; font-weight: bold;">tel, search, url, email, datetime, date, month, week, time, datetime-local, number et color</span>. Les navigateurs sont supposés proposer une interface à l'utilisateur comme par exemple un calendrier pour remplir un datetime, mais ni Chromium ni Firefox ne semble s'y conformer pour l'instant.</p>
<p>On remarque aussi l'apparition de l'input <span style="font-family: monospace; font-weight: bold;">range</span> qui vient combler une déficience qui forçait souvent à avoir recours à une librairie JavaScript.</p>
<input type="range" style="width: 100%;" min="0" max="50" />
<code lang="html"><br />
<input type="range" style="width: 100%;" min="0" max="50" /></code></p>
<h3>Autres nouvelles balises</h3>
<p>Le W3C introduit dans l'HTML 5 de nombreuses nouvelles balises, dont voici la liste exhaustive</p>
<ul>
<li><span style="font-family: monospace; font-weight: bold;">section, article, aside, hgroup, header, footer, nav</span> encadrent les principaux contenus d'une page web typique. On abandonne ainsi l'utilisation constante de, par exemple, <span style="font-family: monospace;">&lt;div id="header"&gt;</span></li>
<li><span style="font-family: monospace; font-weight: bold;">figure</span> et son sous-élément <span style="font-family: monospace; font-weight: bold;">figcaption</span> permettent de lier une légende à une image ou une vidéo</li>
<li><span style="font-family: monospace; font-weight: bold;">embed</span> a pour but de remplacer <span style="font-family: monospace;">object</span> lors de l'insertion de Flash ou de Java (dans les rares cas où ce sera nécessaire)</li>
<li><span style="font-family: monospace; font-weight: bold;">mark</span> encadre un mot ou un texte important pour, par exemple, le surligner en CSS</li>
<li><span style="font-family: monospace; font-weight: bold;">progress</span> est l'élément à privilégier si vous affichez la progression d'une tâche</li>
<li><span style="font-family: monospace; font-weight: bold;">meter</span> représente une mesure telle que l'utilisation du disque</li>
<li><span style="font-family: monospace; font-weight: bold;">time</span> représente une date et/ou une heure</li>
<li><span style="font-family: monospace; font-weight: bold;">ruby, rt, rp</span> permet d'intégrer des annotations ruby (WTF?)</li>
<li><span style="font-family: monospace; font-weight: bold;">command</span> représente une commande que l'utilisateur peut invoquer</li>
<li><span style="font-family: monospace; font-weight: bold;">details</span> encadre un complément d'information ou des contrôles supplémentaires que l'utilisateur peut obtenir sur demande</li>
<li><span style="font-family: monospace; font-weight: bold;">keygen</span> permet de fournir une clé de contrôle pour la vérification de la validité des données</li>
<li><span style="font-family: monospace; font-weight: bold;">output</span> encadre une zone où un script affichera son résultat</li>
</ul>
<p>La plupart de ces nouveaux éléments sont liés à l'accessibilité mais peuvent aussi présenter un avantage de lors de la création de scripts complexes.</p>
<h3>Et nouveaux attributs</h3>
<p>Je vouais ai déjà parlé de <span style="font-style: monospace;">contentEditable</span> mais il y a beaucoup d'autres nouveaux attributs standards en HTML 5.</p>
<ul>
<li><span style="font-family: monospace; font-weight: bold;">contextmenu</span> permet de lier un menu au clic droit sur un élément</li>
<li><span style="font-family: monospace; font-weight: bold;">draggable</span> détermine si un élément peut être soumis au drag &#038; drop. Cette fonctionnalité est malheureusement soumise à controverse à cause de sa complexité, c'est pourquoi je ne l'ai pas abordé dans l'article.</li>
<li><span style="font-family: monospace; font-weight: bold;">hidden</span> est un boléen qui remplace sa fonction homonyme en style ou CSS. L'intérêt? Cacher les éléments même dans les navigateurs pour malvoyants qui n'interprètent pas les styles.</li>
<li><span style="font-family: monospace; font-weight: bold;">item</span> et <span style="font-family: monospace; font-weight: bold;">itemprop</span> et <span style="font-family: monospace; font-weight: bold;">subject</span> permettent de regrouper des éléments</li>
<li><span style="font-family: monospace; font-weight: bold;">spellcheck</span> est un boléen qui spécifie si la correction orthographique mérite d'être activée sur un élément</li>
</ul>
<p>Finalement, vous pouvez lier n'importe quel attribut personnalisé (ce qui peut être pratique pour certains scripts) sans contredire les standards du W3C (et donc passer les tests des validateurs) à condition que cet attribut commence par <span style="font-family: monospace; font-weight: bold;">data-</span>.</p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<h3>Conclusion</h3>
<p>Avec ce nouveau standard encore à l'état de brouillon, le W3C réduit la nécessité des applets (Flash, Java) et rend le web plus accessible tout en permettant aux applications web (WebApps) d'être plus puissantes, plus faciles à coder et de vraies alternatives aux applications natives de votre ordinateur.</p>
<p>Si toutes les recommandations ne sont pas encore adoptées par les navigateurs, même ceux en avance sur les normes, les possibilités actuelles sont déjà très intéressantes et à prendre en compte pour tous vos prochains développements HTML/JavaScript.</p>
<h3>Sources</h3>
<p>Il y a encore quelques autres nouveautés dont je ne vous ai parlé, mais j'espère vous avoir donné un bon aperçu des incroyables innovations de l'HTML 5. Si vous en voulez une liste complète, je vous renvoie au site du W3C, tous les liens sont dans les sources ci-dessous.</p>
<ul>
<li><a href="http://www.w3.org/TR/html5-diff/">Brouillon des différences entre HTML4 et HTML 5 édité par le W3C</a></li>
<li><a href="http://molly.com/html5/html5-0709.html">Comparaison des fonctionnalités HTML 5 supportées par les différents navigateurs</a></li>
<li><a href="http://www.w3schools.com/html5/html5_reference.asp">Référence HTML 5 de la w3schools</a></li>
<li><a href="http://diveintohtml5.org/">Dive into HTML 5</a></li>
<li><a href="http://html5demos.com/">HTML 5 Demos</a></li>
</ul>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/26/plowshare-megaupload-rapidshare-en-cli/' rel='bookmark' title='Plowshare : MegaUpload, RapidShare et autres en CLI'>Plowshare : MegaUpload, RapidShare et autres en CLI</a></li>
<li><a href='http://geekfault.org/2009/04/18/nouveautes-sur-geekfault/' rel='bookmark' title='Nouveautés sur Geekfault'>Nouveautés sur Geekfault</a></li>
<li><a href='http://geekfault.org/2010/08/12/ifconfig-me-connaitre-son-ip-publique-en-un-rien-de-temps/' rel='bookmark' title='Ifconfig.me, connaitre son IP publique en un rien de temps'>Ifconfig.me, connaitre son IP publique en un rien de temps</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/04/12/les-autres-nouveautes-de-html-5/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
<enclosure url="http://geekfault.org/wp-content/uploads/2010/04/TBBT.mp4" length="1885998" type="video/mp4" />
		</item>
		<item>
		<title>Filtrer ses mails ! Un cauchemard !</title>
		<link>http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/</link>
		<comments>http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 17:18:10 +0000</pubDate>
		<dc:creator>bragon</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2808</guid>
		<description><![CDATA[Le but de ce howto est de vous présenter ma façon de filtrer mes mails de tous mes comptes pop/imap, afin de les centraliser dans une même interface. Afin de filtrer les mails qui arrivent nous allons utiliser &#8220;sieve&#8221; un merveilleux ajout disponible dans le packet dovecot, qui permet de filtrer les messages directement AVANT [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/04/09/maildir-mbox-la-migration/' rel='bookmark' title='Maildir mbox &#8211; La migration'>Maildir mbox &#8211; La migration</a></li>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:Introduction et objectifs--><a href="http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/casserole3/" rel="attachment wp-att-2887"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/casserole3-300x200.jpg" alt="" title="casserole3" width="300" height="200" class="alignleft size-medium wp-image-2887" /></a>Le but de ce howto est de vous présenter <strong>ma</strong> façon de filtrer mes mails de tous mes comptes pop/imap, afin de les centraliser dans une même interface.<br />
Afin de filtrer les mails qui arrivent nous allons utiliser &#8220;sieve&#8221; un merveilleux ajout disponible dans le packet dovecot, qui permet de filtrer les messages directement <strong> AVANT </strong> qu&#8217;ils arrivent dans la casserole IMAP.<br />
<!--more--></p>
<h3>Les mails sans rangement c&#8217;est immangeable, ceci est une petite recette d&#8217;assaisonnement </h3>
<p>Centraliser mes mails m&#8217;apporte plusieurs choses :<br />
<strong><br />
- Faciliter le filtrage.<br />
- Faciliter le rangement dans différents dossiers.<br />
- Effectuer un backup de tous mes comptes IMAP/POP.<br />
- Faire apprendre à mon antispam mes différents réglages.<br />
</strong></p>
<p>Cette recette ne couvre pas l&#8217;installation de Apache + php + MySQL<br />
Nous supposons ici que vous savez faire ce type d&#8217;installation.</p>
<p>Cette recette ne couvre pas non plus l&#8217;utilisation de mutt (je mettrai tout de même en ligne ma configuration).<br />
En effet, l&#8217;utilisation de mutt mérite un article à lui seul !</p>
<p>Postulat1 : Les mails seront stockés dans cette recette ici : /home/utilisateur/.maildir<br />
Postulat2 : Nous supposons que vous avez plusieurs comptes email à rapatrier.<br />
Postulat3 : Nous supposons que vous disposez d&#8217;une machine GNU/Linux sous Gentoo et/ou Debian pour effectuer ce howto.<br />
Postulat4 : Nous supposons que vous stockez vos mails dans le format Maildir ! (se reporter au Howto Sur la conversion mbox => maildir en cas de soucis) Allez lire : <a href="http://geekfault.org/2010/04/09/maildir-mbox-la-migration/">http://geekfault.org/2010/04/09/maildir-mbox-la-migration/</a></p>
<h3> Résultat une fois que la recette est en place </h3>
<p><a href="http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/filtermail-2/" rel="attachment wp-att-2969"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/04/filtermail1.jpeg" alt="" title="filtermail" width="662" height="945" class="aligncenter size-full wp-image-2969" /></a></p>
<p><!--nextpage--><!--pagetitle:Aux fourneaux !-->  </p>
<h3> Logiciels nécessaires pour &#8220;MailFiltrés&#8221; </h3>
<li> MySQL-5 </li>
<li> Apache-2.2 </li>
<li> Php-5.2 </li>
<li> RoundCube + plugins &#8220;Report Junk&#8221; et &#8220;Manage Sieve&#8221; </li>
<li> Dovecot (pop/imap) + Sieve + ManageSieve </li>
<li> SpamAssassin + MySQL </li>
<li> Postfix </li>
<li> mutt + sidebar </li>
<li> Fetchmail </li>
<h3> Remplir la casserole </h3>
<p>Pour trier le manger dans la casserole nous devons tout d&#8217;abord la remplir !</p>
<p>Pour effectuer ce howto il nous faut tout d&#8217;abord des emails.<br />
Il va donc nous falloir configurer fetchmail.<br />
Attention ne pas lancer fetchmail de suite ! Sinon vous risquez de rapatrier les emails sans même les faire passer dans la moulinette avant de les déposer dans les bons compartiments de la casserole !</p>
<h4> Récupérer les ingrédients et les mettre dans la casserole </h4>
<p>* Gentoo<br />
<code><br />
USE="ssl" emerge -av net-mail/fetchmail<br />
</code></p>
<p>* Debian<br />
<code><br />
apt-get install fetchmail<br />
</code></p>
<p>* .fetchmailrc</p>
<p><code><br />
## les mails mondomaine.info<br />
poll pop.geekmx.org<br />
protocol pop3<br />
username bragon@mondomaine.info<br />
password ""<br />
#mda '/usr/bin/procmail -d %T' ### petit commentaire pour vous faire voir comment faire pour faire passer vos mails dans la moulinette procmail avant de les donner à manger à dovecot !!<br />
mda "/usr/libexec/dovecot/deliver"<br />
is 'bragon' here ### Nom de l'utilisateur local pour déposer les mails.<br />
keep ### Laisses mes mails sur l'imap distant ! Mechant !</p>
<p>## ensuite on recup les mails geeknode<br />
poll pop.geekmx.org<br />
protocol pop3<br />
username utilisateurvalide@g33kn0de.org<br />
password ""<br />
mda "/usr/libexec/dovecot/deliver"<br />
is 'bragon' here<br />
keep</p>
<p>## apres on passe au compte gmail<br />
poll imap.gmail.com<br />
proto imap<br />
user "bragon.unuser@gmail.com"<br />
password ""<br />
ssl<br />
keep<br />
mda "/usr/libexec/dovecot/deliver"<br />
is 'bragon' here</p>
<p>## On synchronise le compte blackberry pour virification<br />
#poll imap.geekmx.org<br />
#proto imap<br />
#user "unuser@undomaine.info"<br />
#password ""<br />
#ssl<br />
#keep<br />
#mda "/usr/libexec/dovecot/deliver"<br />
#is 'bragon' here</p>
<p>## preparation pour les mails EW<br />
#<br />
poll trucmail.euro-web.fr<br />
protocol imap<br />
username "truc.plop[_at_]euro-web[point_dot]fr" ## Mettre ici une vraie adresse mail<br />
password "" ## Mettre ici un vrai mot de passe.<br />
folder 'INBOX.sdf' ## Recupère spécifiquement un dossier IMAP<br />
folder 'INBOX.task'<br />
folder 'INBOX.sysadmin'<br />
folder 'INBOX.netavous'<br />
folder 'INBOX.frnog'<br />
folder 'INBOX.TODO'<br />
folder 'INBOX' ## Recupère le dossier imap principal<br />
keep ## Laisse les mails sur le serveur<br />
mda "/usr/libexec/dovecot/deliver" ## Utilise dovecot en tant que deliver local<br />
is 'bragon' here ## Mets les mails dans le répertoire courant de l'utilisateur bragon.</p>
<p></code></p>
<h3> Filtrer / Découper  les ingrédients Juste avant la casserole </h3>
<p><code><br />
emerge -av =net-mail/dovecot-1.2.6<br />
</code><br />
ou<br />
<code><br />
apt-get install dovecot  # Je crois que de base dans Debian dovecot est compilé avec sieve.<br />
</code></p>
<p>* Flag de compilation nécéssaire pour dovecot : &#8220;berkdb bzip2 ipv6 maildir managesieve mysql pam sieve ssl zlib -caps -cydir -dbox -doc -kerberos -ldap -mbox -postgres -sqlite -suid -vpopmail&#8221;</p>
<p>Via ces directives de compilation dovecot supporte maintenant les fichiers de filtrage &#8220;.sieve&#8221;<br />
Il vous suffit de déposer n&#8217;importe quel fichier sieve dans /home/utilisateur/sieve pour que dovecot utilise vos filtres.</p>
<p>Voici un exemple de syntaxe :  tamereenshortsurunCISCO7603.sieve</p>
<p><code><br />
# rule:[cron]<br />
elsif anyof (header :contains "Subject" "root@gn",<br />
        header :contains "From" "root@astaroth",<br />
        header :contains "From" "bragon@tobold",<br />
        header :contains "From" "root@aec-ri.com",<br />
        header :contains "From" "root@mail.geekmx.org",<br />
        header :contains "From" "root@bender")<br />
{<br />
        fileinto "cron";<br />
}<br />
</code></p>
<p>Second exemple de syntaxe : tonpapaesttellementvieuxque&#8230;.sieve</p>
<p><code><br />
# rule:[SYSADMIN ML]<br />
elsif anyof (header :contains "From" "sysadmin@domaine.net",<br />
        header :contains "Subject" "Liste Franophone Administrateur systeme")<br />
{<br />
        fileinto "boulot.sysadmin";<br />
        redirect "smartphone[at]bragon[point]info"; ## Mettre ici une adresse mail valide<br />
}<br />
# rule:[Debian Security Advertise]<br />
elsif anyof (header :contains "Subject" "[SECURITY][DSA")<br />
{<br />
        fileinto "boulot.dsa";<br />
}<br />
</code></p>
<h3> Virer les ingrédients moisis en les mettant dans un compartiment de la casserole </h3>
<p><code><br />
emerge -av =mail-filter/spamassassin-3.2.5-r2<br />
</code></p>
<p>* Flag de compilation nécessaire pour spamassassin : "berkdb ipv6 mysql ssl -doc -ldap -postgres -qmail -sqlite -tools"</p>
<p>* Voir les configurations de spamd ci-après.</p>
<h3> Renvoyer certains ingrédients au cuisinier </h3>
<p><code><br />
emerge -av =mail-mta/postfix-2.6.5<br />
</code></p>
<p>* Flag de compilation nécessaire pour postfix : "dovecot-sasl ipv6 mysql pam ssl -cdb -hardened -ldap -mbox -nis -postgres -sasl (-selinux) -vda"</p>
<p>* Voir le fichier de configuration main.cf ci-après.</p>
<p>Le postfix me sert uniquement pour transférer certaines régles sieve vers une autre adresse mail.<br />
Cette adresse mail est popé via mon smartphone.<br />
Ainsi je reçois <strong> N'importe ou </strong> Certains mails qui "matchent" une régle de filtrage spécifique !</p>
<p>Le postfix peut me servir également à faire réply dans l'interface roundcube ou mutt . (mais je l'utilise rarement car ce postfix n'a ni domainkeys ni spf pour mes domaines pro / geeknode / gmail) Et le mail bien que délivré arrivera dans la boite à spam du correspondant fréquemment.</p>
<p>Ce postfix n'est là que pour dépanner, et pour transférer mes mails super important via mon smartphone.</p>
<h3> Faire mijoter à feu doux ! </h3>
<p>Placer ce crontab pour l'utilisateur qui va devoir récupérer les mails.</p>
<p><code><br />
crontab -e<br />
*/10 * * * * /usr/bin/fetchmail > /dev/null 2>&#038;1<br />
</code></p>
<p>Les mails vont donc être récupérés toutes les dix minutes, et directement déposés dans le MDA ( Mail Délivery Agent).<br />
Le MDA de ma configuration fetchmail étant dovecot, et dovecot lisant tous mes filtres, cela devrait bien se passer <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><!--nextpage--><!--pagetitle:Exemple de présentation--></p>
<h3> Présentation sur un joli plat du résultat. </h3>

<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/mailfilter_indesirable/' title='MailFilter_Indésirable'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/MailFilter_Indésirable-150x150.png" class="attachment-thumbnail" alt="MailFilter_Indésirable" title="MailFilter_Indésirable" /></a>
<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/spam_roundcube/' title='Spam_Roundcube'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/Spam_Roundcube-150x150.png" class="attachment-thumbnail" alt="Spam_Roundcube" title="Spam_Roundcube" /></a>
<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/ultimate_mailfilter_roundcube-3/' title='Ultimate_Mailfilter_Roundcube'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/Ultimate_Mailfilter_Roundcube2-150x150.png" class="attachment-thumbnail" alt="Ultimate_Mailfilter_Roundcube" title="Ultimate_Mailfilter_Roundcube" /></a>
<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/filtre_roundcube/' title='Filtre_Roundcube'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/Filtre_Roundcube-150x150.png" class="attachment-thumbnail" alt="Filtre_Roundcube" title="Filtre_Roundcube" /></a>
<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/casserole3/' title='casserole3'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/casserole3-150x150.jpg" class="attachment-thumbnail" alt="casserole3" title="casserole3" /></a>
<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/mutt-screenshot/' title='mutt-screenshot'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/mutt-screenshot-150x150.png" class="attachment-thumbnail" alt="mutt-screenshot" title="mutt-screenshot" /></a>
<a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/filtermail-2/' title='filtermail'><img width="150" height="150" src="http://geekfault.org/wp-content/uploads/2010/04/filtermail1-150x150.jpg" class="attachment-thumbnail" alt="filtermail" title="filtermail" /></a>

<p><!--nextpage--><!--pagetitle:Finition et garnitures--></p>
<h3> La configuration de dovecot aka "Le déversoir"</h3>
<p><code><br />
base_dir = /var/run/dovecot/<br />
protocols = imap managesieve ## Je suppose que vous n'avez pas besoin de pop pour votre interface centralisé.<br />
shutdown_clients = yes<br />
disable_plaintext_auth = no<br />
ssl = no       ## ce howto ne couvre pas la sécurité de l'imap</p>
<p># Si vous désirez utiliser seulement TLS<br />
## Pour le moment ce HowTo n'a pas été pensé pour le SSL, mais on peut très facilement l'ajouter.<br />
## disable_plaintext_auth = yes<br />
## ssl = yes<br />
## ssl_cert_file = /var/qmail/control/servercert.pem<br />
## ssl_key_file = /var/qmail/control/servercert.pem</p>
<p>login_dir = /var/run/dovecot/login<br />
login_process_per_connection = yes<br />
login_greeting = Imap ready.<br />
mail_debug = no<br />
mail_uid = 1000<br />
mail_gid = 100<br />
first_valid_uid = 1000 ### Premier utilisateur système<br />
last_valid_uid = 1001 ### Vous pouvez mettre en place cet imap pour plus de deux utilisateurs en augmentant cette directive.<br />
first_valid_gid = 100<br />
last_valid_gid = 1000<br />
mail_location = maildir:~/.maildir ### Expliqué dans le postulat de l'introduction</p>
<p>## on active le deliver local</p>
<p>protocol lda {<br />
  postmaster_address = bragon[at_at_at]bragon[dot_point_dot]info ### Mettre ici une adresse mail valide !!!<br />
  # remember to give proper permissions for these files as well<br />
  log_path = /var/log/dovecot-deliver-errors.log<br />
  info_log_path = /var/log/dovecot-deliver.log<br />
  #auth_socket_path = /var/run/dovecot/auth-master<br />
mail_plugins = sieve<br />
}</p>
<p>## On log correctement<br />
##<br />
## Logging<br />
##<br />
# Log file to use for error messages, instead of sending them to syslog.<br />
# /dev/stderr can be used to log into stderr.<br />
log_path = /var/log/dovecot/error</p>
<p># Log file to use for informational and debug messages.<br />
# Default is the same as log_path.<br />
info_log_path = /var/log/dovecot/info</p>
<p>protocol imap {<br />
         listen = 81.93.247.***:143 ### Mettre l'ip de la machine ici<br />
        login_executable = /usr/libexec/dovecot/imap-login<br />
        mail_max_userip_connections = 10<br />
        mail_plugin_dir = /usr/lib/dovecot/imap<br />
        mail_plugins = quota imap_quota<br />
}</p>
<p>plugin {<br />
        quota = maildir:User quota<br />
          # Used by both the Sieve plugin and the ManageSieve protocol<br />
          sieve=~/.dovecot.sieve ## Répertoire ou serons stockés les regles de filtrage de dovecot.<br />
          sieve_dir=~/sieve         ## Répertoire ou serons stockés les regles de filtrage de l'utilisateur  (elles sont lu par dovecot)        </p>
<p>}</p>
<p>protocol managesieve {<br />
  # Specify an alternative address:port the daemon must listen on<br />
  # (default: *:2000)<br />
listen = 81.93.247.***:2000 ## ip de votre box à mettre ici</p>
<p>  managesieve_logout_format = bytes ( in=%i : out=%o )<br />
}</p>
<p>plugin {<br />
  # Used by both the Sieve plugin and the ManageSieve protocol<br />
  sieve=~/.dovecot.sieve<br />
  sieve_dir=~/sieve<br />
}</p>
<p>auth_verbose = yes<br />
auth_debug = yes</p>
<p>auth default {                  ### On se log ici directement à la base d'utilisateur unix du système courant.<br />
        mechanisms = plain login</p>
<p>passdb pam { args = "*"<br />
}</p>
<p>userdb passwd { args = blocking=yes </p>
<p>}</p>
<p>}</p>
<p></code></p>
<h3> Configuration de .muttrc aka le rouleau à patisserie </h3>
<p>Placer ce fichier .muttrc à la racine du répertoire utilisateur : </p>
<p><code></p>
<p>### pour voir les sous dossiers</p>
<p>set spoolfile="/home/bragon/.maildir/"<br />
set folder="/home/bragon/.maildir/"<br />
set mask="!^\\.[^.]"<br />
set record="+.Sent"<br />
set postponed="+.Drafts"</p>
<p>mailboxes ! + `\<br />
for file in /home/bragon/.maildir/.*; do \<br />
  box=$(basename "$file"); \<br />
  if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \<br />
      -a ! "$box" = '.subscriptions' ]; then \<br />
    echo -n "\"+$box\" "; \<br />
  fi; \<br />
done`</p>
<p>### activer la sidebar de mutt<br />
macro index c "<change-folder>?<toggle-mailboxes>" "open a different folder"<br />
macro pager c "<change-folder>?<toggle-mailboxes>" "open a different folder"</p>
<p># Sidebar<br />
set sidebar_visible=yes<br />
set sidebar_width=50<br />
color sidebar_new yellow default</p>
<p># ctrl-n, ctrl-p to select next, prev folder<br />
# ctrl-o to open selected folder<br />
bind index \Cp sidebar-prev<br />
bind index \Cn sidebar-next<br />
bind index \Cb sidebar-open<br />
bind pager \Cp sidebar-prev<br />
bind pager \Cn sidebar-next<br />
bind pager \Cb sidebar-open</p>
<p>## mon editeur est emacs et je t'emmerde !!!<br />
set editor="emacs -nw"</p>
<p></code></p>
<h3> Configuration de postfix aka "Le renvoyeur" </h3>
<p><code><br />
queue_directory = /var/spool/postfix<br />
command_directory = /usr/sbin<br />
daemon_directory = //usr/lib/postfix<br />
data_directory = /var/lib/postfix<br />
mail_owner = postfix<br />
myhostname = tobold.mondomaine.info<br />
mydomain = tobold.mondomaine.info<br />
myorigin = $myhostname</p>
<p>unknown_local_recipient_reject_code = 550</p>
<p>debug_peer_level = 2</p>
<p>debugger_command =<br />
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin<br />
         ddd $daemon_directory/$process_name $process_id &#038; sleep 5</p>
<p>sendmail_path = /usr/sbin/sendmail</p>
<p>newaliases_path = /usr/bin/newaliases</p>
<p>mailq_path = /usr/bin/mailq</p>
<p>setgid_group = postdrop</p>
<p>html_directory = /usr/share/doc/postfix-2.6.5/html</p>
<p>manpage_directory = /usr/share/man</p>
<p>sample_directory = /etc/postfix</p>
<p>readme_directory = /usr/share/doc/postfix-2.6.5/readme<br />
home_mailbox = .maildir/</p>
<p></code></p>
<h3> Configuration SpamAssassin/MySQL </h3>
<p>* Afin de générer un bon local.cf utilisez : <a href="http://www.yrex.com/spam/spamconfig.php">http://www.yrex.com/spam/spamconfig.php</a></p>
<p>* Insérer dans une base MySQL<br />
<code><br />
CREATE TABLE userpref (<br />
username varchar(100) NOT NULL default '',<br />
preference varchar(50) NOT NULL default '',<br />
value varchar(100) NOT NULL default '',<br />
prefid int(11) NOT NULL auto_increment,<br />
PRIMARY KEY (prefid),<br />
KEY username (username)<br />
);<br />
  CREATE TABLE bayes_expire (<br />
          id                    int(11)         NOT NULL default '0',<br />
          runtime               int(11)         NOT NULL default '0',<br />
          KEY bayes_expire_idx1 (id)<br />
          ) TYPE=MyISAM;</p>
<p>      CREATE TABLE bayes_global_vars (<br />
          variable              varchar(30)     NOT NULL default '',<br />
          value                 varchar(200)    NOT NULL default '',<br />
          PRIMARY KEY           (variable)<br />
          ) TYPE=MyISAM;</p>
<p>      INSERT INTO bayes_global_vars VALUES ('VERSION','3');</p>
<p>      CREATE TABLE bayes_seen (<br />
          id                    int(11)         NOT NULL default '0',<br />
          msgid                 varchar(200) binary NOT NULL default '',<br />
          flag                  char(1)         NOT NULL default '',<br />
          PRIMARY KEY           (id,msgid)<br />
          ) TYPE=MyISAM;</p>
<p>      CREATE TABLE bayes_token (<br />
          id                    int(11)         NOT NULL default '0',<br />
          token                 char(5)         NOT NULL default '',<br />
          spam_count            int(11)         NOT NULL default '0',<br />
          ham_count             int(11)         NOT NULL default '0',<br />
          atime                 int(11)         NOT NULL default '0',<br />
          PRIMARY KEY           (id, token),<br />
          INDEX (id, atime)<br />
          ) TYPE=MyISAM;</p>
<p>      CREATE TABLE bayes_vars (<br />
          id                    int(11)         NOT NULL AUTO_INCREMENT,<br />
          username              varchar(200)    NOT NULL default '',<br />
          spam_count            int(11)         NOT NULL default '0',<br />
          ham_count             int(11)         NOT NULL default '0',<br />
          token_count           int(11)         NOT NULL default '0',<br />
          last_expire           int(11)         NOT NULL default '0',<br />
          last_atime_delta      int(11)         NOT NULL default '0',<br />
          last_expire_reduce    int(11)         NOT NULL default '0',<br />
          oldest_token_age      int(11)         NOT NULL default '2147483647',<br />
          newest_token_age      int(11)         NOT NULL default '0',<br />
          PRIMARY KEY           (id),<br />
          UNIQUE bayes_vars_idx1 (username)<br />
          ) TYPE=MyISAM;</p>
<p>      CREATE TABLE awl (<br />
          username              varchar(100)    NOT NULL default '',<br />
          email                 varchar(200)    NOT NULL default '',<br />
          ip                    varchar(10)     NOT NULL default '',<br />
          count                 int(11)         default '0',<br />
          totscore              float           default '0',<br />
          PRIMARY KEY           (username,email,ip)<br />
          ) TYPE=MyISAM;</p>
<p></code></p>
<p>* secret.cf</p>
<p><code></p>
<p>##(Tell Spamassassin to use MySQL for bayes data<br />
bayes_store_module              Mail::SpamAssassin::BayesStore::SQL<br />
bayes_sql_dsn                   DBI:mysql:sa:localhost:3306<br />
bayes_sql_username              sa<br />
bayes_sql_password              somepwd</p>
<p>##(Tell Spamassassin to use MySQL for AWL data<br />
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList<br />
user_awl_dsn                    DBI:mysql:sa:localhost:3306<br />
user_awl_sql_username           sa<br />
user_awl_sql_password           somepwd</p>
<p></code></p>
<p>* local.cf</p>
<p><code><br />
# SpamAssassin config file for version 3.x<br />
# NOTE: NOT COMPATIBLE WITH VERSIONS 2.5 or 2.6<br />
# See http://www.yrex.com/spam/spamconfig25.php for earlier versions<br />
# Generated by http://www.yrex.com/spam/spamconfig.php (version 1.50)</p>
<p># How many hits before a message is considered spam.<br />
required_score           5.0</p>
<p># Change the subject of suspected spam<br />
rewrite_header subject         [SPAM]</p>
<p># Encapsulate spam in an attachment (0=no, 1=yes, 2=safe)<br />
report_safe             1</p>
<p># Enable the Bayes system<br />
use_bayes               1</p>
<p># Enable Bayes auto-learning<br />
bayes_auto_learn              1</p>
<p># Enable or disable network checks<br />
skip_rbl_checks         0<br />
use_razor2              1<br />
#use_dcc                 1<br />
use_pyzor               1</p>
<p># Mail using languages used in these country codes will not be marked<br />
# as being possibly spam in a foreign language.<br />
# - english french<br />
#ok_languages            en fr </p>
<p># Mail using locales used in these country codes will not be marked<br />
# as being possibly spam in a foreign language.<br />
#ok_locales              en fr<br />
</code></p>
<h3> Ajouter les clous de girofles dans RoundCube </h3>
<p><a href="http://www.tehinterweb.co.uk/roundcube/#pisieverules">http://www.tehinterweb.co.uk/roundcube/#pisieverules</a></p>
<p>Il vous faut installer les plugins ManageSieve et ReportasJunk<br />
Suivez la documentation officielle, elle s'en sortira mieux que moi afin de vous expliquer tout cela.</p>
<ul>
<li><a href=http://www.tehinterweb.co.uk/roundcube/plugins/sieverules.README.txt>http://www.tehinterweb.co.uk/roundcube/plugins/sieverules.README.txt</a></li>
<li><a href=http://www.tehinterweb.co.uk/roundcube/plugins/sauserprefs.README.txt>http://www.tehinterweb.co.uk/roundcube/plugins/sauserprefs.README.txt</a></li>
<li><a href=http://www.tehinterweb.co.uk/roundcube/plugins/markasjunk2.README.txt>http://www.tehinterweb.co.uk/roundcube/plugins/markasjunk2.README.txt</a></li>
</ul>
<h3> Laissez refroidir </h3>
<p><strong>Voilà c'est prêt  !</strong></p>
<p>Awesome non ?</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/04/09/maildir-mbox-la-migration/' rel='bookmark' title='Maildir mbox &#8211; La migration'>Maildir mbox &#8211; La migration</a></li>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Maildir mbox &#8211; La migration</title>
		<link>http://geekfault.org/2010/04/09/maildir-mbox-la-migration/</link>
		<comments>http://geekfault.org/2010/04/09/maildir-mbox-la-migration/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 17:16:18 +0000</pubDate>
		<dc:creator>pistache</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[maildir]]></category>
		<category><![CDATA[mbox]]></category>
		<category><![CDATA[pam_mail.so]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2754</guid>
		<description><![CDATA[Traditionellement, les serveurs UNIX utilisent mbox pour stocker les mails. Pour mbox, chaque dossier de votre boîte mail (Reçu, Envoyés, Archive, Corbeille, etc) est representé par un fichier, ou tout les mails sont enregistrés à la suite, séparés par une ligne vide. Ce format, très simple à utiliser, pose de nombreux problèmes. Premièrement, on ne [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
<li><a href='http://geekfault.org/2009/05/19/migration-de-geekfault/' rel='bookmark' title='Migration de Geekfault'>Migration de Geekfault</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/wp-content/uploads/2010/04/illustration-maildir.jpg" title="illustration-maildir" rel="lightbox.2754"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/04/illustration-maildir-300x270.jpg" alt="" title="illustration-maildir" width="300" height="270" class="alignleft size-medium wp-image-3040" /></a>
<p>Traditionellement, les serveurs UNIX utilisent <a href="http://fr.wikipedia.org/wiki/Mbox">mbox</a> pour stocker les mails. Pour mbox, chaque dossier de votre boîte mail (Reçu, Envoyés, Archive, Corbeille, etc) est representé par un fichier, ou tout les mails sont enregistrés à la suite, séparés par une ligne vide.</p>
</p>
<p>Ce format, très simple à utiliser, pose de nombreux problèmes. Premièrement, on ne peut pas faire d&#8217;accès parallèles, même sur des mails différents, puisque le fichier est le même (problème de verrou). Deuxièment, les serveurs POP/IMAP (comme Dovecot) ont souvent un support limité de mbox. Dovecot est obligé de placer un mail &#8220;interne&#8221; dans la boîte, pour garder l&#8217;arborescence et l&#8217;organisation des dossiers. Courier ne supporte pas mbox.</p>
<p>L&#8217;avantage principal de mbox, c&#8217;est le fait qu&#8217;il soit très répandu. Il est supporté par tout les MUA (mailutils/mail, bsd-mailx, mutt, emacs, Kmail, thunderbird, evolution). Mais les problèmes récurrents qu&#8217;il pose ont poussé <a href="http://en.wikipedia.org/wiki/Daniel_J._Bernstein">le principal développeur de qmail</a> a créer un nouveau format : <a href="http://fr.wikipedia.org/wiki/Maildir">Maildir</a>.</p>
<p><!--more--></p>
<h3>Maildir</h3>
<p>Avec Maildir, chaque mail est <b>un</b> fichier, et chaque dossier de la boîte mail, un répertoire. Attention, c&#8217;est un peu plus compliqué que ça. Les mails ne sont pas directement enregistrés dans <b>boîte/mail</b> :</p>
<ul>
<li>Le <a href="http://fr.wikipedia.org/wiki/Mail_Delivery_Agent">MDA</a> enregistre le mail dans <b>boîte/tmp/unique</b> (&#8220;unique&#8221; est un nom de fichier unique généré a partir de données pseudo-aléatoires)</li>
<li>Une fois que le mail est écrit, le MDA le déplace dans <b>boîte/new/unique</b></li>
<li>Le <a href="http://fr.wikipedia.org/wiki/Mail_User_Agent">MUA</a> le déplace dans <b>boîte/cur/unique</b> une fois qu&#8217;il voit qu&#8217;un nouveau message est arrivé dans <b>boîte/new/</b></li>
</ul>
<p><b>Pourquoi ? </b>Ce comportement est utilisé pour éviter que le MUA voit un mail incomplet (car le MDA est encore en train de l&#8217;écrire), ce qui peut arriver si la machine est surchargée, si le Maildir est sur un serveur distant (NFS,FTP), voire même si le mail est gigantesque.</p>
<h3>Maildir et procmail</h3>
<p>Le but de cet article n&#8217;est pas d&#8217;expliquer comment configurer un MDA pour qu&#8217;il enregistre les mails en Maildir,  mais malgré tout je fais une petite encartade pour les gens qui utilisent procmail. Le code suivant dans /etc/procmailrc permet de dire à procmail de mettre <b>par défaut</b> (cela peut donc être supplanté par une directive contraire dans le ~/.procmailrc) :<br />
<code>DEFAULT=$HOME/Maildir/</code><br />
Aussi, si vous n&#8217;utilisez pas encore procmail je vous conseille d&#8217;y migrer rapidement :</p>
<ul>
<li>Plus besoin de toucher à la configuration du MTA pour changer les méthodes de livraison des mails</li>
<li>Les utilisateurs peuvent écrire leurs propres règles pour leurs boîtes mails (pour avoir des boîtes séparées pour certains mails, par exemple)</li>
<li>Si vous changez de MTA vous pouvez toujours garder la même configuration, à condition de dire à votre MTA d&#8217;utiliser procmail</li>
</ul>
<h3>Configuration de mutt</h3>
<p>mutt gère très bien les Maildirs, mais il faut le configurer. Dans le .muttrc, rajoutez :<br />
<code><br />
# pour dire à mutt de que mbox est un Maildir<br />
set mbox_type=Maildir<br />
# pour dire à mutt que les chemins relatifs (avec +) sont dans "~/Maildir/"<br />
set folder="~/Maildir/"<br />
# pour dire à mutt que les mails arrivent dans Maildir/<br />
set spoolfile="~/Maildir/"<br />
# les mails archivés (pas nouveau) seront envoyés dans +Mailbox<br />
# (+ est remplacé par la variable folder).<br />
set mbox="+Mailbox"</p>
<p># remplacez par votre propre choix (ce n'est pas un tutorial de la configuration de mutt)<br />
# on indique à mutt d'envoyer les mails de ~/Maildir/ dans la boîte indiquée par la variable "mbox"<br />
set move="ask-yes"</p>
<p># ce code montre la puissance de mutt (inclure des scripts shell dans sa configuration)<br />
# ouvrir tous les dossiers qu'il trouve dans ~/Maildir/<br />
mailboxes ! + `\<br />
for file in ~/Maildir/.*; do \<br />
  box=$(basename "$file"); \<br />
  if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \<br />
      -a ! "$box" = '.subscriptions' ]; then \<br />
    echo -n "\"+$box\" "; \<br />
  fi; \<br />
done`<br />
</code><br />
On note qu&#8217;il faut créer les boîtes mails dans ~/Maildir/, ainsi que le Maildir en lui-même (même si procmail peut le créer tout seul, et que si vous avez converti vos mbox il existe déjà). On va créer la boîtes &#8220;Mailbox&#8221; (utilisé par mutt avec <i>set mbox=&#8221;+Mailbox&#8221;</i>).<br />
<code><br />
cd # on se place dans $HOME<br />
mkdir Maildir # on crée Maildir (ça sera peut-être déjà fait)<br />
cd Maildir<br />
mkdir cur new tmp # on crée une arborescence Maildir<br />
mkdir .Mailbox # on crée une nouvelle boite<br />
cd .Mailbox<br />
mkdir cur new tmp<br />
</code><br />
On note que :</p>
<ul>
<li>La boîte principale, ou les mails entrants sont enregistrés par le MDA, est à la racine du Maildir</li>
<li>Les sous-dossiers de la boîte, <b>commencent tous par un .</b></li>
</ul>
<p>Vous pouvez maintenant démarrer mutt, et exploiter votre mbox (pour naviguer dans les boîtes, utilisez &#8220;y&#8221;)
</p>
<h3>Migrer des boîtes mbox en Maildir</h3>
<p>Pour migrer les mbox en Maildir, le script <a href="http://perfectmaildir.home-dn.net/">perfect_maildir.pl</a> est parfait, et son usage est simple :<br />
<code>./perfect_maildir.pl path_to_Maildir/ < mbox</code></p>
<h3>pam_mail.so et You have new mail</h3>
<p>Vous avez peut-être déjà remarqué que quand vous vous ouvrez un shell, vous avez un beau message "You have new mail" qui indique de nouveaux mail dans /var/mail/$USER. Cet avertissement est geré par pam_mail.so, un module de PAM qui permet de faire ça. Si on utilise Maildir il est intéressant de dire à pam_mail.so d'aller vérifier les nouveaux mails dans le Maildir. Cette configuration se fait dans <b>/etc/pam.d/</b> sous Debian et Gentoo. Tout d'abord éditer le fichier <b>login</b>, et trouver cette ligne :<br />
<code><br />
session    optional   pam_mail.so standard<br />
</code><br />
Remplacer par :<br />
<code><br />
session optional pam_mail.so standard dir=~/Maildir<br />
</code><br />
Je recommande d'effectuer aussi la manipulation pour le fichier "ssh".</p>
<p>Normalement PAM devra modifier la variable d'environnement MAIL à Maildir/, si par hasard ce comportement ne marche pas (en fonction de la configuration de PAM) il y a toujours moyen d'ajouter<br />
<code>MAIL=Maildir/</code><br />
dans /etc/environment.</p>
<h3>Faire fonctionner la commande "mail"</h3>
<p>La commande mail est le moyen le plus simple de lire ses mails sous unix. Vous constaterez probablement que votre commande mail ne marche plus (même avec MAIL=Maildir/), car elle ne supporte pas Maildir. Mais il y a plusieurs versions de cette commande, la plus répandue étant celle de bsd (bsd-mailx avec Debian). Je vous conseille d'installer <a href="http://heirloom.sourceforge.net/mailx.html">une autre version</a>, appellée "heirloom-mailx" (sous Debian), voire "nail", qui supporte très bien les Maildir.<br />
<img src="http://pistaches.net/~pistache/stuff/maildir.png"/></p>
<h3>Liens relatifs</h3>
<ul>
<li><a href="http://wiki.dovecot.org/MailLocation/Maildir">Configurer Maildir et Dovecot</a></li>
<li><a href="http://linux.die.net/man/8/pam_mail">man pam_mail</a></li>
<li><a href="http://cr.yp.to/proto/maildir.html">la première spécification de Maildir</a> (a changé depuis)</li>
</ul>
<p>Ironiquement j'ai trouvé beaucoup de mes renseignements sur <a href="http://bugs.debian.org/">bugs.debian.org</a> :</p>
<ul>
<li><a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421010">libpam-modules: pam_mail doesn't set MAIL enviroment variable when .hushlogin exists.</a></li>
<li><a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=109279">login.defs: QMAIL_DIR problems</a></li>
</ul>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
<li><a href='http://geekfault.org/2009/05/19/migration-de-geekfault/' rel='bookmark' title='Migration de Geekfault'>Migration de Geekfault</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/04/09/maildir-mbox-la-migration/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>L&#8217;email : un vilain petit cafardeur !</title>
		<link>http://geekfault.org/2010/03/13/lemail-un-vilain-petit-cafardeur/</link>
		<comments>http://geekfault.org/2010/03/13/lemail-un-vilain-petit-cafardeur/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 18:49:26 +0000</pubDate>
		<dc:creator>ckg</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[mta]]></category>
		<category><![CDATA[mua]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[sendmail]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2436</guid>
		<description><![CDATA[Votre architecture réseau ne regarde pas vos correspondants, cependant vous avez donné aux plus curieux d’entre eux quelques bribes d’information à votre insu : ip interne, dns interne, chaîne de mta…

Nous allons voir un exemple récent, déterminer quels logiciels font les pies et finir par quelques réglages de ces derniers.
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/' rel='bookmark' title='DenyHosts pour empêcher le bruteforce sur SSH'>DenyHosts pour empêcher le bruteforce sur SSH</a></li>
<li><a href='http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/' rel='bookmark' title='nginx et python &#8211; le perfect setup'>nginx et python &#8211; le perfect setup</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:Introduction et lecture des headers d'un email--><br />
<a href="http://geekfault.org/wp-content/uploads/2010/03/geekfault-art01.png" title="geekfault-art01" rel="lightbox.2436"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/03/geekfault-art01.png" alt="geekfault inspectant un email" title="geekfault-art01" width="128" height="128" class="alignleft size-full wp-image-2473" /></a>Votre architecture réseau ne regarde pas vos correspondants, cependant vous avez donné aux plus curieux d&#8217;entre eux quelques bribes d&#8217;information à votre insu : ip interne, <abbr title="Domain Name Server">dns</abbr> interne, chaîne de <abbr title="Mail Transfert Agent">mta</abbr>&#8230;</p>
<p>Nous allons voir un exemple récent, déterminer quels logiciels font les pies et finir par quelques réglages de ces derniers.<br />
<!--more--></p>
<h3></h3>
<p>Quelques définitions rapides :</p>
<ul>
<li>MUA : Mail User Agent, c&#8217;est l&#8217;agent coté utilisateur. Thunderbird que j&#8217;évoque dans cet article, Evolution, KMail, mutt, mail et sendEmail sont quelques exemples.</li>
<li>MTA : Mail Transfer Agent, le serveur smtp. Sendmail que j&#8217;évoque dans cet article, postfix, qmail, exim sont les plus connus, mais ssmtp et OpenSMTPd sont des alternatives montant en puissance.</li>
<li>MDA : Mail Delivery Agent, c&#8217;est le logiciel qui remet les emails dans les comptes utilisateurs. Procmail est le plus connu.</li>
<li>RFC : Request For Comment, un texte de référence. Le texte nous intéressant ici est la RFC 5321 <a href="http://tools.ietf.org/html/rfc5321">http://tools.ietf.org/html/rfc5321</a></li>
</ul>
<h3></h3>
<h1>Cas concret</h1>
<p></br><br />
Décortiquons ensemble un email envoyé par un de mes fournisseurs. Il n&#8217;y a rien d&#8217;exceptionnel dans cette section qui n&#8217;ait déjà été maintes fois abordé dans la presse informatique vulgarisée.</p>
<h4>L&#8217;email en question</h4>
<p><code>From - Mon Jan 18 17:07:56 2010<br />
(…)<br />
Return-Path: <monsieur@correspondant.fr><br />
Received: from smtp20.msg.oleane.net (smtp20.mail.priv [172.17.20.138])<br />
        by mail03.msg.oleane.net with LMTP id H7q6321w;<br />
        Mon, 18 Jan 2010 17:07:52 +0100<br />
Received: from smtp20.msg.oleane.net (localhost [127.0.0.1])<br />
        by smtp20.msg.oleane.net (MX-ASAV) with ESMTP id o0IG7pk9022097;<br />
        Mon, 18 Jan 2010 17:07:51 +0100<br />
Received: from abc.correspondant.com (abc.correspondant.com [81.211.11.111])<br />
        by smtp20.msg.oleane.net (MX) with ESMTP id o0IG7ndC021964;<br />
        Mon, 18 Jan 2010 17:07:49 +0100<br />
Received: from PC1.correspondant.fr ([192.168.69.50])<br />
        (authenticated user monsieur@correspondant.fr)<br />
        by abc.correspondant.com (Kerio MailServer 6.7.0 patch 1);<br />
        Mon, 18 Jan 2010 17:10:15 +0100<br />
Subject: RE: GeekFault<br />
Date: Mon, 18 Jan 2010 17:07:48 +0100<br />
Message-ID: <xxxx@correspondant.fr><br />
In-Reply-To: <xxxxdestinataire.fr><br />
From: "Monsieur CORRESPONDANT" <monsieur@correspondant.fr><br />
Sender: "Monsieur CORRESPONDANT" <monsieur@correspondant.fr><br />
To: "Monsieur DESTINATAIRE" <monsieur@destinataire.fr><br />
Importance: Normal<br />
X-Priority: 3<br />
X-MSMail-Priority: Normal<br />
User-Agent: Kerio Outlook Connector (6.7.0.7695)<br />
MIME-Version: 1.0<br />
X-MimeOLE: Produced by Kerio Outlook Connector (6.7.0.7695)<br />
Content-Type: multipart/mixed; boundary=MIXED-MIME-355913937-24773-delim<br />
X-Spam-Flag: NO<br />
X-PMX-Spam: Probability=13%<br />
X-Spam-Level: X<br />
X-PFSI-Info: PMX 5.5.5.374460, Antispam-Engine: 2.7.1.369594, Antispam-Data: 2010.1.18.155416 (no virus found)</code></p>
<h3>Comment le lire ?</h3>
<p>La <a href="http://tools.ietf.org/html/rfc5321#section-4.4">RFC 5321 section 4.4</a> précise que le Mail Transfert Agent (mta) se DOIT, et avant toutes autres opérations de transfert, d&#8217;inclure une trace « Received » ou « timestamp ». L&#8217;ordre des « Received » se lit donc de bas en haut.</p>
<p>Nous apprenons que notre « correspondant » a émis son email depuis son « PC1 » 192.168.69.50 (IPV4) . On devine aisément son système d&#8217;exploitation, c&#8217;est celui qui donne des noms de machines en majuscules. </p>
<h3>Jouons au jean-kevin</h3>
<p>On déduit du mix « .fr »/ « .com » que notre sujet d&#8217;étude n&#8217;est pas très familier avec les dns et c&#8217;est sans doute la raison pour laquelle il n&#8217;en a pas en interne. Il n&#8217;est pas non plus familier avec <abbr title="Network Time Protocol">ntp</abbr>. Visiblement notre sujet d&#8217;étude n&#8217;est pas familier avec certains services réseaux.</p>
<p>Attardons nous quelques secondes sur le 3ème mta rencontré, OBS utilise un mta du nom de « localhost [127.0.0.1] », nous sommes dans une application minimaliste de la section 4.4 de la RFC 5321. Pourquoi être resté a minima, contrairement aux autres mta ? Le terme MX-ASAV nous donne un indice : AntiSpam AntiVirus &#8230; ce mta est vraisemblablement inaccessible il n&#8217;y a aucune raison de fournir plus de détails.</p>
<h3>Que retenir de cette partie ?</h3>
<p><em>Nous n&#8217;avons donc rien appris de bien intéressant car nous ne cherchons rien de particulier. Détails à priori inintéressants, mais avez-vous vraiment envie d&#8217;en faire profiter le reste de vos correspondants ?</em></p>
<p><!--nextpage--><!--pagetitle:Dompter son MTA--><br />
<a href="http://geekfault.org/wp-content/uploads/2010/03/logosendmail.png" title="sendmail-logo" rel="lightbox.2436"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/03/logosendmail.png" alt="" title="sendmail-logo" width="149" height="82" class="aligncenter size-full wp-image-2482" /></a></p>
<h3></h3>
<h1>Dompter son Mail Transfer Agent (<a href="http://fr.wikipedia.org/wiki/Mail_Transfer_Agent">mta</a>)</h1>
<p></br><br />
Je suis un utilisateur satisfait de sendmail (<a href="www.sendmail.org">www.sendmail.org</a>) depuis quelques années maintenant. Je vais donc vous parler de ce <del>magnifique et ô combien trollifère</del> mta.</p>
<h3>Quel périmètre et que dit la RFC ?</h3>
<p>Comme précisé dans la première partie, notre périmètre d&#8217;action est restreint : du <abbr title="Mail User Agent">(mua)</abbr> jusqu&#8217;au dernier mta sous notre responsabilité.<br />
La RFC précise que pour des raisons de traçabilité un mta ne doit pas procéder à de la destruction de « Received »/« timestamp ». Comprenez qu&#8217;en prenant la responsabilité de couper une partie de la chaîne de réponse vous devez vous engager à garder une trace dans votre système.</p>
<h3></h3>
<h4>Ne modifiez rien si :</h4>
<ul>
<li>Vous n&#8217;avez pas d&#8217;outils de logs fiables</li>
<li>Vous n&#8217;êtes pas sûr de toutes les machines en amont de votre mta</li>
<li>Vous êtes backup-MX</li>
<li>Vous n&#8217;êtes pas sûr de toutes les utilisateurs en amont de votre mta</li>
<li>Vous n&#8217;êtes pas sûr de toutes les logiciels en amont de votre mta</li>
<li>Vous n&#8217;êtes pas sûr de ce que votre mta va supprimer, il serait DOMMAGE de supprimer des informations concernant les mails entrants (ceux venant du Great Ternet)</li>
</ul>
<p>Pesez-bien cette décision, agissez en responsable. Si vous êtes sous <a href="www.freebsd.org">FreeBSD</a> vous pouvez recevoir une synthèse par mail quotidienne et la coupler à un daemon syslog sur une autre machine.</p>
<h3>`hostname`.cf &amp; `hostname`.mc</h3>
<p>Nous allons jeter un oeil dans la configuration de sendmail (`hostname`.cf ) au niveau de la gestion du HEADER. Nous trouvons sans difficulté ceci :<br />
<code>HReceived: $?sfrom $s $.$?_($?s$|from $.$_)<br />
$.$?{auth_type}(authenticated$?{auth_ssf} bits=${auth_ssf}$.)<br />
$.by $j ($v/$Z)$?r with $r$. id $i$?{tls_version}<br />
(version=${tls_version} cipher=${cipher} bits=${cipher_bits} verify=${verify})$.$?u for $u; $|;<br />
$.$b$?g<br />
(envelope-from $g)$.</code></p>
<p>Que nous pouvons réduire à :<br />
<code>HReceived: id $i; $b</code></p>
<p>Modifier `hostname`.cf est généralement une mauvaise idée, sendmail vous propose l&#8217;utilisation de macro m4, autant en profiter. Voici donc la correspondance dans `hostname`.mc<br />
<code>define(`confRECEIVED_HEADER',`id $i; $b')</code></p>
<h3>Comparaisons de configurations</h3>
<p>Commençons par faire un email vide de test :<br />
<code>$ cat mail.txt<br />
helo toi<br />
mail from:<qualite@bidule.ath.cx><br />
rcpt to:<x@machin.ath.cx><br />
data<br />
subject:Ok<br />
ok<br />
.</code><br />
Que nous utilisons comme ceci :<br />
<code>$ nc localhost 25 < mail.txt</code><br />
Avec un sendmail en configuration par défaut, le correspondant reçoit :<br />
<code>Received: by machin.ath.cx  with ESMTP id o2BK1BKu031170; Thu, 11 Mar 2010 21:01:11 +0100<br />
Received: from toi (localhost [127.0.0.1])<br />
        by bidule.ath.cx (8.14.3/8.14.3) with SMTP id o2BK13FB043209<br />
        for <x@machin.ath.cx>; Thu, 11 Mar 2010 21:01:03 +0100 (CET)<br />
        (envelope­ from qualite@bidule.ath.cx)<br />
Date: Thu, 11 Mar 2010 21:01:03 +0100 (CET)<br />
From: Qualite <qualite@bidule.ath.cx><br />
Message­Id: <201003112001.o2BK13FB043209@bidule.ath.cx><br />
</code><br />
Avec le nouveau HReceived nous obtenons :<br />
<code>Return­Path: <qualite@bidule.ath.cx><br />
Received: by machin.ath.cx  with ESMTP id o2BJxVBK031165; Thu, 11 Mar 2010 20:59:31 +0100<br />
Received: id o2BJxOpC042941; Thu, 11 Mar 2010 20:59:24 +0100 (CET)<br />
Date: Thu, 11 Mar 2010 20:59:24 +0100 (CET)<br />
From: Qualite <qualite@bidule.ath.cx><br />
</code></p>
<h3>Que retenir de cette partie ?</h3>
<p><em>Vous conviendrez que notre mta est devenu moins bavard.<br />
Nous avons ici abordé sendmail, mais il existe par exemple postfix qui, dixit <a href="http://geekfault.org/author/bragon/">bragon</a>, "Tout ce que fait sendmail, postfix le fait en mieux". Je pense que vous n'aurez pas de difficulté a porter cette modification dans le conf de postfix, peut-être que <a href="http://geekfault.org/author/LeCoyote/">LeCoyote</a> nous honorera d'un commentaire à ce sujet <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Autre point à noter, il n'a été question QUE de `hostname`.(mc|cf) et pas de `hostname`.submit.(mc|cf) qui n'est en aucune manière concerné par cet article.</em><br />
<!--nextpage--><br />
<!--pagetitle:Dompter son MUA--></p>
<h3></h3>
<h1>Dompter son Mail User Agent (<a href="http://fr.wikipedia.org/wiki/Mail_User_Agent">mua</a>)</h1>
<p></br><br />
Dompter son mta, c'est bien, mais que fait-on lorsque nous n'avons pas la main dessus ?</p>
<h3>Thunderbird</h3>
<p>Mes mails pros sont gérés par <abbr title="Mandarine Business Service">OBS</abbr> et j'utilise comme mua Thunderbird qui a la mauvaise idée de transmettre l'ip ou le hostname lors du HELO (ou EHLO) ce qui donne par exemple ceci :<br />
<code>Received: from [192.168.5.12] (*.fr [217.1.2.3]) (authenticated)<br />
by smtp05.msg.oleane.net (MTA) with ESMTP id o1QB4km3010343<br />
for <x@truc.org> Fri, 26 Feb 2010 12:04:46 +0100</code><br />
Que l'on peut transformer en :<br />
<code>Received: from truc.org (*.fr [217.1.2.3]) (authenticated)<br />
by smtp06.msg.oleane.net (MTA) with ESMTP id o2BGsI5N007702<br />
for <x@truc.org> Thu, 11 Mar 2010 17:54:18 +0100</code><br />
Grâce à la clef de configuration de type string :<br />
<code>mail.smtpserver.smtp1.hello_argument</code><br />
Que vous devrez créer dans le about:config du Thunderbird, et ceci pour tous vos mail.smtpserver bien entendu.</p>
<h3>Que retenir de cette partie ?</h3>
<p><em>Votre mua aussi peut donner des informations à votre insu. C'est inutilement idiot, une ip locale ne peut en aucun cas être une information pertinente pour le mta à l'autre bout de la connexion.</em><br />
<!--nextpage--><br />
<!--pagetitle:Conclusion--></p>
<h3></h3>
<h1>Conclusion</h1>
<p></br><br />
De manière générale les réglages par défaut des applications concernées ne sont pas pertinents sur le point abordé dans ce billet. Il est très important de pouvoir changer comme bon nous semble certains réglages que nous trouvons inappropriés.<br />
Très logiquement, les mua/mta à sources fermées, certains cités de-ci de-là dans l'article, ne sont pas les plus simples à dompter.<br />
Certains réglages ne sont pas prévus par les développeurs initiaux et ne le seront probablement jamais. Utilisons-en d'autres qui nous garantissent la liberté n°1 ! </p>
<h3>Les mauvaises pratiques chez les autres mua/mta populaires</h3>
<p>Ils sont bavards :</p>
<ul>
<li>Mail.app</li>
<li>Entourage</li>
<li>Live Mail</li>
<li>
<li>Yahoo</li>
</ul>
<h3>Les bonnes pratiques chez les autres mua/mta populaires</h3>
<p>Ils sont discrets :</p>
<ul>
<li>Gmail</li>
<li>mutt</li>
<li>Thunderbird en changeant un réglage</ul>
<p><em>Cette liste n'est pas exhaustive, il s'agit des logiciels utilisés ou par moi ou par mes correspondants.</em></p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/' rel='bookmark' title='DenyHosts pour empêcher le bruteforce sur SSH'>DenyHosts pour empêcher le bruteforce sur SSH</a></li>
<li><a href='http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/' rel='bookmark' title='nginx et python &#8211; le perfect setup'>nginx et python &#8211; le perfect setup</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/03/13/lemail-un-vilain-petit-cafardeur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx et python &#8211; le perfect setup</title>
		<link>http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/</link>
		<comments>http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 11:47:32 +0000</pubDate>
		<dc:creator>pistache</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[gunicorn]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[wsgi]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2272</guid>
		<description><![CDATA[Python est devenu assez à la mode, pour le développement web, ces dernières années avec l&#8217;arrivée de frameworks web comme Django, Pylons et web.py. On le voit souvent utilisé sur apache2, avec mod_python, ou sur des serveurs Python dediés à ça (CherryPy, etc) Je cherche depuis longtemps un moyen de faire du Python sur HTTP. [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2011/03/24/devbox-kvmlibvirt-perfect-setup/' rel='bookmark' title='Devbox KVM+Libvirt perfect setup.'>Devbox KVM+Libvirt perfect setup.</a></li>
<li><a href='http://geekfault.org/2010/04/09/maildir-mbox-la-migration/' rel='bookmark' title='Maildir mbox &#8211; La migration'>Maildir mbox &#8211; La migration</a></li>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/nginx_logo/" rel="attachment wp-att-2406"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/03/nginx_logo-300x206.gif" alt="" title="nginx_logo" width="300" height="206" class="alignleft size-medium wp-image-2406" /></a></p>
<p><strong>Python est devenu assez à la mode, pour le développement web, ces dernières années avec l&#8217;arrivée de frameworks web comme </strong><a title="Django" href="http://djangoproject.com/"><strong>Django</strong></a><strong>, </strong><a title="Pylons" href="http://pylonshq.com/"><strong>Pylons</strong></a><strong> et </strong><a title="webpy" href="http://webpy.org"><strong>web.py</strong></a><strong>. On le voit souvent utilisé sur apache2, avec mod_python, ou sur des serveurs Python dediés à ça (CherryPy, etc)</strong></p>
<p>Je cherche depuis longtemps un moyen de faire du Python sur HTTP. J&#8217;ai mis pas mal de temps mais je pense avoir trouvé une configuration sympa.</p>
<p>Je vous propose ici d&#8217;essayer <a title="nginx" href="http://nginx.org/">nginx</a>, un serveur HTTP (entre autres), très performant et  <strong>beaucoup</strong> plus léger/rapide que apache2. Il est très efficace pour faire du reverse-proxy (c&#8217;est à dire être utilisé en frontal/load-balancer devant un serveur HTTP, et lui transmettre les requêtes en faisant du cache et le cas échéant du load-balancing).</p>
<p><!--more--></p>
<p>La configuration de nginx est très simple, et la documentation est très complète : <a href="http://wiki.nginx.org/Main">wiki.nginx.org</a>. L&#8217;installation de nginx est facile, il est inclus dans la plupart des distributions actuelles, donc à vos emerge/apt-get.</p>
<p> <code>apt-get install nginx</code>
<p>nginx ne gère pas le python nativement. Il y a plusieurs solutions cependant :</p>
<ul>
<li>Faire du proxy vers un serveur qui gère le python, comme apache2. On perd la majeure partie de l&#8217;intêret de nginx, cependant.</li>
<li>Faire du FastCGI vers un serveur FastCGI. C&#8217;est la solution la plus fréquente, en utilisant fcgi.py ou <a title="Flup" href="http://trac.saddi.com/flup">flup</a></li>
<li>Faire du WSGI. C&#8217;est un protocole de communication entre serveurs HTTP et applications Python. Solution aussi assez fréquente.</li>
<li>Faire du proxy vers un serveur qui gère le python de manière <strong>native</strong>. C&#8217;est une solution moins fréquente mais très pratique.</li>
</ul>
<p>Avant même de penser à choisir une des solutions ici présentes, il faut les comparer entre elles.</p>
<p><strong><br /> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h4>nginx =&gt; apache2 =&gt; python</h4>
<p>L&#8217;ennui de cette solution c&#8217;est : apache2. Utiliser nginx pour forwarder à apache2 est presque inutile. Presque ? Oui, car on peut dire à nginx de garder les fichiers statiques pour lui. Cependant, le gain de cette méthode est assez minime, et ce n&#8217;est intéressant que pour faire du load balancing sur plusieurs apaches.</p>
<p><strong><br /> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h4>le FastCGI</h4>
<p>FastCGI c&#8217;est une norme, pour faire traiter du contenu dynamique par une application externe. Donc le support du FastCGI tout seul est inutile, il faut aussi quelque chose pour gérer derrière.</p>
<p>J&#8217;ai testé <a href="http://trac.saddi.com/flup">flup</a>, un framework Python léger. Le résultat : ça marche, méééé c&#8217;est lent. Je tournais autour de 35/50 requêtes par seconde, et l&#8217;utilisation en mémoire vive était phénoménale, 150 mégas pour 1000 requêtes. (bien sur ces chiffres n&#8217;auront de valeur que lorsqu&#8217;ils seront comparés aux autres).</p>
<p>FastCGI est sympa pour faire une configuration &#8220;vite&#8221;. C&#8217;est d&#8217;ailleurs la seule solution viable, à ma connaissance pour faire du PHP sur nginx, à part le proxy vers un autre serveur HTTP.</p>
<p>Bref, FastCGI ne m&#8217;a pas convaincu. Et mes tests avec les autres solutions m&#8217;ont donné raison. Toujours avec moi ? On passe au WSGI !</p>
<p><strong><br /> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<h4>le WSGI</h4>
<p> <em>WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that). It is a Python standard, described in detail in PEP 333.</em>
<p>le WSGI, c&#8217;est le standard pour le Web Python. Il n&#8217;y a qu&#8217;à consulter <a title="WSGI" href="http://wsgi.org">wsgi.org</a> pour se rendre compte que c&#8217;est tout un monde. Il consiste en un ensemble de normes (nom de variables, par exemple) pour permettre au serveur d&#8217;exécuter  un fichier codé en Python.</p>
<p>Le standard pour le WSGI sur les serveurs HTTP grand public, c&#8217;est le mod_wsgi de apache2. Il a été porté sur nginx, mais c &#8216;est une #@!## infame, qui ne marche que sur les vieilles versions et qui n&#8217;a pas été mise à jour depuis bientôt 2 ans et demi (cf. <a href="http://hg.mperillo.ath.cx/nginx/mod_wsgi/">hg.mperillo.ath.cx/nginx/mod_wsgi/</a>). J&#8217;ai obtenu des performances d&#8217;environ 133 requêtes par seconde avec, ce qui est déjà mieux que FastCGI, pour ceux qui suivent <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Par contre, dès que j&#8217;ai voulu avancer un peu avec (toucher à la configuration, et surtout, passer à une version supérieure de nginx), j&#8217;ai été confronté à ses limites (et aux #@!## de faute de frappe dans le code source)</p>
<p>D&#8217;autant plus que l&#8217;auteur de mod_wsgi pour apache2 et l&#8217;auteur de mod_wsgi pour nginx reconnaissent ses limitations, respectivement <a href="http://blog.dscpl.com.au/2009/05/blocking-requests-and-nginx-version-of.html">ici</a> et <a href="http://blogg.ingspree.net/blog/2007/11/24/nginx-mod-wsgi-vs-fastcgi/">ici</a>. Le premier document est très intéressant pour comprendre un peu l&#8217;architecture de nginx et ses différences avec apache2. En effet, le mod_wsgi pour nginx a été codé à partir de celui pour apache2, et il subit les différences d&#8217;architecture entre apache2 et nginx.</p>
<p>Attention, je ne remet absolument pas à cause le WSGI ici, juste l&#8217;implémentation de mod_wsgi dans nginx.</p>
<p>Parce que justement, un projet super récent, c&#8217;est&#8230;. uWSGI ! uWSGI sert à combler le manque de support du WSGI dans nginx, en rajoutant un module, meilleur que mod_wsgi. Il nécessite donc de recompiler nginx. Il y a encore une autre solution, nommée gunicorn, qui ne nécessite pas de recompiler nginx. C&#8217;est un serveur HTTP minimal qui gère le WSGI nativement. uwsgi offre plus de fonctionalitées que gunicorn, mais gunicorn a l&#8217;air assez dynamique (dans le développement), et est plus facile à utiliser (pas de recompilation, support de Django natif). Au niveau des performances, je me suis amusé à faire cette comparaison :</p>
<p> </p>
<p><div class="wp-caption alignnone" style="width: 434px"><img title="Comparaison des performances entre uwsgi et gunicorn en fonction du niveau de parallélisme" src="http://pistaches.net/~pistache/stuff/patch1.png" alt="Comparaison des performances entre uwsgi et gunicorn en fonction du niveau de parallélisme" width="424" height="313" /><p class="wp-caption-text">Comparaison des performances entre uwsgi et gunicorn en fonction du niveau de parallélisme</p></div>
<p> </p>
<p>On constate plusieurs choses :</p>
<ul>
<li>Les performances augmentent en utilisant 2 workers à la place d&#8217;un, mais au delà, le gain est ridicule, puis inexistant. Le nombre 2 est dépendant du nombre de coeurs de la machine, et le nombre de workers à utiliser ne sera pas le même sous un bi-socket octocore, bien évidemment. Les meilleures performances étaient obtenues en utilisant gunicorn+3workers.</li>
<li>La différence est vraiment minime, gunicorn est en moyenne légèrement au dessus de uwsgi.</li>
<li>Ces tests sont réalisés sur une application <strong>Django</strong>. Les performances augmentent en utilisant des frameworks plus légers comme <strong>web.py</strong>, bien évidemment.</li>
</ul>
<p>uwsgi dispose de plus de fonctionalitées, comme par exemple une interface d&#8217;administration de serveur wsgi dans Django. Je vais ici expliquer l&#8217;installation et la configuration des deux solutions.</p>
<p>Ici je vais couvrir l&#8217;installation et la configuration de uwsgi et gunicorn avec <strong>Django</strong> et <strong>web.py</strong>, même si c&#8217;est bien sur adaptable avec d&#8217;autres frameworks supportant le <strong>wsgi </strong>(liste sur <a href="http://wsgi.org/wsgi/Frameworks">wsgi.org/wsgi/Frameworks</a>).</p>
<h3>Installation et configuration de <strong>uwsgi</strong></h3>
<p><strong><br /> </strong></p>
<h4>Sous Debian :</h4>
<p>1) Rajouter les dépots source, par exemple :</p>
<p> <code>deb-src http://ftp.gr.debian.org/debian/ squeeze main contrib non-free</code>
<p>2) Télécharger la source</p>
<p> <code>apt-get source nginx<br />
tar -zxvf nginx_*.orig.tar.gz<br />
cd nginx-*<br />
tar -zxvf nginx_*.debian.tar.gz</code>
<p>2) Télécharger uwsgi</p>
<p> <code>cd ..</p>
<p>wget http://projects.unbit.it/downloads/uwsgi-0.9.4.2.tar.gz</p>
<p>tar -zxvf uwsgi-0.9.4.2.tar.gz</code>
<p>3) Modifier le paquet source de nginx pour y ajouter uwsgi. Il faut éditer le fichier nginx-*/debian/rules, trouver le bloc qui commence par ./configure et ou se trouvent toutes les options de compilation, et y ajouter</p>
<p> <code>--add-module=$(CURDIR)/../uwsgi-0.9.4.2/nginx/</code>
<p>$(CURDIR)/../uwsgi-0.9.4.2/nginx/ est le chemin vers le dossier du module dans la source de uwsgi</p>
<p>4) maintenant, dans le dossier de la source de nginx, faites (pas besoin de root) :</p>
<p> <code>dpkg-buildpackage</code>
<p>5) installer le .deb généré ainsi (en tant que root maintenant)</p>
<p> <code>dpkg -i ../nginx-*.deb</code>
<p>6) Dernière étape : compiler uWSGI (le binaire en lui-même, qui va communiquer avec nginx par le biais du module)</p>
<p> <code>cd ../uwsgi-0.9.4.2/ &amp;&amp; make &amp;&amp; make install &amp;&amp; cp uwsgi_params /etc/nginx/</code>
<p>Cette dernière commande (le cp uwsgi_params&#8230;) sert à placer un fichier de configuration du module uwsgi exemple dans le repertoire de nginx.</p>
<h4>Sous les autres distributions :</h4>
<p>Il faut télécharger la source de nginx et de uwsgi, compiler nginx avec le module uwsgi (dans le répertoire nginx de la source de uwsgi), puis compiler uwsgi.﻿</p>
<p>On a maintenant un serveur uWSGI et un nginx avec  le module uwsgi. Il va maintenant falloir dire à nginx de transférer les requêtes au serveur uWSGI, avec une commande uwsgi_pass. Par exemple, dans la section server d&#8217;un de vos vhost (/etc/nginx/sites-enabled/default, par exemple, sous Debian) :</p>
<p> <code>location / {<br />
include uwsgi_params;<br />
uwsgi_pass unix:///tmp/uwsgi.sock;<br />
}</code>
<p>Il faut ensuite créer une application WSGI, par exemple, pour le framework web.py :</p>
<p> <code>import web</p>
<p>urls = (<br />
    '/.*', 'hello',<br />
    )</p>
<p>class hello:<br />
    def GET(self):<br />
        return "Hello, world."</p>
<p>application = web.application(urls, globals()).wsgifunc()<br />
applications = {'/': application }</code>
<p>Pour Django :</p>
<p> <code>import django.core.handlers.wsgi<br />
application = django.core.handlers.wsgi.WSGIHandler()<br />
applications = {'/': application }</code>
<p>Nommez ce fichier wsgi.py et placez le dans le repertoire ou vous allez placer votre code (pour Django, dans le repertoire du projet, évidemment).  Si vos nerfs n&#8217;ont pas encore lâché ici, allez prendre une petite pause de 5 minutes à titre préventif, et reprenez.  Maintenant, on va démarrer un serveur uWSGI. Placez vous dans le répertoire de votre fichier wsgi.py, et faites :</p>
<p> <code>uwsgi -s /tmp/uwsgi.sock -C -w wsgi -p2 -L</code>
<p>Explications : le -s indique ou placer le socket (ça pourrait aussi être une adresse au format hôte:port, pour un usage distant). Le -w wsgi indique de charger le fichier wsgi(.py), le -p2 indique de démarrer 2 processus, et le -L désactive l&#8217;envoi des requêtes à stdout (=&gt;flood).</p>
<p>Si vous allez à l&#8217;adresse de votre serveur web, vous devriez voir votre application Python en face de vous ! Vous voilà en train d&#8217;utiliser <strong>nginx+uwsgi+python</strong>.</p>
<p>En annexe, je rappelle que uwsgi est aussi utilisable avec apache et lighttpd.</p>
<p>Aussi, dans le dossier source de uwsgi, vous trouverez des templates pour un module d&#8217;administration de Django, à installer dans le repertoire des templates de l&#8217;administration de Django (si, si).</p>
<h3>Installation et configuration de gunicorn</h3>
<p>gunicorn est <strong>carrèment</strong> plus facile à installer. Il est codé en python, donc pas de compilation, seulement un <strong>easy_install</strong> :</p>
<p> <code>easy_install gunicorn</code>
<p>La configuration est tout aussi facile, il suffit de cela dans la configuration du vhost dans nginx :</p>
<p> <code>location / {<br />
proxy_pass http://unix:/tmp/gunicorn.sock<br />
}</code>
<p>On démarre ensuite gunicorn. Pour Django, gunicorn dispose d&#8217;un support intégré, il vous suffit de vous placer dans le répertoire de votre projet, puis :</p>
<p> <code>gunicorn_django -b unix:/tmp/gunicorn.sock --workers=2</code>
<p>Pour web.py, il faut créer un module :</p>
<p> <code>import web</p>
<p>urls = (<br />
    '/.*', 'hello',<br />
    )</p>
<p>class hello:<br />
    def GET(self):<br />
        return "Hello, world."</p>
<p>application = web.application(urls, globals()).wsgifunc()</code>
<p>Il faut ensuite démarrer le serveur Gunicorn. En étant dans le repertoire ou se trouve le module web.py (le fichier donc le code vient avant, là, au-dessus, oui), :</p>
<p> <code>gunicorn -b unix:/tmp/gunicorn.sock --workers=2 wsgi</code>
<p>Je vous invite à consulter ce lien : <a href="http://gunicorn.org/tuning.html"><span style="color: #000000;">gunicorn.org/tuning.html</span></a>, pour vous permettre d&#8217;augmenter les performances de gunicorn.</p>
<h3>Annexe</h3>
<h4><span style="font-weight: normal;">Fichiers statiques</span></h4>
<p> <code>location /admin-media {alias /usr/lib/pymodules/python2.5/django/contrib/admin/media;}</p>
<p>location /static {root /var/www/byteflow;}</code>
<p>Ces deux lignes, à rajouter après le &#8220;location /&#8221; avec uwsgi_pass ou proxy_pass (selon votre configuration) indiquent à nginx de traiter les fichiers statiques directement. Il faut bien évidemment adapter à votre configuration.</p>
<h4><span style="font-weight: normal;">Munin</span></h4>
<p><span style="font-weight: normal;">Vous pouvez trouver des plugins nginx pour munin <a href="http://muninexchange.projects.linpro.no/?search=&amp;cid=54&amp;pid=51">ici</a>. Je n&#8217;ai pas trouvé de plugin munin pour uwsgi/gunicorn, mais je pourrais peut-être en faire un si je trouve le temps.</span></p>
<h4><span style="font-weight: normal;">Plusieurs serveurs</span></h4>
<p><span style="font-weight: normal;">Si par hasard vous avez plusieurs serveurs gunicorn/uwsgi répartis sur plusieurs machines , vous pouvez les utiliser en déclarant une section </span></p>
<p> <code><span style="font-weight: normal;">upstream <em>nom</em> {} </span></code>
<p><span style="font-weight: normal;">dans nginx, contenant les adresses des serveurs distant (hôte:port ou emplacement du socket) et en utilisant &#8220;<em>nom</em>&#8221; comme argument à <em>uwsgi_pass</em> et <em>proxy_pass</em>.</span></p>
<h3>Conclusion</h3>
<p>Ces deux architectures sont très pratiques pour faire tourner du python dans un serveur web, ici nginx. uwsgi dispose de plus de fonctionalités, mais la plupart (template d&#8217;admin Django, memory profiling) pourraient facilement être ajoutées à gunicorn, qui est beaucoup plus léger à installer/configurer/maintenir (2 commandes et 3 lignes de configuration dans nginx). J&#8217;ai les deux personellement sur mon serveur, j&#8217;ai eu à alterner entre les deux pour écrire cet article, et c&#8217;est pas bien dur, un daemon à arrêter, un autre à démarrer, et changer une ligne dans la configuration de nginx.</p>
<h4>Liens</h4>
<p><a href="http://wsgi.org">wsgi.org</a></p>
<p><a href="http://gunicorn.org/">gunicorn.org/</a></p>
<p><a href="http://projects.unbit.it/uwsgi/">projects.unbit.it/uwsgi/</a></p>
<p><a href="irc://irc.freenode.org/#gunicorn">irc.freenode.org/#gunicorn</a></p>
<p><a href="http://nginx.org/">nginx.org/</a></p>
<p><a href="http://djangoadvent.com/">djangoadvent.com/</a></p>
<p><a href="http://www.django-fr.org/">www.django-fr.org/</a></p>
<p><a href="http://www.djangoproject.com/">www.djangoproject.com/</a></p>
<p><a href="http://webpy.org/">webpy.org/</a></p>
<p>Je tiens à remercier la communauté Geek{node|fault}, le chan irc #gunicorn, les développeurs de gunicorn qui sont très aimables, ainsi que Amandarn qui m&#8217;a aidé pour certains détails.</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2011/03/24/devbox-kvmlibvirt-perfect-setup/' rel='bookmark' title='Devbox KVM+Libvirt perfect setup.'>Devbox KVM+Libvirt perfect setup.</a></li>
<li><a href='http://geekfault.org/2010/04/09/maildir-mbox-la-migration/' rel='bookmark' title='Maildir mbox &#8211; La migration'>Maildir mbox &#8211; La migration</a></li>
<li><a href='http://geekfault.org/2010/04/09/filtrer-ses-mails-un-cauchemard/' rel='bookmark' title='Filtrer ses mails ! Un cauchemard !'>Filtrer ses mails ! Un cauchemard !</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/03/01/nginx-et-python-le-perfect-setup/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Chromium: l&#8217;adolescence de l&#8217;enfant de google.</title>
		<link>http://geekfault.org/2010/02/27/chromium-ladolescence-de-lenfant-de-google/</link>
		<comments>http://geekfault.org/2010/02/27/chromium-ladolescence-de-lenfant-de-google/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 22:39:55 +0000</pubDate>
		<dc:creator>koolfy</dc:creator>
				<category><![CDATA[comparatif]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[navigateur]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1934</guid>
		<description><![CDATA[Un écosystème de plugins en bonne santé. La principale lacune de Chromium, c&#8217;était l&#8217;absence d&#8217;un système de plugins. Quand il fut implémenté, la question restait entière : est ce que l&#8217;API de plugins permettrait une intégration aussi efficace qu&#8217;avec Firefox ? Allait-elle parvenir à créer une communauté de développeurs de plugins comparable à la communauté [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/31/chromium-google-chrome-sous-linux/' rel='bookmark' title='Chromium, le Google Chrome sous Linux sans émulation'>Chromium, le Google Chrome sous Linux sans émulation</a></li>
<li><a href='http://geekfault.org/2009/08/13/maturation-de-chromium/' rel='bookmark' title='La maturation de Chromium'>La maturation de Chromium</a></li>
<li><a href='http://geekfault.org/2009/08/17/exit-google/' rel='bookmark' title='La recherche web… sans Google!'>La recherche web… sans Google!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:Un peu d'histoire subjective.--><a href="http://geekfault.org/wp-content/uploads/2010/02/Chromium_Logo.png" title="Chromium_Logo" rel="lightbox.1934"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/02/Chromium_Logo-300x300.png" alt="" title="Chromium_Logo" width="150" height="150" class="alignleft size-medium wp-image-2331" /></a><a href="http://dev.chromium.org/Home"><strong>Chromium</strong></a> (Chrome pour la version estampillée Google) est un projet né dans le buzz absolu, mais aussi dans le plus simple appareil. Lors de sa <strong>naissance</strong>, tout lui manquait: le support de flash, un support java, des plugins (et donc un moyen de se prémunir des publicités envahissantes), des thèmes, un semblant de stabilité et surtout une version linux native !</p>
<p>Attentifs à son existence post-buzz, nous avons déjà couvert sa <a href="http://geekfault.org/2009/05/31/chromium-google-chrome-sous-linux/"><strong>naissance sur Linux</strong></a>, le <strong><a href="http://geekfault.org/2009/08/13/maturation-de-chromium/">début de son apprentissage</strong></a>, et le moment semble venu de marquer un nouveau chapitre dans l&#8217;évolution du navigateur : l&#8217;<strong>adolescence</strong>.<br />
<!--more--><br />
Au risque de synthétiser les deux premiers articles, il semble nécessaire de ré-établir le contexte et la genèse de ce projet, afin de mieux en comprendre le parcours.</p>
<div style="background: #FFFABF; -moz-border-radius: 6px; padding: 4px;"><strong>Attention :</strong> Cette page reprends ma <strong>vision personnelle</strong> du contexte de la sortie de Chrome/Chromium et a pour objectif de poser le décor pour la suite de l&#8217;article. Cette page <strong>n&#8217;engage donc que moi </strong>et n&#8217;est pas nécessaire à la suite de l&#8217;article, si vous n&#8217;êtes pas d&#8217;accord avec mon point de vue, ne vous énervez pas : passer à la <a href="http://geekfault.org/2010/02/27/chromium-ladolescence-de-lenfant-de-google/2/">page 2</a> <img src='http://geekfault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </div>
<h3>Avant la conception</h3>
<p>Le monde des navigateurs n&#8217;était pas rose, Internet Explorer avait le rôle du père violent, un échec total qui ne parvenait à maintenir son autorité que par la force de son poing et la violence de ses pratiques anti-concurrentielles, Safari était ignoré par au moins 90% du marché, Opera était un refuge obscur que l&#8217;on trouve presque par hasard, une sorte de soupe de bonnes idées (très) mal arrangées, et de choix intéressants, mais pas concluants.</p>
<p><a href="http://geekfault.org/wp-content/uploads/2010/02/4browsers.jpg" title="4browsers" rel="lightbox.1934"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2010/02/4browsers-300x200.jpg" alt="" title="4browsers" width="300" height="200" class="alignright size-medium wp-image-2339" /></a></p>
<p>Et <strong>Firefox</strong> là-dedans ? Il fut d&#8217;abord envoyé par la <a href="http://www.mozilla.org/"><strong>Mozilla Foundation</strong></a> en tant que messie venu se dresser contre l&#8217;hégémonie d&#8217;Internet Explorer, et prêcher la bonne parole du Logiciel Libre et des standards dans cet océan de code propriétaire.</p>
<p>Firefox fut rapide, Firefox fut efficace, Firefox fut puissant, Firefox fut multi-plateforme, Firefox fut meilleur. Il engrangea ainsi à juste titre des utilisateurs par poignées, une solide réputation, un écosystème de plugins et devint même le porte-flambeau de la lute pour la percée du Logiciel libre au delà de Linux, au delà des geeks : dans la vie quotidienne du grand public, au nez et à la barbe des logiciels propriétaires.<br />
(petit <a href="http://xkcd.com/198/"><strong>témoignage humoristique</strong></a> représentant la place de Firefox dans nos esprits en ces temps-là)</p>
<p>Mais ce qui s&#8217;apparenta d&#8217;abord à de l&#8217;adoration et à de l&#8217;amour inconditionnel, commença à perdre de sa fraicheur à partir et au delà de Firefox 2.0. Il commença à perdre de sa légèreté, à traîner la patte, à s&#8217;approprier toute la mémoire RAM de nos systèmes et la retenir en otage, et à ne plus convenir à de plus en plus d&#8217;utilisateurs. Alors, tout naturellement (et surtout sous Linux), chacun partit <strong>en quête d&#8217;un navigateur plus léger</strong>, plus rapide, quitte à sacrifier quelques avantages de Firefox, mais à travers les 4 ou 5 petits projets inaboutis, chacun revint bredouille et se rendit à deux évidences : &#8220;Firefox reste un excellent navigateur&#8221;, et &#8220;Il n&#8217;existe pas d&#8217;alternative viable à l&#8217;Alternative.&#8221;</p>
<p>Et peu à peu, les utilisateurs se rendirent compte que <strong>la concurrence au sein des alternatives à Internet Explorer</strong> et aux navigateurs propriétaires <strong>était tout simplement inexistante</strong>, et que chacun avait un choix simple à faire : &#8220;Le mal, ou Firefox.&#8221;</p>
<h3>naissance d&#8217;un navigateur, d&#8217;un buzz et d&#8217;un imparfait.</h3>
<p><a href="http://geekfault.org/wp-content/uploads/2010/02/chrome.jpg" title="chrome" rel="lightbox.1934"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/02/chrome-300x281.jpg" alt="" title="chrome" width="100" height="95" class="alignleft size-medium wp-image-2344" /></a>L&#8217;annonce et la sortie initiale de la toute première mouture du navigateur firent un fracas monumental. Ce que Google annonçait était purement et simplement une <strong>alternative à Firefox</strong>, et ses points forts et principaux arguments étaient très exactement les reproches faits à Firefox : la gestion de la mémoire RAM, la réactivité, la vitesse des rendus, le moteur JavaScript. Chrome les réalisait d&#8217;emblée.</p>
<p>Les frustrés et les curieux se jetèrent sur Chrome et déclarèrent dans les premiers jours avoir définitivement abandonné Firefox, et fait de Chrome leur navigateur par défaut. Dans les premiers jours seulement car comme notre <a href="http://geekfault.org/2009/05/31/chromium-google-chrome-sous-linux/"><strong>premier article sur l&#8217;arrivée de Chromium </strong></a>(le parent/jumeau Opensource de chrome) sur Linux l&#8217;indiquait, même plus d&#8217;un an après la sortie du navigateur, ses carences en faisaient plus une <strong>PoC (Proof of Concept) </strong>qu&#8217;un navigateur viable dans la vie de tous les jours, c&#8217;est ainsi que le buzz s&#8217;éteignit, et que seuls les utilisateurs les moins exigeants continuèrent de l&#8217;utiliser quotidiennement.<br />
Le pic d&#8217;utilisation de Chrome retomba largement, et tout le monde ou presque se retourna vers Firefox.</p>
<p>Malgré les désenchantements, Chromium était là, et alors qu&#8217;il luttait contre l&#8217;oubli, certains, dont une partie de la rédaction de Geekfault, restaient persuadés qu&#8217;il devait être suvi car il n&#8217;avait pas seulement sa place, mais était une <strong>nécessité</strong> dans l&#8217;équilibre concurrentiel des navigateurs.</p>
<p><!--nextpage--><!--pagetitle:Chromium, la fin de l'enfance.--></p>
<h3>Un écosystème de plugins en bonne santé.</h3>
<p>La principale lacune de Chromium, c&#8217;était l&#8217;absence d&#8217;un système de plugins. Quand il fut implémenté, la question restait entière : est ce que l&#8217;API de plugins permettrait une intégration aussi efficace qu&#8217;avec Firefox ? Allait-elle parvenir à créer une communauté de développeurs de plugins comparable à la communauté de Firefox ?</p>
<p>Aujourd&#8217;hui, la réponse est claire : <strong>oui.</strong><br />
Au 26 février 2010, le <a href="https://chrome.google.com/extensions?hl=fr"><strong>site de référencement des plugins Chromium</strong></a> recense 2990 plugins, et évolue à une vitesse régulière d&#8217;à peu près 30-40 plugins par semaine.<br />
Leur intégration au browser est parfaite et prévue pour ne pas affecter l&#8217;ergonomie ni les preformances du browser, on sent qu&#8217;un réel effort a été fait dans ce sens, contrairement par exemple au système de Widgets d&#8217;Opera (qui m&#8217;a <strong>traumatisé</strong>.)<br />
<a href="http://geekfault.org/wp-content/uploads/2010/02/pluginbar.png" title="pluginbar" rel="lightbox.1934"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/02/pluginbar-580x18.png" alt="" title="pluginbar" width="580" height="18" class="aligncenter size-large wp-image-2352" /></a><br />
Les plugins rencontrés sont assez variés, il en existe forcément pour checker vos mails google, ou servir d&#8217;interface intégrée à des sites comme Picasa, Twitter, Facebook, Slashdot, Google Buzz, Icanhascheezburger, il en existe pour &#8220;rendre plus esthétique/ergonomique&#8221; des sites comme Facebook ou Netvibes, et biensur la catégorie des plugins qui imitent des plugins déjà existants et très prisé sur Firefox.</p>
<p>Cependant, si cet écosystème évolue rapidement et est en bonne santé, il faut être réaliste : il en est à ses <strong>balbutiements</strong>. En effet, la plupart des extensions pour Chromium sont très basiques, il en existe un très grand nombre qui ne sont qu&#8217;un script .js de 15 lignes ne s&#8217;appliquant qu&#8217;au site l&#8217;ayant créé. Ça gonfle le nombre de plugins listés sur le site, mais ça ne pousse pas leur qualité globale vers de haut. Il est vrai qu&#8217;il existe quelques plugins ayant évolué très vite, et donc qui sont à la fois stables, utiles, efficaces et complets, mais il faut encore les chercher attentivement, et parcourir la liste de tous les plugins vous révèlera que 80% des plugins sont encore des petits scripts baclés à l&#8217;utilité douteuse.</p>
<p>Geekfault ne vous oublie pas, et prévoit un article reprenant les 10 plugins les plus indispensables de Chromium, Stay Tuned !</p>
<h3>Déjà un plugin d&#8217;ad blocking puissant, efficace et en évolution constante</h3>
<p><a href="http://geekfault.org/wp-content/uploads/2010/02/adblock.jpg" title="adblock" rel="lightbox.1934"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/02/adblock.jpg" alt="" title="adblock" width="55" height="55" class="alignleft size-full wp-image-2354" /></a>Même s&#8217;il en existe plusieurs, celle qui se démarque est <a href="https://chrome.google.com/extensions/detail/gighmmpiobklfepjocnamgkkbiglidom"><strong>AdBlock</strong></a> (accompagné de son &#8220;<a href="https://chrome.google.com/extensions/detail/picdndbpdnapajibahnnogkjofaeooof"><strong>tray-icon</strong></a>&#8221; séparé du moteur).</p>
<p>Il permet un filtrage efficace des publicités, même très agressivement incrustées dans les pages, non seulement grâce à une intégration parfaite des &#8220;Filter List Suscriptions&#8221; comme l&#8217;<strong>Easylist</strong> (plus une liste particulière propre à Chromium), mais également grâce à un système un peu particulier de filtrage manuel des pubs récalcitrantes.<br />
<a href="http://geekfault.org/wp-content/uploads/2010/02/adblock_lists.png" title="adblock_lists" rel="lightbox.1934"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/02/adblock_lists-150x150.png" alt="" title="adblock_lists" width="150" height="150" class="aligncenter size-thumbnail wp-image-2361" /></a><br />
<a href="http://geekfault.org/wp-content/uploads/2010/02/adblock_bar.jpg" title="adblock_bar" rel="lightbox.1934"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2010/02/adblock_bar-150x150.jpg" alt="" title="adblock_bar" width="150" height="150" class="alignright size-thumbnail wp-image-2356" /></a>Si une pub est passée à travers les mailles du filet, vous pouvez bien évidemment l&#8217;indiquer à AdBlock, qui vous présentera alors un petit cadre avec une &#8220;SlideBar&#8221; à faire glisser vers la droite jusqu&#8217;à ce que la pub disparaisse. AdBlock va dès lors appliquer des règles de filtrages de plus en plus violentes sur l&#8217;élément jusqu&#8217;à atteindre le parfait <strong>compromis</strong> entre le filtrage de la pub et l&#8217;affichage correct du reste de la page. Une fois l&#8217;élément filtré et les nouvelles règles enregistrées, elles deviennent disponibles dans la page de configuration du plugin, éditables  à tout moment. Il en va de même pour les exceptions de type &#8220;Whitelist&#8221;.</p>
<p>Vous trouverez également plusieurs options sympatiques, comme la possibilité de laisser passer les pubs textuelles qui ne vous dérangent pas (comme celle de Google), ou de filtrer les pubs incrustées dans les vidéos de Youtube (option encore en Beta)<br />
<a href="http://geekfault.org/wp-content/uploads/2010/02/adblock_conf1.png" title="adblock_conf1" rel="lightbox.1934"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/02/adblock_conf1-300x106.png" alt="" title="adblock_conf1" width="300" height="106" class="aligncenter size-medium wp-image-2358" /></a><br />
Son principal défaut actuellement est de ne pas empêcher les pubs de se charger: en effet, en l&#8217;absence de règles de blocking intégrées à Chromium, les plugins de filtrage de pubs en sont actuellement réduites à les &#8220;cacher&#8221; par des règles de CSS. Si ce procédé épargne vos yeux et votre CPU, il n&#8217;en est pas de même pour votre <a href="http://code.google.com/p/adblockforchrome/wiki/FrequentlyAskedQuestions#Does_this_actually_prevent_ads_from_downloading?"><strong>bande passante</strong></a>.<br />
Heureusement, (et contrairement à ce que beaucoup de paranoïaques prédisaient) Google ne compte pas mettre de bâtons dans les roues des plugins de filtrage de pubs, <a href="http://www.theregister.co.uk/2009/12/16/google_on_adblockers/"><strong>au contraire</strong></a>, et pour les plus sceptiques d&#8217;entre vous, un simple coup d&#8217;oeil au <a href="http://code.google.com/p/chromium/"><strong>site du projet Chromium</strong></a> vous apprendra que la fonction en question est en <a href="http://code.google.com/p/chromium/issues/detail?id=16932"><strong>développement actif</strong></a>.</p>
<p>L&#8217;équipe d&#8217;AdBlock est donc bien évidemment à l&#8217;affût, et n&#8217;attends que son implémentation définitive pour l&#8217;intégrer dans son procédé de filtrage.</p>
<h3>Un plugin de type &#8220;Firebug&#8221; ? Mieux, un outil intégré au Navigateur !</h3>
<p>Beaucoup de Web Developpers ont peur de quitter Firefox par crainte de perdre leur meilleur ami : Firebug.</p>
<p>Il n&#8217;en est rien ! Chromium a intégré un outil de développement surpuissant au navigateur.<br />
Celui-ci intègre entre-autres une console javascript, un affichage structuré de la source d&#8217;une page, des outils de chronométrage des chargement des différents éléments d&#8217;une page, de profiling des ressources consommées par chaque élément de la page, ainsi que plusieurs outils que je ne comprends pas du tout, n&#8217;ayant aucune notion de développement web <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<a href="http://geekfault.org/wp-content/uploads/2010/02/devtool1.png" title="devtool1" rel="lightbox.1934"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/02/devtool1-150x150.png" alt="" title="devtool1" width="150" height="150" class="alignleft size-thumbnail wp-image-2367" /></a><a href="http://geekfault.org/wp-content/uploads/2010/02/devtool3.png" title="devtool3" rel="lightbox.1934"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2010/02/devtool3-150x150.png" alt="" title="devtool3" width="150" height="150" class="alignright size-thumbnail wp-image-2369" /></a><a href="http://geekfault.org/wp-content/uploads/2010/02/devtool2.png" title="devtool2" rel="lightbox.1934"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2010/02/devtool2-150x150.png" alt="" title="devtool2" width="150" height="150" class="aligncenter size-thumbnail wp-image-2368" /></a><br />
Bien que toujours inférieur à Firebug, cet outil est déjà très complet, en évolution constante, et totallement suffisant pour ne pas se retrouver &#8220;tout nu&#8221;.<br />
Il existe déjà quelques petites extensions permettant de le compléter un peu, mais celles-ci sont anecdotiques et encore très minimalistes.</p>
<h3>Un développement (trop ?) dynamique</h3>
<p>Le développement de Chromium est tout sauf lent. Avec un rythme d&#8217;environ 100 révisions par jour, se tenir à jour est une mission quotidienne… et dangereuse.</p>
<p>En effet, Chromium étant une version &#8220;git&#8221; permanente, se ruer sur la toute dernière révision n&#8217;est pas forcément une bonne idée.<br />
Au menu : erreurs de rendu, régressions dans l&#8217;interface graphique, corruption occasionnelle de certains plugins, boucles infinies dans le CPU, fuites de mémoire (parfois de l&#8217;ordre de la fontaine, voire du Titanic), ou simplement disparition de certaines fonctionnalités le temps de les recoder complètement (comme par exemple les &#8220;pin tab&#8221;)…</p>
<p>Heureusement, les distributions font souvent leur packaging de façon intelligente et proposent des versions snapshot reconnues &#8220;stables&#8221;, plus ou moins à jour, permettant un compromis tout à fait convenable. Il est toutefois déconseillé de s&#8217;aventurer hors de ces packages, si on veut pouvoir continuer à utiliser Chromium comme navigateur principal.</p>
<p>La communauté autour du développement est abondante, et les développeurs réactifs, même s&#8217;ils ne peuvent pas être partout à la fois et qu&#8217;ils ont beaucoup de travail rien qu&#8217;avec l&#8217;énorme quantité de patch à webkit que Chromium intègre.<br />
Cependant leur ordre de priorité fait que souvent les bugs spécifiques à Linux sont plus coriaces et trainent plus longtemps, ou simplement que les features sont d&#8217;abord achevées sur les versions Windows, quelques jours/semaines avant les versions Linux.</p>
<p><!--nextpage--><!--pagetitle:Myth busting--></p>
<h3>Google Chrome vs Chromium, une fois pour toutes.</h3>
<p>Deux ans après, je croise tous les jours des gens qui attribuent à Chromium des reproches de Chrome, et qui n&#8217;ont toujours pas clairement assimilé la <strong>distinction</strong> entre les deux.</p>
<p>Sur la <a href="http://code.google.com/p/chromium/wiki/ChromiumBrowserVsGoogleChrome"><strong>page de clarification</strong> </a>des deux projets :<br />
<div id="attachment_2330" class="wp-caption aligncenter" style="width: 452px"><a href="http://geekfault.org/wp-content/uploads/2010/02/ChromevsChromium.png" title="ChromevsChromium" rel="lightbox.1934"><img src="http://geekfault.org/wp-content/uploads/2010/02/ChromevsChromium.png" alt="" title="ChromevsChromium" width="442" height="566" class="size-full wp-image-2330" /></a><p class="wp-caption-text">Tableau comparatif des deux navigateurs</p></div></p>
<p>Pour faire simple :<br />
 Google héberge le projet <strong>Chromium</strong>, et paye une équipe de développeurs centraux sur le projet <strong>Chromium</strong>. Ceux-ci (aidés de la communauté) font des patch webkit, des ajouts de fonctionnalités, des améliorations de performances, de réactivité, de l&#8217;interface graphique… en bref : font avancer le navigateur.<br />
Ce navigateur (<strong>Chromium</strong>), est sous licence libre (BSD pour la plupart).</p>
<p>Une fois que tous les objectifs nécessaires à une <strong>Milestone</strong> (déterminée par l&#8217;équipe de dev de Google) sont atteint, Google fait un Copier/Coller de tout le code de <strong>Chromium</strong>, &#8220;fork&#8221; le projet <strong>Chromium</strong>, y ajoute le code qui attribue un identifiant unique à chaque installation du navigateur, qui envoie les données de navigation à Google, et ce genre d&#8217; &#8220;améliorations&#8221; made in Google, y ajoute des codecs propriétaires (h.264, mp3, etc), et enfin, fait une annonce de la sortie de la nouvelle version de <strong>Chrome</strong> : Chrome-[version_antérieure ++] !<br />
Puis on lance le développement de Chromium-[version_de_Chrome ++], et le cycle recommence.<br />
Le tout distribué sous licence <strong>propriétaire</strong> (comme le permet la licence BSD de Chromium).</p>
<p>En résumé, Chromium n&#8217;envoie pas vos informations de navigation à votre insu à Google, c&#8217;est Chrome qui s&#8217;en charge !<br />
D&#8217;ailleurs Google met un point d&#8217;honneur à se détacher «le plus possible» du développement de Chromium : ils hébergent le projet (comme beaucoup d&#8217;autres sur code.google.com), salarient les développeurs principaux, et évidemment décident de la direction que le projet prends (vu que c&#8217;est à fortiori la direction que Chrome prendra), mais c&#8217;est «tout» !<br />
Dans le code de <strong>Chromium</strong> il n&#8217;apparait <strong>aucune mention</strong> à Google ni à Chrome, aucune information n&#8217;est envoyée à Google, ces liens sont établis dans <strong>Chrome</strong>.</p>
<p>Le <a href="http://dev.chromium.org/chromium-os/building-chromium-os/getting-the-chromium-os-source-code"><strong>code source</strong></a> est disponible en téléchargement, les développeurs sont ouverts aux contributions, aux suggestions et même aux réclamations de la communauté autour du site du projet, ce ne sont <strong>pas des nazis ayant vendu leur âme</strong> et leurs principes à Google (enfin, ils sont payés par google mais) ils sont plus préoccupés par la qualité et l&#8217;efficacité de leur navigateur que par l&#8217;hégémonie de leur employeur.</p>
<p>Les seuls moments où on sent l&#8217;influence de Google derrière eux résident dans les choix d&#8217;implémentation orientés vers la branche Chrome OS du projet, ou dans les objectifs du navigateur (ex: quand un dev refuse un patch qui ralentit le lancement du navigateur de 100ms <strong>(!)</strong>).</p>
<p>J&#8217;espère que la distinction est désormais claire dans l&#8217;esprit de chacun.<br />
<!--nextpage--><!--pagetitle:Conclusion--></p>
<h3>Chromium, prêt à voler de ses propres ailes.</h3>
<p><a href="http://geekfault.org/wp-content/uploads/2010/02/flying_browser.png" title="flying_browser" rel="lightbox.1934"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/02/flying_browser.png" alt="" title="flying_browser" width="208" height="121" class="alignleft size-full wp-image-2374" /></a>Après avoir utilisé Chromium pendant plusieurs mois, et vécu tous les constats faits en <a href="http://geekfault.org/2010/02/27/chromium-ladolescence-de-lenfant-de-google/2/">page 2</a>, je peux maintenant affirmer que <strong>Chromium a enfin ce qu&#8217;il faut pour être un navigateur principal</strong> pour l&#8217;utilisateur moyen à avancé.</p>
<p>Biensur il est encore inférieur à Firefox en plusieurs points (souvent la maturité des plugins proposés), mais il a enfin gagné sa place parmi les navigateurs principaux, et surtout, est enfin sorti de son aura de &#8220;Projet inachevé&#8221; et de &#8220;Proof of Concept&#8221; qui l&#8217;aura suivi pendant près de deux années.</p>
<p>Pour toutes ces raisons, je le conseille à beaucoup de gens qui se plaignent de Firefox, ou simplement qui ont d&#8217;autres priorités dans leurs exigences, tout en reconnaissant que pour beaucoup de gens encore, <strong>Firefox reste le meilleur choix</strong>.</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/31/chromium-google-chrome-sous-linux/' rel='bookmark' title='Chromium, le Google Chrome sous Linux sans émulation'>Chromium, le Google Chrome sous Linux sans émulation</a></li>
<li><a href='http://geekfault.org/2009/08/13/maturation-de-chromium/' rel='bookmark' title='La maturation de Chromium'>La maturation de Chromium</a></li>
<li><a href='http://geekfault.org/2009/08/17/exit-google/' rel='bookmark' title='La recherche web… sans Google!'>La recherche web… sans Google!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/02/27/chromium-ladolescence-de-lenfant-de-google/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>DenyHosts pour empêcher le bruteforce sur SSH</title>
		<link>http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/</link>
		<comments>http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 10:31:35 +0000</pubDate>
		<dc:creator>Lord</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[réseau]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2206</guid>
		<description><![CDATA[Ras le bol de voir des tentatives de connexion sur votre SSH ? Il existe plusieurs logiciel pour vous en prémunir avec en tête de liste le célèbre Fail2ban qui permet de protéger SSH ainsi que la plupart des autres serveurs logguant l&#8217;authentification. Mais alors pourquoi choisir DenyHosts ? DenyHosts se limite à la protection [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
<li><a href='http://geekfault.org/2009/05/15/ssh-sans-mot-de-passe/' rel='bookmark' title='SSH sans mot de passe'>SSH sans mot de passe</a></li>
<li><a href='http://geekfault.org/2009/03/28/ubuntu-jaunty-jackalope-9-04/' rel='bookmark' title='On a testé pour vous : Ubuntu Jaunty Jackalope 9.04'>On a testé pour vous : Ubuntu Jaunty Jackalope 9.04</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-2207" href="http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/denyhosts/"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   class="alignleft size-full wp-image-2207" title="denyhosts" src="http://geekfault.org/wp-content/uploads/2010/02/denyhosts.png" alt="" width="347" height="73" /></a>Ras le bol de voir des tentatives de connexion sur votre SSH ? Il existe plusieurs logiciel pour vous en prémunir avec en tête de liste le célèbre Fail2ban qui permet de protéger SSH ainsi que la plupart des autres serveurs logguant l&#8217;authentification. Mais alors pourquoi choisir DenyHosts ? DenyHosts se limite à la protection SSH mais sa force provient de deux fonctionnalités :  utiliser un système de synchronisation entre plusieurs DenyHosts ( je ne l&#8217;aborde pas ), mais également le partage des IP incriminées. Afin de récupérer des IP à blacklister et de d&#8217;offrir les siennes afin de se fabriquer une blacklist évolutive.</p>
<p>Un attaquant vera son adresse IP inscrite dans le fichier <em>/etc/hosts.deny</em> l&#8217;empêchant de se logguer.</p>
<p><!--more--></p>
<h3>Installation</h3>
<p>Gentoo</p>
<p><code>emerge denyhosts</code></p>
<p>Debian et dérivés</p>
<p><code>aptitude install denyhosts</code></p>
<p>Red Hat et consorts</p>
<p><code>yum install denyhosts</code></p>
<h3>Configuration</h3>
<p><em>/etc/denyhosts</em></p>
<p><code>#Doit pointer vers votre fichier logguant les tentatives de connexions<br />
SECURE_LOG = /var/log/auth.log</p>
<p>#Doit pointer vers votre fichier de blacklist<br />
HOSTS_DENY = /etc/hosts.deny<br />
BLOCK_SERVICE  = sshd</p>
<p>#Nombre d'essai avant d'être bloqué pour une connexion non root<br />
DENY_THRESHOLD_INVALID = 5<br />
DENY_THRESHOLD_VALID = 5</p>
<p>#Nombre d'essai avant d'être bloqué pour une connexion en temps que root<br />
DENY_THRESHOLD_ROOT = 3<br />
DENY_THRESHOLD_RESTRICTED = 1<br />
WORK_DIR = /var/lib/denyhosts<br />
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES<br />
HOSTNAME_LOOKUP=YES<br />
LOCK_FILE = /var/run/denyhosts.pid</p>
<p>#Vers quelle adresse email signaler une attaque infructueuse<br />
ADMIN_EMAIL = votre@mail<br />
SMTP_HOST = localhost<br />
SMTP_PORT = 25<br />
SMTP_FROM = DenyHosts <denyhosts@localhost><br />
SMTP_SUBJECT = DenyHosts Report<br />
SYSLOG_REPORT=YES</p>
<p>#temps avant la remise à zéro du compteur<br />
AGE_RESET_VALID=5d<br />
AGE_RESET_ROOT=10d<br />
AGE_RESET_RESTRICTED=25d<br />
AGE_RESET_INVALID=10d<br />
RESET_ON_SUCCESS = yes<br />
DAEMON_LOG = /var/log/denyhosts<br />
DAEMON_LOG_TIME_FORMAT = %b %d %H:%M:%S<br />
DAEMON_LOG_MESSAGE_FORMAT = %(asctime)s - %(name)-12s: %(levelname)-8s %(message)s<br />
DAEMON_SLEEP = 30s<br />
DAEMON_PURGE = 1h</p>
<p>#Ces dernières lignes permettent d'utiliser le partage d'IP. On peut se limiter au partage montant ou descendant<br />
#C'est purement facultatif mais je vous le recommande.<br />
SYNC_SERVER = http://xmlrpc.denyhosts.net:9911<br />
SYNC_UPLOAD = yes<br />
SYNC_DOWNLOAD = yes</code></p>
<p>Puis pour le lancer :<br />
<code>/et/init.d/denyhosts start</code></p>
<p>Sous Gentoo pour le lancer automatiquement au boot vous devez l&#8217;ajouter à votre « rc par défaut » :<br />
<code>rc-update add denyhosts default</code></p>
<h3>Logs</h3>
<p>Allons faire un tour dans les logs de DenyHosts pour voir à quoi s&#8217;attendre.</p>
<p>Exemple de synchro où l&#8217;on récupère des IP à blacklister :</p>
<p><code>Feb 20 04:42:43 - denyhosts   : INFO     received new hosts: ['217.10.117.161', '194.185.200.156', '91.75.180.114', '202.141.132.50', '60.248.91.64', '211.100.42.83', '202.165.    177.203', '211.155.227.171', '58.221.34.18', '88.191.15.133', '210.51.36.162', '220.165.28.66', '91.205.74.41', '61.178.74.43', '202.117.54.134', '74.127.18.195', '195.250.39.6    6', '216.229.160.194', '122.70.147.103', '200.195.168.194', '202.44.11.60', '94.190.187.113', '213.5.64.164', '201.116.98.210', '163.13.175.44', '119.149.189.199', '93.152.156.    13', '125.7.209.4', '210.51.48.71', '88.117.234.162', '217.97.185.35', '217.20.183.73', '117.41.228.195', '201.20.186.222', '79.39.6.98', '221.165.162.4', '211.72.171.76', '209    .255.67.10', '80.203.122.116', '12.152.124.2', '70.169.201.74', '202.5.95.205', '217.219.67.131', '65.98.97.98', '218.241.155.144', '80.14.186.105', '96.31.68.39', '218.108.247    .138', '61.138.217.19', '82.230.95.10']</code></p>
<p>Ajout d&#8217;un attaquant + upload au serveur central :</p>
<p><code>Feb 21 09:25:31 - denyhosts   : INFO     new denied hosts: ['81.7.171.15']<br />
Feb 21 09:43:01 - sync        : INFO     sent 1 new host</code></p>
<p>Reset du compteur en cas de login réussi :</p>
<p><code>Feb 21 11:35:03 - loginattempt: INFO     resetting count for: 10.0.0.3</code></p>
<h3>Liens</h3>
<p><a href="http://www.denyhosts.sourceforge.net">Site officiel</a><br /> <a href="http://stats.denyhosts.net/stats.html">Statistiques mondiales de DenyHosts</a></p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
<li><a href='http://geekfault.org/2009/05/15/ssh-sans-mot-de-passe/' rel='bookmark' title='SSH sans mot de passe'>SSH sans mot de passe</a></li>
<li><a href='http://geekfault.org/2009/03/28/ubuntu-jaunty-jackalope-9-04/' rel='bookmark' title='On a testé pour vous : Ubuntu Jaunty Jackalope 9.04'>On a testé pour vous : Ubuntu Jaunty Jackalope 9.04</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.</title>
		<link>http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/</link>
		<comments>http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 18:44:39 +0000</pubDate>
		<dc:creator>bragon</dc:creator>
				<category><![CDATA[eeegw]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[planet-libre]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=2122</guid>
		<description><![CDATA[Vous vous souvenez dans l&#8217;article : http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/ Je vous ai parlé de plein de petits ajouts afin de rendre votre eeegw MUST. Je vous avais parlé de : Pouvoir mettre en place un proxy transparent pour votre connexion pour mettre en cache les pages les plus souvent demandées et ainsi économiser de la bande passante. [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/' rel='bookmark' title='Eeegw &#8211; part III &#8211; Quality Of Service aka QOS'>Eeegw &#8211; part III &#8211; Quality Of Service aka QOS</a></li>
<li><a href='http://geekfault.org/2009/10/04/allocation-dipv6-over-openvpn/' rel='bookmark' title='Allocation d&#8217;IPv6 over OpenVPN'>Allocation d&#8217;IPv6 over OpenVPN</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/img00263-2/" rel="attachment wp-att-2127"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/02/IMG00263-300x225.jpg" alt="" title="IMG00263" width="300" height="225" class="alignleft size-medium wp-image-2127" /></a></p>
<p>Vous vous souvenez dans l&#8217;article : <a href="http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/">http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/</a> Je vous ai parlé de plein de petits ajouts afin de rendre votre eeegw MUST.</p>
<p>Je vous avais parlé de :</p>
<p><strong>Pouvoir mettre en place un proxy transparent pour votre connexion pour mettre en cache les pages les plus souvent demandées et ainsi économiser de la bande passante.</strong></p>
<p>Finalement j&#8217;ai trouvé le soft parfait pour faire ça : <a href="http://www.pps.jussieu.fr/~jch/software/polipo/">http://www.pps.jussieu.fr/~jch/software/polipo/</a></p>
<p><!--more--></p>
<h4> Choix du soft de proxy cache </h4>
<p><strong> Pourquoi ne pas avoir choisi squid ? </strong></p>
<p>- Parce qu&#8217;il est trop gourmand en ressource pour la eeegw.<br />
- Parce que sa conf est imbittable pour un non initié.</p>
<p><strong> Pourquoi avoir choisi Polipo ?</strong></p>
<p>- Parce qu&#8217;il consomme que dalle en ressource et en espace disque.<br />
- Parce que sa configuration est assez implicite.<br />
- Polipo à toutes les fonctions d&#8217;un bon web proxy.<br />
- Polipo  est parfaitement adapté aux petits reseaux, mais pourrait parfaitement fonctionner sur un gros réseau bien qu&#8217;il n&#8217;ai pas spécialement été design dans ce but.<br />
- Polipo sait filtrer, ainsi si on souhaite totalement interdire facebook.com ou msn.con/live.com sur son reseau <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  On peut très facilement.<br />
- Polipo sait causer ipv4 et ipv6, Ainsi polipo peut être utilisé en tant que bridge pour permettre aux clients ipv6 d&#8217;accéder à l&#8217;internet v4 et vis et versa.<br />
- Polipo sait parler SOCKS, ainsi il peut très facilement se coupler (ou s&#8217;accoupler au choix :p) avec tor afin de surfer de façon anonyme.</p>
<h4> Installation et configuration de Polipo </h4>
<p>Sur eeegw rien de plus simple :</p>
<p><code><br />
apt-get install polipo<br />
</code></p>
<p>Allé on va le configurer : /etc/polipo/config</p>
<p><code></p>
<p>proxyAddress = "::0"        # both IPv4 and IPv6<br />
# proxyAddress = "0.0.0.0"    # IPv4 only<br />
proxyPort = 8118<br />
# If you are enabling 'proxyAddress' above, then you want to enable the<br />
# 'allowedClients' variable to the address of your network, e.g.<br />
allowedClients = 127.0.0.1, 10.0.69.0/24<br />
# Uncomment this if you want your Polipo to identify itself by<br />
# something else than the host name:<br />
proxyName = "polipo.eeegw.bragon.info"<br />
# Uncomment this if you want to use a parent SOCKS proxy:<br />
# socksParentProxy = "localhost:9050"<br />
# socksProxyType = socks5<br />
### Memory<br />
### ******<br />
# Uncomment this if you want Polipo to use a ridiculously small amount<br />
# of memory (a hundred C-64 worth or so):<br />
# chunkHighMark = 819200<br />
# objectHighMark = 128<br />
# Uncomment this if you've got plenty of memory:<br />
chunkHighMark = 50331648<br />
objectHighMark = 16384<br />
## me permet d'acceder a http://10.0.69.250:8118/polipo/index pour voir ce qui est mis en cache<br />
disableIndexing = false<br />
disableServersList = false<br />
### HTTP<br />
### ****<br />
# Note that PMM is somewhat unreliable.</p>
<p>pmmFirstSize = 16384<br />
pmmSize = 8192</p>
<p># Suggestions from bragon<br />
maxConnectionAge = 10m<br />
maxConnectionRequests = 1024<br />
serverMaxSlots = 16<br />
serverSlots = 4<br />
tunnelAllowedPorts = 1-65535</p>
<p></code></p>
<p>/etc/polipo/forbidden</p>
<p><code><br />
microsoft.com<br />
live.com<br />
msn.com<br />
hotmail.fr<br />
hotmail.com<br />
facebook.fr<br />
facebook.com<br />
</code></p>
<p>Laissez le fichier option de base.</p>
<h4> On peut faire feu </h4>
<p><code><br />
/etc/init.d/polipo start<br />
</code></p>
<p>http://ip.eeegw:8118/polipo/</p>
<p>Vous pourrez ainsi voir la configuration ainsi que pas mal de chose étant mis en cache.</p>
<p>http://ip.eeegw:8118/polipo/index?</p>
<h4> Le choix s&#8217;offre à vous </h4>
<p>Deux solutions :<br />
- Soit vous dites à vos clients d&#8217;utiliser dans leur firefox/chromium comme proxy : ip.polipo:8118<br />
- Soit via une règle iptables vous dites simplement à votre eeegw que tout traffic sortant via le port 80 doit d&#8217;abord passer par polipo.</p>
<p>Croyez moi vous allez économiser de la bande passante <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/' rel='bookmark' title='EeeGW : Créer soi-même une passerelle réseau'>EeeGW : Créer soi-même une passerelle réseau</a></li>
<li><a href='http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/' rel='bookmark' title='Eeegw &#8211; part III &#8211; Quality Of Service aka QOS'>Eeegw &#8211; part III &#8211; Quality Of Service aka QOS</a></li>
<li><a href='http://geekfault.org/2009/10/04/allocation-dipv6-over-openvpn/' rel='bookmark' title='Allocation d&#8217;IPv6 over OpenVPN'>Allocation d&#8217;IPv6 over OpenVPN</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IPv6 pour les nuls^Wgeeks</title>
		<link>http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/</link>
		<comments>http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 11:55:19 +0000</pubDate>
		<dc:creator>LeCoyote</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[IPv6]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1566</guid>
		<description><![CDATA[
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/' rel='bookmark' title='Geekfault disponible en IPv6'>Geekfault disponible en IPv6</a></li>
<li><a href='http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/' rel='bookmark' title='DenyHosts pour empêcher le bruteforce sur SSH'>DenyHosts pour empêcher le bruteforce sur SSH</a></li>
<li><a href='http://geekfault.org/2009/03/28/ubuntu-jaunty-jackalope-9-04/' rel='bookmark' title='On a testé pour vous : Ubuntu Jaunty Jackalope 9.04'>On a testé pour vous : Ubuntu Jaunty Jackalope 9.04</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:C'est quoi, IPv6 ?--><a href="http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/ipv6_ready_logo_phase2-small-2/" rel="attachment wp-att-1879"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2010/01/IPv6_ready_logo_phase2-small.jpg" alt="IPv6 Ready Logo" title="IPv6_ready_logo_phase2-small" width="200" height="239" class="alignleft size-full wp-image-1879" /></a>À moins d&#8217;avoir passé les 6 dernières années sous un gravillon, ou de n&#8217;avoir vraiment aucun intérêt pour les protocoles Internet (on ne vous juge pas !), vous avez probablement entendu parler d&#8217;IPv6. Seulement voilà : on en dit du bien ou du mal, mais sait-on exactement ce qu&#8217;est IPv6 après tout ? Voici le premier d&#8217;une petite série d&#8217;articles destinés à lever le voile.</p>
<p><!--more--></p>
<h3>Qu&#8217;est-ce qu&#8217;IPv6 ?</h3>
<p>Comme vous le savez certainement, Internet aujourd&#8217;hui repose essentiellement sur IPv4. Pour lui succéder, IPv6 (ou IPng, bien que cette deuxième dénomination soit moins fréquente) a été conçu il y a bien longtemps déjà. Sa mise en service était prévue en 1996 !<br />
Bizarrerie d&#8217;Internet, IPv5 n&#8217;a pas grand chose à voir avec les deux autres ; pour les curieux, il s&#8217;agit du Stream Protocol ST-II, qui est décrit <a href="http://www.faqs.org/rfcs/rfc1819.html">ici</a>.<br />
Alors qu&#8217;une adresse IPv4 ressemble à 81.93.247.142, une adresse IPv6 ressemble plutôt à 2001:758:1664::42 &#8230; mais nous y reviendrons plus tard.</p>
<h3>Pourquoi remplacer IPv4 ?</h3>
<p>Disons-le tout net, IPv4 marche encore très bien (aux dernières nouvelles en tous cas). Mais comme une adresse IPv4 est codée sur 32 bits, IPv4 ne peut adresser que 2<sup>32</sup> hôtes, soit un peu plus de 4 milliards de machines diverses et variées. La quantité d&#8217;adresses disponibles, qui semblait suffisante il y a 30 ans, diminue constamment, sans compter qu&#8217;une bonne partie de ces adresses sont réservées et ne peuvent être allouées. <a href="http://www.potaroo.net/tools/ipv4/index.html">Selon certaines estimations</a>, l&#8217;espace d&#8217;adresses IPv4 sera épuisé d&#8217;ici 2011/2012. </p>
<p>Par ailleurs, la plupart des FAI grand public attribuent en général <em>UNE</em> adresse IPv4 publique par abonné &#8230; et encore. Si vous êtes derrière un routeur ou une *box, sauf cas particulier, vous pouvez dire adieu à l&#8217;adresse IP publique : le routeur fera probablement du NAT (<a href="http://fr.wikipedia.org/wiki/Network_address_translation">Network Address Translation</a>). Et s&#8217;il s&#8217;agit d&#8217;une connexion Internet mobile, là encore, il n&#8217;y aura probablement pas d&#8217;IP publique au bout de la ligne.<br />
Or, selon la définition que l&#8217;on donne à Internet, ne pas avoir d&#8217;adresse IP publique c&#8217;est ne pas être sur Internet (c&#8217;est en tout cas l&#8217;opinion de <a href="http://blog.fdn.fr/post/2010/01/12/Rencontre-avec-l-ARCEP-sur-la-neutralit%C3%A9-du-r%C3%A9seau">Benjamin Bayart</a>, président de <a href="http://www.fdn.fr">FDN</a>).<br />
Par ailleurs, le NAT c&#8217;est bien gentil, mais ça complique très nettement la vie dès qu&#8217;il s&#8217;agit de faire du peer-to-peer (la technologie au sens large) ou de la VoIP par exemple.</p>
<p>Enfin, de façon générale, IPv6 apporte de nombreuses améliorations par rapport à IPv4 : il a été conçu de manière à permettre une répartition plus facile de son espace d&#8217;adressage, à effectuer un routage plus efficace, à mieux supporter le multicast ou encore à intégrer un concept de mobilité pour les terminaux nomades : autant de bonnes raisons de migrer !</p>
<p><!--nextpage--><!--pagetitle:IPv6 FTW--></p>
<p>Avant d&#8217;aller plus loin, voici un petit brin de théorie visant à exposer les bases d&#8217;IPv6. Après cela, nous verrons comment se doter d&#8217;IPv6 à la maison, et nous aborderons enfin quelques-unes des améliorations évoquées précédemment ainsi que certains aspects plus pointus de l&#8217;utilisation et de la configuration.</p>
<h3>Généralités sur les adresses</h3>
<p>Pour commencer, les adresses IPv6 sont codées sur 128 bits, ou encore 16 octets. Il y a donc 2<sup>128</sup> adresses possibles, soit environ 3.4&#215;10<sup>38</sup>, c&#8217;est-à-dire environ 5×10<sup>28</sup> adresses pour chacun des 6.5 milliards d&#8217;habitants de la planète (en 2006, source <a href="http://en.wikipedia.org/wiki/Ipv6#Larger_address_space">Wikipedia</a>).<br />
Selon l&#8217;hypothèse la plus conservatrice, un foyer connecté à Internet pourrait recevoir environ 18 &#8230; milliards &#8230; de milliards d’adresses <strong>publiques</strong> : 18 x 10<sup>18</sup>, ou 2<sup>64</sup> plus exactement. Par foyer. On devrait pouvoir tenir le coup.</p>
<p>Comme ça n&#8217;est pas très pratique d&#8217;écrire 128 bits sous forme décimale (essayez, vous verrez &#8230;), on utilise une représentation hexadécimale : les digits sont groupés par 4, les groupes sépares par des &#8220;:&#8221;, et les zéros non-significatifs peuvent être omis tant que ça reste non-équivoque. Exemples :</p>
<ul>
<li><strong>3FFE:1123:4567:89AB:CDEF:1234:5678:9ABC</strong></li>
<li><strong>2001:7a8:b285::1</strong> ; ici les zéros superflus ont été remplacés par &#8220;::&#8221;, ce qui ne peut être fait qu&#8217;une seule fois dans l&#8217;écriture de l&#8217;adresse pour éviter toute ambiguïté. Cette adresse équivaut donc à <strong>2001:07A8:B285:0000:0000:0000:0000:0001 ;</strong></li>
<li><strong>::1</strong> ; c&#8217;est l&#8217;équivalent du bon vieux 127.0.0.1, la boucle locale (pas celle de FT, vous l&#8217;aurez compris) ;</li>
<li><strong>::</strong> ou <strong>::/0</strong>; l&#8217;adresse la plus simple à écrire sans aucun doute, c&#8217;est le pendant du 0.0.0.0 (/0)  d&#8217;IPv4 ;
<li><strong>::ffff:81.93.247.142</strong> ; petite entorse à la règle, il est acceptable d&#8217;utiliser la notation décimale IPv4 quand on écrit une adresse IPv4 &#8220;mappée&#8221; en IPv6 (attention, ça ne marche pas partout) ;
<li><strong>2001:7a8:b285::12::34</strong> n&#8217;est <strong><em>PAS</em></strong> une adresse valide. Les <strong>::</strong> sont équivoques, on ne sait pas exactement où se situe le <strong>12</strong> au milieu de l&#8217;adresse.
</ul>
<div id="attachment_1989" class="wp-caption aligncenter" style="width: 590px"><a href="http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/ping6/" rel="attachment wp-att-1989"><img src="http://geekfault.org/wp-content/uploads/2010/02/ping6-580x369.png" alt="" title="ping6" width="580" height="369" class="size-large wp-image-1989" /></a><p class="wp-caption-text">ping6 vers le site de GeekFault depuis un serveur voisin</p></div>
<p>La notation CIDR (en &#8220;slash&#8221;) fonctionne sur le même principe qu&#8217;en IPv4 : le suffixe /X signifie qu&#8217;une adresse appartient à un réseau dont les X premiers bits sont fixés (partie réseau de l&#8217;adresse donc) et les 128-X derniers bits sont réservés à l&#8217;hôte. Par exemple, 2001:7a8::/32 désigne le réseau dont les 32 premiers bits sont 2001:7a8 (en l&#8217;occurrence il s&#8217;agit du FAI français <a href="http://www.nerim.net">Nerim</a>), tandis que ::/0 représente n&#8217;importe quelle adresse IPv6. On peut dire que <strong>2001:758:1664::42</strong> et <strong>2001:758:1664::57</strong> sont deux hôtes probablement différents mais appartenant au même sous-réseau <strong>2001:758:1664::/64</strong>, lui même appartenant à <strong>2001:758:1664::/48</strong>. Un sous-réseau de taille 64 est normalement situé sur un même brin physique.</p>
<p>Les 16 premiers bits d&#8217;une adresse IPv6 nous renseignent sur son type d&#8217;utilisation, par exemple 2001 pour les adresses attribuées de façon permanente, ou 3FFE pour le 6bone expérimental aujourd&#8217;hui obsolète. Deux cas particuliers sont à noter : le préfixe <strong>2002::/16</strong> identifie les adresse <strong>6to4</strong> (un protocole de transition pour ceux qui sont privés d&#8217;IPv6), tandis que le préfixe <strong>fe80::/10</strong> est réservé aux adresses locales (un peu à l&#8217;image de 169.254.0.0/16) ou &#8220;link-local&#8221; ; ces adresses locales ne sont utilisables que sur un même segment du réseau local ou sur une connexion point-à-point.</p>
<p>Pour pouvoir continuer à utiliser des noms symboliques plutôt que des adresse littérales, il faut que le DNS soit lui aussi IPv6-ready. Dans la pratique, un serveur DNS délivre des enregistrements <strong>AAAA</strong> pour la recherche directe (conversion de nom en adresse IPv6) et utilise les zones <strong>.ip6.arpa</strong> pour les recherches inverses. Par exemple :<br />
[cc]geeknode@ircd ~ $ dig +short -t aaaa www.kame.net<br />
2001:200:0:8002:203:47ff:fea5:3085<br />
geeknode@ircd ~ $ dig +short -x 2001:200:0:8002:203:47ff:fea5:3085<br />
orange.kame.net.<br />
geeknode@ircd ~ $[/cc]</p>
<p>Dernière astuce à noter, il arrive de devoir (ou de vouloir) taper une adresse IP littérale dans un navigateur, dans un fichier de configuration, ou à d&#8217;autres endroits où le caractère &#8220;:&#8221; est déjà utilisé (pour spécifier le numéro de port par exemple). Dans ce genre de cas, il est possible d&#8217;indiquer une adresse IPv6 littérale en l&#8217;encadrant par des crochets, comme par exemple <strong>[2001:758:1664::42]</strong>.</p>
<p>Maintenant que l&#8217;on connaît un peu mieux les différents types d&#8217;adresses IPv6 et que nous savons à quoi elles ressemblent, nous allons faire un tour du côté de la configuration.</p>
<p><!--nextpage--><!--pagetitle:La configuration--></p>
<h3>Auto-Configuration sans état</h3>
<p>L&#8217;une des nouveautés d&#8217;IPv6, c&#8217;est la possibilité pour l&#8217;OS de configurer automatiquement une interface réseau. Certes, IPv4 le fait déjà assez bien avec l&#8217;aide du DHCP, mais il s&#8217;agit là d&#8217;une configuration dite &#8220;avec état&#8221;, ou &#8220;stateful&#8221; : le serveur DHCP tient à jour une liste des clients configurés et des adresses IP disponibles. Nous allons aborder ici la configuration automatique &#8220;sans état&#8221;, ou &#8220;stateless&#8221;.</p>
<p>Dès lors que le protocole IPv6 est disponible et si l&#8217;auto-configuration est activée, l&#8217;OS va chercher ses réglages tout seul. La première étape consiste à monter une adresse link-local sur l&#8217;interface considérée. Pour cela, on utilise le préfixe <strong>fe80::/10</strong> et l&#8217;adresse MAC de l&#8217;interface ; par une subtile transformation, les 48 bits de cette adresse vont donner les 64 bits de droite de l&#8217;adresse locale. Cette transformation est simple :</p>
<ul>
<li>on part de l&#8217;adresse MAC, <strong>00:18:F8:CC:CC:20</strong> par exemple (ici un Linksys WRT54GL) que l&#8217;on sépare en deux blocs de 24 bits par le milieu : <strong>00:18:F8</strong> et <strong>CC:CC:20</strong> ;</li>
<li>on inverse la valeur du 7è bit du premier groupe, appelé &#8220;universel/local&#8221; ; <strong>0&#215;00</strong> en binaire donne <strong>00000000</strong>, qui devient <strong>00000010</strong> après l&#8217;inversion du 7è bit, et donc <strong>0&#215;02</strong> de retour en hexa ;</li>
<li>on réunit le groupe ainsi modifié et le deuxième groupe du début en insérant au milieu les octets <strong>FFFE</strong>, ce qui donne au final les 64 bits <strong>02:18:F8:FF:FE:CC:CC:20</strong> ;</li>
</ul>
<p><div id="attachment_2011" class="wp-caption aligncenter" style="width: 590px"><a href="http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/ipv6-stateless-2/" rel="attachment wp-att-2011"><img src="http://geekfault.org/wp-content/uploads/2010/02/IPv6-stateless1-580x180.png" alt="" title="IPv6-stateless" width="580" height="180" class="size-large wp-image-2011" /></a><p class="wp-caption-text">Génération de la partie hôte de l'adresse à partir de l'adresse MAC</p></div><br />
Il ne reste plus qu&#8217;à ajouter le préfixe link-local pour obtenir l&#8217;adresse : <strong>fe80::0218:f8ff:fecc:cc20/64</strong>.</p>
<p>Avant d&#8217;utiliser cette adresse, il faut vérifier son unicité sur le lien réseau. C&#8217;est l&#8217;une des applications du <strong>Neighbour Discovery Protocol</strong>, nommément la <strong>Duplicate Address Detection</strong> (DAD). Le protocole NDP repose sur ICMPv6, qui pour l&#8217;occasion se dote de nouveaux types de messages. L&#8217;un d&#8217;eux, &#8220;Neighbour Solicitation&#8221;, sert justement à vérifier que l&#8217;adresse que l&#8217;on s&#8217;apprête à utiliser n&#8217;est pas déjà attribuée à quelqu&#8217;un d&#8217;autre sur le lien. Lorsqu&#8217;une interface est montée est que son adresse locale potentielle (ou &#8220;tentative&#8221; dans le jargon) a été déterminée, l&#8217;hôte envoie un paquet &#8220;Neighbour Solicitation&#8221; à destination de cette même adresse et attend une réponse éventuelle. S&#8217;il n&#8217;y en a pas, l&#8217;adresse est considérée comme disponible et devient utilisable sur l&#8217;interface considérée.</p>
<p>Jusqu&#8217;ici, nous avons tout de même obtenu une adresse utilisable sur le LAN sans l&#8217;aide d&#8217;un DHCP. Cependant, pour sortir du LAN, il nous manque encore deux éléments : un routeur et une adresse IPv6 globale routable. Là encore c&#8217;est grâce à NDP que l&#8217;on va y arriver.<br />
Un routeur IPv6 envoie périodiquement sur le réseau des messages NDP dits &#8220;Routeur Advertisement&#8221; (RA pour faire court) qui contiennent entre autres informations le préfixe réseau à utiliser pour l&#8217;auto-configuration ainsi que l&#8217;adresse du routeur. L&#8217;hôte peut également envoyer un message &#8220;Router Solicitation&#8221; à une adresse multicast spéciale dite &#8220;all routers&#8221; valable sur le lien (link-local), <strong>ff02::2</strong> ; le routeur doit répondre à cette requête par un RA. L&#8217;hôte utilise alors le même mécanisme que pour déterminer l&#8217;adresse link-local, mais en utilisant cette fois-ci le préfixe annoncé par le routeur.<br />
Après vérification (DAD), l&#8217;adresse unicast globalement unique et routable ainsi obtenue est validée pour de bon, et l&#8217;adresse du routeur enregistrée comme passerelle par défaut : bienvenue sur la toile-v6 !</p>
<p>Il est temps maintenant de passer à la pratique <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><!--nextpage--><!--pagetitle:IPv6 en pratique--></p>
<h3>IPv6 en pratique</h3>
<p>Dans la vraie vie, tout le monde est plus ou moins égal face à IPv6. Les plus chanceux (abonnés Nerim, FDN, Free dans une moindre mesure) ont de l&#8217;IPv6 <strong>natif</strong> (ou presque) directement sur leur interface WAN (fût-elle xDSL ou FTTH). Pour les autres, il faudra utiliser des méthodes basées sur les <strong>tunnels</strong>, comme le 6to4 ou Teredo <em>(article à venir &#8230;)</em>.</p>
<p>Quoi qu&#8217;il en soit, un abonné recevra de son FAI (ou de son fournisseur de tunnel) un <strong>préfixe</strong> de la forme <strong>2001:7a8:b285::/48</strong>. Le FAI se charge de router tout ce préfixe vers la ligne de l&#8217;abonné, et ce dernier se débrouille pour faire le reste. Comme il n&#8217;y a en général qu&#8217;une seule ligne chez l&#8217;abonné, par laquelle passe tout le trafic, il faut un routeur.</p>
<p>Fabuleux, vous en avez probablement déjà un. Mais est-il seulement IPv6-aware ? À moins d&#8217;avoir une FreeBox, la réponse est probablement &#8220;non&#8221; : le support IPv6 dans ce genre de matériels est pour le moins anecdotique. Le geek IPv6-friendly va donc se monter une petite bécane sous Linux (ou flasher son WRT54GL par exemple) avec le support IPv6 compilé dedans. On peut certainement faire pareil avec *BSD, mais je ne parle pas de ce que je ne connais pas <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Le routeur fait en général au moins <strong>trois</strong> choses chez un particulier, quatre si on a du bol :
<ul>
<li>il fournit la <strong>connexion au WAN</strong>, fût-ce par ADSL, câble, fibre ou autre ;</li>
<li>il <strong>route les paquets</strong>, c&#8217;est quand même pas banal, avouez-le ;</li>
<li>il aide à se <strong>configurer les postes clients</strong> ;</li>
<li>en option, il fait du <strong>filtrage</strong>.</li>
</ul>
<p>Pour la connexion au WAN, le plus facile reste l&#8217;IPv6 natif. En effet, en ajoutant simplement une ligne contenant <strong>ipv6 ,</strong> à son /etc/ppp/options, pppd se charge de négocier une IPv6 link-local avec le pair d&#8217;en face.</p>
<p>Pour le routage, c&#8217;est là encore désarmant de simplicité :<br />
[cc lang="bash"]echo 1 > /proc/sys/net/ipv6/conf/all/forwarding[/cc]<br />
Félicitations : le routeur est maintenant capable de relayer les paquets à qui de droit. Bien sûr, libre à vous d&#8217;ajouter ça au sysctl.conf pour faciliter les choses.</p>
<p>Il faut ensuite informer les postes clients de la disponibilité d&#8217;IPv6 et à les configurer. On peut bien sûr utiliser l&#8217;auto-configuration stateful, avec DHCPv6, ou stateless, dont on a parlé au chapitre précédent. Cette dernière méthode requiert l&#8217;utilisation sur le routeur de <strong>radvd</strong>, pour Router ADVertisement Daemon. Après l&#8217;avoir installé selon la méthode de votre choix (apt-get, emerge, tar &#8230;), il vous faudra éditer le fichier de configuration (en général /etc/radvd.conf ou approchant), dont voici un example :<br />
[cc]interface br-lan<br />
{<br />
        AdvSendAdvert on;<br />
        MaxRtrAdvInterval 60;<br />
#       AdvLinkMTU 1492;</p>
<p>        prefix 2001:7a8:b285::1/64<br />
        {<br />
        };<br />
};[/cc]</p>
<p>Le fichier comporte au moins une définition d&#8217;interface ; ici, il s&#8217;agit de l&#8217;interface <strong>br-lan</strong> d&#8217;un WRT54GL sous OpenWRT. Dans l&#8217;ordre, les 4 premières options servent à indiquer que le service doit envoyer des RA et répondre aux sollicitations sur l&#8217;interface, les RA sont au maximum espacés de 60 secondes, et le MTU annoncé sur le lien est fixé à 1492 (option désactivée ici, mais très utile si vous êtes en PPPoE sur l&#8217;interface WAN). Vient ensuite une définition de préfixe, ici de longueur 64, qui ne contient ici aucune option particulière : les options par défaut conviendront parfaitement.</p>
<p>Enfin, pour le filtrage, il existe sous Linux le pendant IPv6 d&#8217;iptables, tout simplement nommé <strong>ip6tables</strong>. Tout comme en IPv4, il est possible de faire du conntrack en IPv6, moyennant un kernel &#8220;pas trop vieux&#8221; (ça ne marchera pas avec un 2.4 par exemple). La principale différence avec l&#8217;IPv4 est bien sûr l&#8217;absence du NAT : tout ou presque se passera directement dans la table FORWARD <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nous n&#8217;avons pas encore parlé de la configuration des postes clients, et il y a une raison très simple à cela : par défaut, il n&#8217;y a rien à faire. Du moment que le routeur est configuré correctement, l&#8217;OS client saura s&#8217;auto-configurer comme nous l&#8217;avons vu au chapitre précédent. Comme IPv6 est utilisé en priorité chaque fois que c&#8217;est possible, l&#8217;accès aux services disponibles se fera automatiquement et de façon transparente pour l&#8217;utilisateur final.</p>
<p><!--nextpage--><!--pagetitle:Conclusion--></p>
<p>Nous voici arrivés à la fin de cette introduction à IPv6. Moyennant un petit temps de prise en main, ce &#8220;nouveau&#8221; protocole ne devrait pas poser trop de soucis à ceux qui ont déjà quelques notions de réseaux IP. Quelques points à retenir :</p>
<ul>
<li>la forme des adresse doit maintenant vous être familière, attention simplement à l&#8217;écriture compacte (placement des &#8220;::&#8221;) et aux préfixes particuliers (2002::, fec0::, fe80:: &#8230;) ;</li>
<li><strong>ICMPv6</strong> joue un grand rôle dans IPv6, le NDP se substituant ainsi pour partie à ARP et DHCP ;</li>
<li>un routeur sous linux avec un démon <strong>radvd</strong> suffira à faire profiter de l&#8217;IPv6 à votre LAN.</li>
</ul>
<p>Cet article est j&#8217;espère le premier d&#8217;une série sur le sujet. Il y a en effet d&#8217;autres aspects à aborder ou certains problèmes à évoquer (comme le souci du pMTU par exemple) et un ou deux mythes à casser (non, IPv6 ne ralentit pas votre connexion !). À bientôt !</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/08/28/geekfault-disponible-en-ipv6/' rel='bookmark' title='Geekfault disponible en IPv6'>Geekfault disponible en IPv6</a></li>
<li><a href='http://geekfault.org/2010/02/24/denyhosts-pour-empecher-le-bruteforce-sur-ssh/' rel='bookmark' title='DenyHosts pour empêcher le bruteforce sur SSH'>DenyHosts pour empêcher le bruteforce sur SSH</a></li>
<li><a href='http://geekfault.org/2009/03/28/ubuntu-jaunty-jackalope-9-04/' rel='bookmark' title='On a testé pour vous : Ubuntu Jaunty Jackalope 9.04'>On a testé pour vous : Ubuntu Jaunty Jackalope 9.04</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2010/02/17/ipv6-pour-les-nulswgeeks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>EeeGW : Créer soi-même une passerelle réseau</title>
		<link>http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/</link>
		<comments>http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 11:44:59 +0000</pubDate>
		<dc:creator>bragon</dc:creator>
				<category><![CDATA[eeegw]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[Logiciel]]></category>
		<category><![CDATA[Matériel]]></category>
		<category><![CDATA[gateway]]></category>
		<category><![CDATA[how]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[planet-libre]]></category>
		<category><![CDATA[routeur]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1711</guid>
		<description><![CDATA[Le routeur-passerelle (gateway, en anglais) est le lien entre votre réseau local et l&#8217;Internet. Sans doute utilisez-vous simplement la box fournie par votre FAI ou un autre modem-routeur acheté en magasin, mais installer et configurer soi-même son gateway présente de nombreux avantages. Je vous présente via cet article ma transformation d&#8217;un EeePC, qui ne me [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/' rel='bookmark' title='EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.'>EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.</a></li>
<li><a href='http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/' rel='bookmark' title='Eeegw &#8211; part III &#8211; Quality Of Service aka QOS'>Eeegw &#8211; part III &#8211; Quality Of Service aka QOS</a></li>
<li><a href='http://geekfault.org/2009/05/20/firmware-linksys-wag200g/' rel='bookmark' title='Firmware modifié pour Linksys WAG200G'>Firmware modifié pour Linksys WAG200G</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><!--pagetitle:Introduction--><a href="http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/img00263/" rel="attachment wp-att-1864"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/12/IMG00263-300x225.jpg" alt="" title="IMG00263" width="300" height="225" class="alignleft size-medium wp-image-1864" /></a>Le routeur-passerelle (gateway, en anglais) est le <strong>lien entre votre réseau local et l&#8217;Internet</strong>. Sans doute utilisez-vous simplement la box fournie par votre FAI ou un autre modem-routeur acheté en magasin, mais installer et configurer soi-même son gateway présente de nombreux avantages.</p>
<p>Je vous présente via cet article ma transformation d&#8217;un <strong>EeePC</strong>, qui ne me servait à rien, en routeur-passerelle réseau. Je vous présente mon travail, mais il est très facile d&#8217;adapter ce travail à votre utilisation et à votre propre machine afin de la transformer en un super routeur Linux qui tue tout <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
<!--more--></p>
<h3>Article illustré par l&#8217;exemple</h3>
<p>Cette documentation est adapté à mon LAN qui est paramétré sur le subnet 10.0.69.0/24. Le eeegw, comme je l&#8217;appelle, prend donc l&#8217;adresse 10.0.69.250/24 est sera la gateway de mon réseau afin que mes autres machines puissent accéder à l&#8217;internet.</p>
<h3>À quoi ça sert de monter sa propre Gateway ? </h3>
<ul>
<li>Ne pas avoir à redémarrer sa connexion internet chaque fois qu&#8217;on a envie de toucher aux règles de firewalling. En effet les box des FAI nécessitent de redémarrer pour prendre en compte de nouveaux paramètres</li>
<li>Ne pas avoir une boite noire à la place de routeur : on peut surveiller son réseau et savoir quels sont les packets qui y passent</li>
<li>Pouvoir loguer via iptables et ulogd par exemple <em>(futur article)</em></li>
<li>Pouvoir grapher via rrdtool / Mrtg la bande passante qui passe par vos liens</li>
<li>Pouvoir héberger un petit blog (par exemple) directement sur votre passerelle</li>
<li>Pouvoir mettre en place un proxy transparent pour votre connexion pour mettre en cache les pages les plus souvent demandées et ainsi économiser de la bande passante <em>(futur article)</em></li>
<li>Savoir exactement ce qui se passe avec votre connexion internet</li>
<li>Mettre en place des outils de détection d&#8217;attaques sur votre réseau via SNORT <em>(futur article)</em></li>
</ul>
<h3>Choisir le bon matériel</h3>
<p>N&#8217;importe quel ordinateur avec un tant soit peu de puissance est suffisant pour faire un bon gateway, il suffit que cette machine soit munie de <strong>plusieurs interfaces réseau</strong>.</p>
<p>Durant des années j&#8217;ai eu en tant que passerelle un PII 266Mhz muni de 128MB de ram et d&#8217;un disque dur de 2Go. Pour cette nouvelle gateway j&#8217;ai choisi le <strong>EeePC 7&#8243;</strong> que j&#8217;ai baptisé <strong>eeegw</strong> <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pourquoi ce choix? Parce que le EeePC dispose de beaucoup d&#8217;avantages à être transformé en Gateway :</p>
<ul>
<li>Il est muni d&#8217;une batterie donc non affecté par une coupure de courant éventuelle</li>
<li>Il dispose d&#8217;une interface réseau ethernet et d&#8217;une interface wifi </li>
<li>La carte wifi intégrée est une Atheros et supporte donc (via le pilote madwifi) les multi wireless WAN </li>
<li>Sa puissance est honorable (512 de RAM / 900Mhz / 4Go de SSD)</li>
<li>On peut très facilement installer une distribution GNU/Linux dessus </li>
<li>On peut installer un serveur web dessus en toute tranquillité</li>
<li>Son matériel est pleinement supporté par le noyau Linux</li>
<li>Sa consommation est très faible, permettant donc d&#8217;être allumé 24/24 sans détruire son budget EDF </li>
</ul>
<h3>Installer la bonne distribution</h3>
<p>Si comme moi vous souhaitez transformer un EeePC, je vous conseille Debian. Personnelement j&#8217;aurais bien choisi Gentoo, mais le EeePC prendrait trop de temps à compiler, et ne refroidit pas spécialement bien.</p>
<p>Installer la distribution Debian sur un EeePC est très bien documenté, il vous suffit de créer une clée usb bootable. Je vous renvoie à la documentation de Debian : <a href="http://wiki.debian.org/DebianEeePC/HowTo/Install">EeeDebian</a>.</p>
<h3>Glossaire des packets Debian nécessaires pour ce howto </h3>
<ul>
<li>iproute</li>
<li>iptables</li>
<li>apache2</li>
<li>munin munin-node</li>
<li>wireless-tools</li>
</ul>
<p><!--nextpage--><!--pagetitle:Connexions internet--></p>
<h3> Se connecter aux FAI sur les interfaces concernées </h3>
<p>Je dispose pour ma part d&#8217;une connexion au web fournie via le fournisseur d&#8217;accès Nerim (j&#8217;établis donc la connexion en <strong>PPPoE</strong> comme avec la plupart des fournisseurs ADSL). Je dispose d&#8217;une seconde connexion via du <strong>WiFi</strong> fourni par un de mes voisins (qui accepte que je me serve de sa connexion).</p>
<p>Ne vous inquiétez pas si vous n&#8217;avez qu&#8217;une seule connexion, ou si vous avez Free+Numericable ou n&#8217;importe quelle autre combinaison, cet article est facilement adaptable à votre configuration.</p>
<h3>Connexion PPP</h3>
<p>Configurez la connexion PPPoE:<br />
<code>/etc/ppp/peers/dsl-provider</code><br />
<code> # Minimalistic default options file for DSL/PPPoE connections<br />
noipdefault<br />
defaultroute<br />
replacedefaultroute<br />
hide-password<br />
#lcp-echo-interval 30<br />
#lcp-echo-failure 4<br />
noauth<br />
persist<br />
#mtu 1492<br />
#persist<br />
#maxfail 0<br />
#holdoff 20<br />
plugin rp-pppoe.so eth0<br />
user "plopplop@adslc.fai.fai"<br />
usepeerdns </code></p>
<p>Et enregistrez vos identifiants:<br />
<code>/etc/ppp/chap-secret</code><br />
<code># Secrets for authentication using CHAP<br />
# client server secret IP addresses<br />
"plopplop@adslc.fai.fai" * "mdpdelamortquituedevotreFAI"</code> </p>
<p>Et créez le script qui initiera cette connexion:<br />
<code>/etc/eeegw/fai.sh</code><br />
<code>#!/bin/bash<br />
/usr/sbin/pppd call dsl-provider</code> </p>
<p>Placez ensuite ce script fai.sh dans les régles de pre-up du fichier Debian /etc/network/interfaces. Votre connexion ppp sera ainsi demarré au boot de la eeegw. Voir, pour exemple, le mien en fin d&#8217;article.</p>
<p>Finalement, un script pour s&#8217;assurer que votre connexion PPP est bien up avec votre fournisseur d&#8217;accès ADSL. Il est lancé via un cron toutes les 5 minutes ainsi, si la connexion tombe, ce script lui permettra de se relancer automatiquement.<br />
<code>/etc/eeegw/nerim.sh</code><br />
<code lang="bash">#!/bin/bash</p>
<p>#SERVERS="62.4.16.36 feth1-0-thevenin.nerim.net www.nerim.net hsrp1-telehouse.nerim.net feth0-0-julo.nerim.net"<br />
SERVERS2=irc.geeknode.org<br />
STATUS_LINK=0</p>
<p>USER=`id -u`</p>
<p>if [ ! "$USER" = "0" ];<br />
then<br />
  echo "you're not root, you can't check adsl."<br />
  exit<br />
fi</p>
<p>if [ -f /var/run/checkadsl ]<br />
then<br />
  echo already running<br />
  exit<br />
fi</p>
<p>if ! /sbin/ifconfig ppp0 > /dev/null<br />
then<br />
  echo "No pppd running. Restarting NOW."<br />
  killall pppd<br />
  /etc/init.d/networking restart<br />
  exit<br />
fi</p>
<p>touch /var/run/checkadsl</p>
<p>## recupere l'ip du peer<br />
ip=$(/sbin/ifconfig  ppp0 | /bin/grep "P-t-P" | /usr/bin/cut -d":" -f3 | /usr/bin/cut -d" " -f1)<br />
SERVERS=$ip</p>
<p>for i in $SERVERS;<br />
do<br />
  ping -c 3 $i<br />
#1>/dev/null 2>/dev/null<br />
  if [ "$?" = "0" ];<br />
  then<br />
    STATUS_LINK=1<br />
    rm -f /var/run/checkadsl<br />
    echo "exit c est ok on passe au deuxieme test"<br />
  exit 0<br />
  fi<br />
done</p>
<p># on sen bat du test maintenant<br />
if [ "$STATUS_LINK" = "0" ];<br />
then<br />
  echo "ADSL Link DOWN. Restarting NOW."</p>
<p>  /etc/init.d/net.ppp0 restart<br />
  rm -f /var/run/checkadsl<br />
fi</p>
<p>rm -f /var/run/checkadsl</code></p>
<h3>Connexion wifi</h3>
<p>Voici une simple configuration de l&#8217;interface WiFi. Je vous renvoie à la documentation adaptée pour plus de détails.</p>
<p>Placez la clé wep dans /etc/eeegw/fb.key puis créez le script<br />
<code>/etc/eeegw/wifi.sh</code><br />
<code>#!/bin/bash<br />
wlanconfig ath0 destroy<br />
wlanconfig ath0 create wlandev wifi0 wlanmode sta<br />
sleep 5<br />
ifconfig ath0 up<br />
iwconfig ath0 essid freebox key `cat /etc/eeegw/fb.key`<br />
dhclient ath0</code> </p>
<p>Ajoutez /etc/eeegw/wifi.sh à vos régles pre-up du fichier /etc/network/interfaces</p>
<h3>Autre type de connexion </h3>
<p>Si par exemple vous êtes chez Free, je vous conseille de monter votre Freebox en mode <strong>bridge</strong>. Ainsi votre eeegw n&#8217;aura plus qu&#8217;à effectuer un bound dhcp sur eth0 afin d&#8217;obtenir l&#8217;IP publique Free et tous les packets arriveront donc directement sur votre eeegw.</p>
<p>Pour redispatcher la connexion, vous pouvez soit le faire via une seconde carte réseau sur votre eeegw (ou votre pc équivalent), soit transformer votre eeegw en point d&#8217;accès WiFi! Transformer un eeepc en eeeap est expliqué ici : <a href="http://geekshell.org/~bragon/doku/doku.php?id=ap.sh">eeeAP</a> </p>
<p><!--nextpage--><!--pagetitle:Répartition entre plusieurs connexions--></p>
<h3>Faire fonctionner les deux connexions ensemble</h3>
<p>Plusieurs choix s&#8217;offrent à vous:</p>
<ul>
<li>Vous n&#8217;avez qu&#8217;un seul lien vers une seule connexion internet. Passez directement à l&#8217;étape suivante.</li>
<li>Vous avez deux connexions web qui ont le même débit et vous souhaitez partager symétriquement le débit</li>
<li>Vous avez deux connexions web qui n&#8217;ont pas le même débit et vous souhaitez partager asymétriquement le débit</li>
<li>Vous avez deux connexions web qui ont ou pas le même débit : une en tant que connexion principale et l&#8217;autre en secours ou pour certaines routes en particulier</li>
<p>Personnellement j&#8217;utilise cette dernière solution, mais je vais aussi vous expliquer les deux autres possibilités de répartiton.</p>
<h3>Activer IP Forwarding </h3>
<p>Quel que soit les choix que vous ferrez par la suite vous avez besoin d&#8217;activer ip_forward dans votre noyau.</p>
<p>Indispensable pour que votre routeur fonctionne!<br />
<code>/etc/sysctl.conf</code><br />
<code>net.ipv4.ip_forward = 1<br />
net.ipv6.conf.all.forwarding = 1</code></p>
<p>Et rechargez la configuration:<br />
<code># sysctl -p</code></p>
<h3>Distribuer sur deux connexions ayant le même poids</h3>
<p>Imaginons que nous ayons FAI-1 derrière eth1 et FAI-2 derrière eth2. Ce deux connexions sont relativement identiques et nous souhaitons donc simplement distribuer équitablement le traffic et ainsi profiter du débit des deux connexions.</p>
<p>eth1: net=192.168.1.0/24, IP=192.168.1.130, Gateway=192.168.1.1<br />
eth2: net=192.168.2.0/24, IP=192.168.2.131, Gateway=192.168.2.1</p>
<p><code>ip route add 192.168.1.0 dev eth1 src 192.168.1.130 table fai1<br />
ip route add default via 192.168.1.1 table fai1</p>
<p>ip route add 192.168.2.0 dev eth2 src 192.168.2.131 table fai2<br />
ip route add default via 192.168.2.1 table fai2</p>
<p>ip route add 192.168.1.0 dev eth1 src 192.168.1.130 ip route add 192.168.2.0 dev eth2 src 192.168.2.131</p>
<p>ip rule add from 192.168.1.130 table fai1<br />
ip rule add from 192.168.2.131 table fai2</p>
<p>ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 1 nexthop via 192.168.2.1 dev eth2 weight 1</code></p>
<h3>Distribuer sur deux réseaux de poids différents</h3>
<p>Petit schéma explicatif de ce qu&#8217;on peut espérer faire avec une passerelle comme <strong>eeegw</strong></p>
<p>(schéma a compléter)</p>
<p>Un script pour <strong>loadbalancer</strong> les connexions sur <strong>deux wan</strong> ayant différents poids : <strong>Notre eeegw devient multi lien ou dualwan</strong></p>
<p><code lang="bash">#!/bin/bash</p>
<p>##ip rule flush</p>
<p>## recupere l'ip du peer<br />
peer=$(/sbin/ifconfig  ppp0 | /bin/grep "P-t-P" | /usr/bin/cut -d":" -f3 | /usr/bin/cut -d" " -f1)</p>
<p>ip route add ${peer} dev ppp0 table uplink1<br />
#ip route add default via 213.41.185.56 table uplink1</p>
<p>ip route add 192.168.0.0/24 dev ath0 src 192.168.0.12 table uplink2<br />
#ip route add default via 192.168.1.1 table uplink2</p>
<p>ip rule add from 192.168.0.12 table uplink2<br />
ip rule add from 213.41.185.56 table uplink1</p>
<p>ip route add default scope global nexthop via 192.168.0.254 dev ath0 weight 1 nexthop via ${peer} weight 3</code></p>
<p>Le but du script share_wan.sh est d&#8217;enlever les deux routes par defaut engendré par le faite de se connecter en ppp et avec dhcp sur le wifi.<br />
Ensuite il faut mettre en route par defaut soit le lien ppp soit le lien wifi.<br />
La dernière ligne sert a donner un poids de 3 à la connexion Nerim et un poid de 1 à la connexion wifi.</p>
<p>Ainsi on enverra 3 fois plus de packets à Nerim qu&#8217;au WiFi.</p>
<p><code>/etc/eeegw/share_wan.sh</code><br />
<code lang="bash"><br />
#!/bin/bash<br />
ip route del default dev ppp0  scope link<br />
ip route del default via 192.168.0.254 dev ath0<br />
ip route add default scope global nexthop via 192.168.0.254 dev ath0 weight 1 nexthop via ${peer} weight 3<br />
</code></p>
<h3>Routes par defaut / routes statiques</h3>
<p>J&#8217;utilise ce système de route static via mon script route_static.sh pour définir via quel FAI je préfère me rendre pour tel ou tel service. C&#8217;est très pratique. (Je rappelle que j&#8217;utilise le cas numero 4, c&#8217;est à dire que ma connexion ppp est ma connexion principale, mais la connexion wifi ne me sert que ne backup au cas ou, et pour des routes particulières).</p>
<p><code>/etc/eeegw/route_static.sh</code><br />
<code lang="bash">#!/bin/bash</p>
<p>## recupere l'ip du peer PPP<br />
peer=$(/sbin/ifconfig  ppp0 | /bin/grep "P-t-P" | /usr/bin/cut -d":" -f3 | /usr/bin/cut -d" " -f1)</p>
<p># telephone passe par la connexion ppp<br />
ip route add 81.93.243.132 via ${peer}</p>
<p># vpn perso passe par la connexion wifi<br />
ip route add 81.93.247.160 via ${peer}<br />
ip route add 193.47.184.2 via ${peer}<br />
ip route add 94.23.219.37 via 192.168.0.254</code> </p>
<p><!--nextpage--><!--pagetitle:Réseau local--></p>
<h3>Serveur DHCP</h3>
<p>L&#8217;eeegw doit donner des IPs via DHCP aux différentes machines du réseau.<br />
<code># apt-get install dhcpd </code></p>
<p><code>/etc/dhcp3/dhcpd.conf</code><br />
<code># option definitions common to all supported networks...<br />
option domain-name "lucifer.bragon.info";<br />
option domain-name-servers 8.8.8.8;</p>
<p>ddns-update-style none;</p>
<p>authoritative;</p>
<p>default-lease-time 86400;<br />
max-lease-time 86400;</p>
<p>subnet 10.0.69.0 netmask 255.255.255.0 {<br />
  range 10.0.69.10 10.0.69.199;<br />
 option routers 10.0.69.250;<br />
}</p>
<p># Réservations<br />
host satanas {<br />
     hardware ethernet 00:02:b3:21:40:c0;<br />
     fixed-address 10.0.69.18;<br />
     option routers 10.0.69.250;<br />
     option broadcast-address 10.0.69.255;<br />
}</code></p>
<h3>Rajouter des VPN</h3>
<p>Vous pouvez bien sûr rajouter des connexions VPN sur votre eeegw.<br />
En effet cela vous permettra de directement propager la connectivité au VPN à toutes les machines de votre lan.<br />
Pour se faire je vous renvoi vers les articles de target0 et moi même concernant les VPN.</p>
<p><a href="http://geekfault.org/2009/10/04/allocation-dipv6-over-openvpn/">http://geekfault.org/2009/10/04/allocation-dipv6-over-openvpn/</a><br />
<a href="http://geekfault.org/2009/09/24/allocation-dadresses-ipv4-publiques-over-vpn/">http://geekfault.org/2009/09/24/allocation-dadresses-ipv4-publiques-over-vpn/</a></p>
<h3>Quality Of Service / tc qdisc</h3>
<p>La qualité de service sur le reseau est très importante si vous ne voulez pas que vos utilisateurs se plaignent de lags.</p>
<p>Par exemple lorsqu&#8217;un appel en VoIP est émit, il est très désagréable de se mettre à laguer tout d&#8217;un coup car un de vos collaborateurs envoie un e-mail avec une pièce jointe énorme. Pour éviter d&#8217;avoir ce genre de désagrements, il faut mettre des priorités sur le traffic entrant et sortant.</p>
<p>J&#8217;ai décidé de faire un article prochainement afin de vous expliquer comment je gère la QOS de ma eeegw.</p>
<p><!--nextpage--><!--pagetitle:Firewalling et NAT--></p>
<h3>Firewalling</h3>
<p><code>/etc/eeegw/firewall.sh</code><br />
<code lang="bash">#!/bin/bash<br />
# REMISE à ZERO des règles de filtrage<br />
iptables -F<br />
iptables -t nat -F</p>
<p># DEBUT des "politiques par défaut"<br />
# Je veux que les connexions entrantes soient bloquées par défaut<br />
iptables -P INPUT DROP</p>
<p># Je veux que les connexions destinées à être forwardées soient acceptées par défaut<br />
iptables -P FORWARD ACCEPT</p>
<p># Je veux que les connexions sortantes soient acceptées par défaut<br />
iptables -P OUTPUT ACCEPT</p>
<p># FIN des "politiques par défaut"<br />
# Pas de filtrage sur l'interface de "loopback"<br />
iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A INPUT -i eth0 -j ACCEPT</p>
<p>#on ne filtre pas les vpn<br />
iptables -A INPUT -i tap0 -j ACCEPT<br />
iptables -A INPUT -i tap1 -j ACCEPT<br />
iptables -A INPUT -i ethylix0 -j ACCEPT</p>
<p># J'accepte le protocole ICMP (i.e. le "ping")<br />
iptables -A INPUT -p icmp -j ACCEPT</p>
<p># J'accepte le protocole IGMP (pour le multicast)<br />
iptables -A INPUT -p igmp -j ACCEPT</p>
<p># J'accepte les packets entrants relatifs ? des connexions d?j? ?tablies<br />
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT</p>
<p>#ssh<br />
iptables -A INPUT -p tcp --dport 22 -j ACCEPT<br />
iptables -A INPUT -p tcp --dport 2605 -j ACCEPT</p>
<p>#apache<br />
iptables -A INPUT -p tcp --dport 80 -j ACCEPT<br />
iptables -A INPUT -p tcp --dport 443 -j ACCEPT</p>
<p>#tftp<br />
iptables -A INPUT -p udp --dport 69 -j ACCEPT</p>
<p>#mon smtp<br />
iptables -A INPUT -p tcp --dport 25 -j ACCEPT</p>
<p>#vpn<br />
iptables -A INPUT -p tcp --dport 7777 -j ACCEPT</p>
<p># voip<br />
#iptables -A INPUT -p tcp --dport 5060 -j ACCEPT<br />
#iptables -A INPUT -p tcp --dport 5061 -j ACCEPT</p>
<p># supervision zabbix</p>
<p>iptables -A INPUT -p tcp --dport 10050 -j ACCEPT<br />
iptables -A INPUT -p tcp --dport 10051 -j ACCEPT</p>
<p>#Munin<br />
iptables -A INPUT -p tcp --dport 4949 -j ACCEPT</p>
<p># La règle par défaut pour la chaine INPUT devient "REJECT" (il n'est pas possible de mettre REJECT comme politique par défaut)<br />
#iptables -A INPUT -j REJECT</p>
<p>#forward de la connection<br />
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE<br />
iptables -t nat -A POSTROUTING -o ath0 -j MASQUERADE<br />
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE<br />
iptables -t nat -A POSTROUTING -o tap1 -j MASQUERADE<br />
iptables -t nat -A POSTROUTING -o ethylix0 -j MASQUERADE</p>
<p>iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o ppp0 --clamp-mss-to-pmtu</code></p>
<p>Le but du script de firewall est d&#8217;être lancé une première fois, puis d&#8217;être sauvegardé comme la Debian-Way le suggère. Pocédons donc comme suit :<br />
<code># sh /etc/eeegw/firewall.sh<br />
# iptables-save > /etc/network/firewall</code><br />
Ainsi au boot des interfaces la machine lancera les règles iptables sauvegardées. </p>
<h3>Firewall en sortie</h3>
<p>NB : Dans cette exemple le firewall n&#8217;agit qu&#8217;en entrée, c&#8217;est à dire que par defaut nous laissons tout sortir sur le réseau. Vous pourriez sans aucun soucis filtrer en sortie. </p>
<p>Exemple de regles de filtrage en sortie :<br />
<code># A mettre en début de script pour n'accepter explicitement QUE ce qui est autorisé.<br />
iptables -P OUTPUT DROP</p>
<p># Règles output fonctionnement de base<br />
iptables -A OUTPUT -p tcp -o eth0 --dport domain -j ACCEPT<br />
iptables -A OUTPUT -p udp -o eth0 --dport domain -j ACCEPT<br />
iptables -A OUTPUT -p tcp -o eth0 --dport ntp -j ACCEPT<br />
iptables -A OUTPUT -p udp -o eth0 --dport ntp -j ACCEPT<br />
iptables -A OUTPUT -p tcp -o eth0 --dport rsync -j ACCEPT<br />
iptables -A OUTPUT -p udp -o eth0 --dport rsync -j ACCEPT<br />
iptables -A OUTPUT -p tcp -o eth0 --dport http -j ACCEPT<br />
iptables -A OUTPUT -p tcp -o eth0 --dport smtp -j ACCEPT<br />
iptables -A OUTPUT -p tcp -o eth0 --dport ssh -j ACCEPT<br />
iptables -A OUTPUT -p tcp -o eth0 --dport ftp -j ACCEPT</code></p>
<h3> Explication fonctionnement du NAT </h3>
<p>Imaginons que vous ayez un serveur FTP sur la machine A.<br />
Imaginons que vous ayez un serveur Web sur la machine B.<br />
Afin qu&#8217;un client puisse s&#8217;y connecter en venant de l&#8217;internet vous ne pouvez pas lui donner comme adresse afin de s&#8217;y connecter une des ip de votre LAN, mais l&#8217;ip que vous a attribué le FAI lors de votre connexion à celui-ci.<br />
Le NAT est le fait que la eeegw sache vers quelle machine transmettre le traffic de tel ou tel service.<br />
Ainsi le client établi une connexion FTP vers votre IP publique, la connexion FTP arrive sur votre eeegw qui va savoir qu&#8217;il faut qu&#8217;elle transmette ce traffic vers la machine A.</p>
<p>Pour plus d&#8217;explication sur comment faire ça, allez voir la partie firewall de la documentation.<br />
Pour plus d&#8217;explication n&#8217;hésitez pas à aller lire la <a href="http://fr.wikipedia.org/wiki/Network_address_translation">documentation Wikipédia sur le sujet</a>.</p>
<h3>Régles de NAT</h3>
<p>Vous avez besoin d&#8217;ouvrir un port sur votre eeegw qui redirige sur une des machines de votre lan ?<br />
Rien de plus simple. Procédez comme suit si vous avez par exemple un serveur web derrière 10.0.69.1 :</p>
<p><code># iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 10.0.69.1:80</code></p>
<p>Ensuite on save la nouvelle régle dans les régles devant se lancer au boot :<br />
<code># iptables-save > /etc/network/firewall</code></p>
<p>Votre nouvelle règle de NAT/Firewall est donc automatiquement activée sans avoir à faire quoi que ce soit de plus sur votre eeegw.</p>
<p><!--nextpage--><!--pagetitle:Exécution des scripts au boot--></p>
<h3> Automatiser le lancement des scripts eeegw_script au boot</h3>
<p><code>/etc/network/interfaces</code><br />
<code>auto lo<br />
iface lo inet loopback</p>
<p># The primary network interface<br />
allow-hotplug eth0<br />
iface eth0 inet static<br />
        address 10.0.69.250<br />
        netmask 255.255.255.0<br />
        network 10.0.69.0<br />
        broadcast 10.0.69.255<br />
        pre-up iptables-restore -c /etc/network/firewall</p>
<p>auto ath0<br />
iface ath0 inet dhcp<br />
wireless_mode Managed</p>
<p>pre-up /etc/eeegw/wifi.sh<br />
pre-up /etc/eeegw/nerim.sh<br />
pre-up /etc/eeegw/route_static.sh<br />
pre-up /etc/eeegw/ethylix.sh<br />
pre-up /etc/eeegw/QOS/qos.sh</code></p>
<p><!--nextpage--><!--pagetitle:Monitoring--></p>
<h3>Et si on monitorait /graphait tout ça ?</h3>
<p>Exemple de graph que l&#8217;on va pouvoir obtenir grace à ce super howto  (vu mensuel de ma connexion internet) :<br />
<a href="http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/if_eth0-month-2/" rel="attachment wp-att-1862"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2009/12/if_eth0-month-300x169.png" alt="" title="if_eth0-month" width="300" height="169" class="aligncenter size-medium wp-image-1862" /></a></p>
<p>Second Exemple: vue journalière de l&#8217;utilisation d&#8217;une connexion par un vpn.<br />
<a href="http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/if_ethylix0-day-2/" rel="attachment wp-att-1863"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2009/12/if_ethylix0-day-300x169.png" alt="" title="if_ethylix0-day" width="300" height="169" class="aligncenter size-medium wp-image-1863" /></a></p>
<h3>Installation</h3>
<p><code># apt-get install munin apache2 munin-node<br />
# cd /usr/share/munin/plugins/<br />
# ls</code></p>
<p>Repérez ici les choses qu&#8217;il serait intéressant de grapher sur votre munin puis :<br />
<code># cd /etc/munin/plugins<br />
# ln -s /usr/share/munin/plugins/acpi<br />
# ln -s /usr/share/munin/plugins/apache_processes<br />
# ln -s /usr/share/munin/plugins/cpu<br />
# ln -s /usr/share/munin/plugins/df<br />
# ln -s /usr/share/munin/plugins/swap<br />
[....]</code></p>
<p><code>/etc/munin/munin.conf</code><br />
<code>[localhost.localdomain]<br />
    address 127.0.0.1<br />
    use_node_name yes</code></p>
<p>Relancez munin-node<br />
<code># /etc/init.d/munin-node restart</code></p>
<p>Ça devrait grapher tout simplement comme ça sous debian (l&#8217;installation sous gentoo demande un peu plus de délicatesses). Pour plus de détails : <a href="http://eeegw-ip-adresse/munin">http://eeegw-ip-adresse/munin</a>.</p>
<p><!--nextpage--><!--pagetitle:Annexe et exemples--></p>
<h3>Sortie de ifconfig</h3>
<p><code>ath0      Link encap:Ethernet  HWaddr 06:15:af:8d:37:37<br />
          inet adr:192.168.0.12  Bcast:192.168.0.255  Masque:255.255.255.0<br />
          adr inet6: fe80::415:afff:fe8d:3737/64 Scope:Lien<br />
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
          RX packets:13848732 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:4385032 errors:0 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:0<br />
          RX bytes:1482140328 (1.3 GiB)  TX bytes:307281227 (293.0 MiB)</p>
<p>eth0      Link encap:Ethernet  HWaddr 00:1f:c6:28:71:9e<br />
          inet adr:10.0.69.250  Bcast:10.0.69.255  Masque:255.255.255.0<br />
          adr inet6: fe80::21f:c6ff:fe28:719e/64 Scope:Lien<br />
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
          RX packets:256988818 errors:0 dropped:0 overruns:0 frame:4160<br />
          TX packets:258912344 errors:0 dropped:0 overruns:0 carrier:6<br />
          collisions:0 lg file transmission:1000<br />
          RX bytes:3516383801 (3.2 GiB)  TX bytes:0 (0.0 B)<br />
          MÃ©moire:fbfc0000-fc000000 </p>
<p>ethylix0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00<br />
          inet adr:194.110.69.23  P-t-P:194.110.69.17  Masque:255.255.255.255<br />
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1<br />
          RX packets:4099 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:3932 errors:0 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:500<br />
          RX bytes:286787 (280.0 KiB)  TX bytes:399957 (390.5 KiB)</p>
<p>lo        Link encap:Boucle locale<br />
          inet adr:127.0.0.1  Masque:255.0.0.0<br />
          adr inet6: ::1/128 Scope:HÃ´te<br />
          UP LOOPBACK RUNNING  MTU:16436  Metric:1<br />
          RX packets:4493171 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:4493171 errors:0 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:0<br />
          RX bytes:532519851 (507.8 MiB)  TX bytes:532519851 (507.8 MiB)</p>
<p>ppp0      Link encap:Protocole Point-Ã -Point<br />
          inet adr:213.41.185.56  P-t-P:62.4.16.251  Masque:255.255.255.255<br />
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1<br />
          RX packets:6108340 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:4219070 errors:0 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:3<br />
          RX bytes:2251583910 (2.0 GiB)  TX bytes:836111670 (797.3 MiB)</p>
<p>tap0      Link encap:Ethernet  HWaddr 00:ff:b7:de:c8:b4<br />
          inet adr:10.0.1.2  Bcast:10.0.1.255  Masque:255.255.255.0<br />
          adr inet6: 2001:758:f00:8:2ff:b7ff:fede:c8b4/64 Scope:Global<br />
          adr inet6: fe80::2ff:b7ff:fede:c8b4/64 Scope:Lien<br />
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
          RX packets:4716451 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:2796718 errors:0 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:100<br />
          RX bytes:4275489693 (3.9 GiB)  TX bytes:358571500 (341.9 MiB)</p>
<p>tap1      Link encap:Ethernet  HWaddr 00:ff:63:b8:57:ea<br />
          inet adr:81.93.X.X  Bcast:81.93.X.X  Masque:255.255.255.128<br />
          adr inet6: 2001:758:f00:cafe:2ff:63ff:feb8:57ea/64 Scope:Global<br />
          adr inet6: fe80::2ff:63ff:feb8:57ea/64 Scope:Lien<br />
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
          RX packets:43229918 errors:0 dropped:0 overruns:0 frame:0<br />
          TX packets:26631144 errors:0 dropped:1826 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:100<br />
          RX bytes:3891532561 (3.6 GiB)  TX bytes:4009241435 (3.7 GiB)</p>
<p>wifi0     Link encap:UNSPEC  HWaddr 00-15-AF-8D-37-37-65-74-00-00-00-00-00-00-00-00<br />
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
          RX packets:226972539 errors:0 dropped:0 overruns:0 frame:6623910<br />
          TX packets:5796868 errors:44600 dropped:0 overruns:0 carrier:0<br />
          collisions:0 lg file transmission:280<br />
          RX bytes:2128136633 (1.9 GiB)  TX bytes:515534254 (491.6 MiB)<br />
          Interruption:18 </code></p>
<h3>Sortie de iproute</h3>
<p><code>194.110.69.17 dev ethylix0  proto kernel  scope link  src 194.110.69.23<br />
216.165.129.135 via 192.168.0.254 dev ath0<br />
140.211.166.134 via 192.168.0.254 dev ath0<br />
213.186.33.19 via 192.168.0.254 dev ath0<br />
149.20.20.135 via 192.168.0.254 dev ath0<br />
130.239.17.6 via 192.168.0.254 dev ath0<br />
94.23.219.37 via 192.168.0.254 dev ath0<br />
217.23.9.148 via 192.168.0.254 dev ath0<br />
204.152.191.39 via 192.168.0.254 dev ath0<br />
78.41.233.57 via 192.168.0.254 dev ath0<br />
213.251.172.23 via 192.168.0.254 dev ath0<br />
156.56.247.195 via 192.168.0.254 dev ath0<br />
62.4.16.251 dev ppp0  proto kernel  scope link  src 213.41.185.56<br />
81.93.247.0/25 dev tap1  proto kernel  scope link  src 81.93.247.10<br />
193.200.171.0/24 via 81.93.247.1 dev tap1<br />
10.0.69.0/24 dev eth0  proto kernel  scope link  src 10.0.69.250<br />
91.199.232.0/24 via 81.93.247.1 dev tap1<br />
10.0.1.0/24 dev tap0  proto kernel  scope link  src 10.0.1.2<br />
195.190.3.0/24 via 81.93.247.1 dev tap1<br />
192.168.0.0/24 dev ath0  proto kernel  scope link  src 192.168.0.12<br />
193.200.226.0/24 via 81.93.247.1 dev tap1<br />
91.198.105.0/24 via 81.93.247.1 dev tap1<br />
91.209.245.0/24 via 81.93.247.1 dev tap1<br />
193.200.181.0/24 via 81.93.247.1 dev tap1<br />
78.41.232.0/21 via 81.93.247.1 dev tap1<br />
91.191.144.0/20 via 81.93.247.1 dev tap1<br />
81.93.240.0/20 via 81.93.247.1 dev tap1<br />
169.254.0.0/16 dev eth0  scope link  metric 1000<br />
10.0.0.0/8 via 10.0.1.1 dev tap0<br />
default dev ppp0  scope link</code></p>
<h3>Ma eeegw en production <img src='http://geekfault.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </h3>
<p><a href="http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/img00260-2/" rel="attachment wp-att-1869"><img style=' display: block; margin-right: auto; margin-left: auto;' align="center"   src="http://geekfault.org/wp-content/uploads/2009/12/IMG00260-580x435.jpg" alt="" title="IMG00260" width="580" height="435" class="aligncenter size-large wp-image-1869" /></a></p>
<p><!--nextpage--><!--pagetitle:Bibliographie--></p>
<h3>Les liens interessants </h3>
<p><a href="http://upload.wikimedia.org/wikipedia/fr/3/3e/Netfilter_schema.png">http://upload.wikimedia.org/wikipedia/fr/3/3e/Netfilter_schema.png</a><br />
<a href="http://wiki.gcu.info/doku.php?id=linux:openvpn_multi-listeners_debian">http://wiki.gcu.info/doku.php?id=linux:openvpn_multi-listeners_debian</a><br />
<a href="http://forums.whirlpool.net.au/forum-replies-archive.cfm/983045.html">Dual wan Cisco</a><br />
<a href="http://www.dslreports.com/forum/remark,16388383?hilite=ip+sla">http://www.dslreports.com/forum/remark,16388383?hilite=ip+sla</a><br />
<a href="http://pauldotcom.com/2009/05/modding-the-asus-eee-4g-surf-f.html">Antenne wifi externe sur sa eeegw</a><br />
<a href="http://chris.olstrom.com/blog/howto/setup-dual-wan/">http://chris.olstrom.com/blog/howto/setup-dual-wan/</a><br />
<a href="http://tldp.org/HOWTO/Traffic-Control-HOWTO/">http://tldp.org/HOWTO/Traffic-Control-HOWTO/</a><br />
<a href="http://markmail.org/message/aronyjanpuxenvug">http://markmail.org/message/aronyjanpuxenvug</a><br />
<a href="http://lartc.org/howto/lartc.rpdb.multiple-links.html">http://lartc.org/howto/lartc.rpdb.multiple-links.html</a></p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2010/02/20/eeegw-ze-retour-du-detour-proxycache/' rel='bookmark' title='EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.'>EeeGW &#8211; ZE retour du détour ! &#8211; Proxycache.</a></li>
<li><a href='http://geekfault.org/2010/05/24/eeegw-part-iii-quality-of-service-aka-qos/' rel='bookmark' title='Eeegw &#8211; part III &#8211; Quality Of Service aka QOS'>Eeegw &#8211; part III &#8211; Quality Of Service aka QOS</a></li>
<li><a href='http://geekfault.org/2009/05/20/firmware-linksys-wag200g/' rel='bookmark' title='Firmware modifié pour Linksys WAG200G'>Firmware modifié pour Linksys WAG200G</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2009/12/31/construire-sa-gateway-from-scratch/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Facebook s&#8217;apprêterait à lancer son serveur XMPP</title>
		<link>http://geekfault.org/2009/12/14/facebook-lancer-son-serveur-xmpp/</link>
		<comments>http://geekfault.org/2009/12/14/facebook-lancer-son-serveur-xmpp/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 05:50:16 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[im]]></category>
		<category><![CDATA[messagerie]]></category>
		<category><![CDATA[xmpp]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1649</guid>
		<description><![CDATA[Le 14 mai 2008, un développeur Facebook annonçait qu&#8217;ils travaillaient sur un serveur XMPP (Jabber) compatible avec son système de chat, permettant ainsi à tout le monde d&#8217;utiliser un client de messagerie instantannée classique pour chatter sur Facebook. Depuis cette annonce, nous n&#8217;avions plus de nouvelles. Mais au début du mois dernier ProcessOne annonçait avoir [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2011/02/19/reverse-ssh-acceder-a-un-serveur-derriere-un-natfirewall/' rel='bookmark' title='Reverse SSH : accéder à un serveur derrière un NAT/Firewall'>Reverse SSH : accéder à un serveur derrière un NAT/Firewall</a></li>
<li><a href='http://geekfault.org/2009/05/27/lighttpd-php-iphone/' rel='bookmark' title='Serveur Lighttpd avec PHP sur iPhone'>Serveur Lighttpd avec PHP sur iPhone</a></li>
<li><a href='http://geekfault.org/2011/10/14/lancer-votre-dual-booting-windows-dans-une-virtualbox/' rel='bookmark' title='Lancer votre dual-booting Windows dans une VirtualBox'>Lancer votre dual-booting Windows dans une VirtualBox</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/12/Facebook-XMPP.jpg" alt="Facebook-XMPP" title="Facebook-XMPP" width="200" height="206" class="alignleft size-full wp-image-1669" />Le 14 mai 2008, un développeur Facebook annonçait qu&#8217;ils travaillaient sur un <strong>serveur XMPP (Jabber) compatible avec son système de chat</strong>, permettant ainsi à tout le monde d&#8217;utiliser un client de messagerie instantannée classique pour chatter sur Facebook.</p>
<p>Depuis cette annonce, nous n&#8217;avions plus de nouvelles. Mais au début du mois dernier <a href="http://www.process-one.net/en/blogs/article/facebook_chat_supports_xmpp_with_ejabberd/">ProcessOne annonçait</a> avoir <strong>découvert un serveur XMPP</strong> hébergé sur <span style="font-family: monospace;">chat.facebook.com</span> !<br />
<!--more--></p>
<div style="background: #FFFABF; -moz-border-radius: 6px; padding: 4px;"><strong>Attention :</strong> Cet article est sujet aux trolls sur l&#8217;utilité des réseaux sociaux <img src='http://geekfault.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </div>
<h3>Une vieille idée</h3>
<p>Facebook a lancé son système de chat le 7 avril 2008, via son <strong>interface web</strong>. Dès le début on s&#8217;est vite rendus compte qu&#8217;elle n&#8217;était pas très stable et nous obligeait à garder l&#8217;onglet Facebook ouvert en permanence.</p>
<p>Et le 14 mai, <a href="http://developers.facebook.com/news.php?blog=1&#038;story=110">un développeur annonce</a> qu<strong>&#8216;ils développent activement une interface XMPP</strong> compatible avec ce chat. Pourtant, depuis ce post, on n&#8217;en a plus entendu parler (<a href="http://www.facebook.com/group.php?gid=15400426431">malgré les nombreux groupes</a>, <a href="http://bugs.developers.facebook.com/show_bug.cgi?id=3152">wish reports</a> et <a href="http://docs.google.com/View?id=ddf6gq8k_32dbsgnghj">lettres ouvertes</a> le réclamant).</p>
<h3>Mais une très bonne idée</h3>
<p><a href="http://geekfault.org/wp-content/uploads/2009/12/Facebook-Chat.jpg" title="Facebook-Chat" rel="lightbox.1649"><img style=' float: right; padding: 4px; margin: 0 0 2px 7px;' align="right"   src="http://geekfault.org/wp-content/uploads/2009/12/Facebook-Chat-264x300.jpg" alt="Facebook-Chat" title="Facebook-Chat" width="264" height="300" class="alignright size-medium wp-image-1677" /></a>Dès le lancement du chat Facebook, celui-ci a rencontré un <strong>grand succès</strong>. Après tout, quel est l&#8217;intérêt d&#8217;un IM si ce n&#8217;est de parler avec ses amis? Et Facebook connait, à priori, une grande partie de ceux-ci. J&#8217;ai personnellement remarqué que la plupart de mes contacts avaient délaissé MSN pour n&#8217;utiliser plus que ce chat Facebook.</p>
<p>Mais évidemment on se heurte vite aux <strong>limites des web-apps</strong> : lenteurs, instabilités, utilisation d&#8217;un navigateur, absence de notifications et <strong>encore instabilités</strong>! Je suppose que c&#8217;est ce qui a motivé les développeurs à utiliser un vrai protocole de messagerie instantannée.</p>
<h3>Le XMPP</h3>
<p>Le serveur de chat de Facebook découvert par ProcessOne a été déployé sur <span style="font-family: monospace;">chat.facebook.com</span> (port 5222, port standard serveur-client pour Jabber) et répond aux requêtes de type <strong>XMPP</strong>!</p>
<p>Nous ne pouvons que saluer le choix de Facebook pour ce <strong>protocole libre</strong> et déjà supporté par une multitude de clients de messagerie instantannée, <strong>aussi bien desktops que mobiles</strong>!</p>
<p>Le <a href="http://fr.wikipedia.org/wiki/XMPP">XMPP</a> n&#8217;a malheureusement jamais connu le succès escompté, loin derrière Yahoo! Messenger et Microsoft Live Messenger aux protocoles propriétaires mal implémentés dans nos logiciels libres. Facebook va peut-être redorer un peu le blason de ce protocole délaissé en lui apportant ses 350 millions d&#8217;utilisateurs.</p>
<p>On regrettera tout de même que, selon les scans de ports, Facebook n&#8217;a <strong>pas activé le server-to-server</strong> qui aurait permis aux utilisateurs du chat Facebook de communiquer avec des utilisateurs de réseaux Jabber concurrents et vice-versa.</p>
<h3>À quand le déploiement public?</h3>
<p>Même si le serveur de type ejabberd modifié <strong>répond aux requêtes de connexion</strong>, il répond toujours <strong>par la négative</strong>. Facebook n&#8217;a pas encore fait d&#8217;annonce publique, sans doute parce que le service est actuellement en phase de tests.</p>
<p><a href="http://geekfault.org/wp-content/uploads/2009/12/Facebook-Ads.gif" title="Facebook-Ads" rel="lightbox.1649"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/12/Facebook-Ads-300x133.gif" alt="Facebook-Ads" title="Facebook-Ads" width="300" height="133" class="alignleft size-medium wp-image-1679" /></a>L&#8217;existence de ce serveur est encourageante, mais on est en droit de se demander si les administrateurs de Facebook valideront sa mise en service puisqu&#8217;ils n&#8217;ont, à priori, aucun moyen de le <strong>monétiser</strong>&#8230;</p>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2011/02/19/reverse-ssh-acceder-a-un-serveur-derriere-un-natfirewall/' rel='bookmark' title='Reverse SSH : accéder à un serveur derrière un NAT/Firewall'>Reverse SSH : accéder à un serveur derrière un NAT/Firewall</a></li>
<li><a href='http://geekfault.org/2009/05/27/lighttpd-php-iphone/' rel='bookmark' title='Serveur Lighttpd avec PHP sur iPhone'>Serveur Lighttpd avec PHP sur iPhone</a></li>
<li><a href='http://geekfault.org/2011/10/14/lancer-votre-dual-booting-windows-dans-une-virtualbox/' rel='bookmark' title='Lancer votre dual-booting Windows dans une VirtualBox'>Lancer votre dual-booting Windows dans une VirtualBox</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2009/12/14/facebook-lancer-son-serveur-xmpp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Backup d&#8217;un compte Gmail</title>
		<link>http://geekfault.org/2009/10/24/backup-dun-compte-gmail/</link>
		<comments>http://geekfault.org/2009/10/24/backup-dun-compte-gmail/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 00:58:50 +0000</pubDate>
		<dc:creator>Tito</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[imap]]></category>

		<guid isPermaLink="false">http://geekfault.org/?p=1541</guid>
		<description><![CDATA[Il y a quelques jours, Google a dû désactiver un compte e-mail légitime. Immédiatement je me suis imaginé dans cette situation insoutenable que serait la perte de toute ma correspondance depuis deux ans ! En effet aujourd&#8217;hui je préfère faire confiance à Google pour conserver mes messages plutôt que risquer la perte de ceux-ci après [...]
<h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
<li><a href='http://geekfault.org/2009/08/05/wave-1-c-est-quoi-wave/' rel='bookmark' title='Google Wave #1 : C&#8217;est quoi Wave?'>Google Wave #1 : C&#8217;est quoi Wave?</a></li>
<li><a href='http://geekfault.org/2009/08/17/exit-google/' rel='bookmark' title='La recherche web… sans Google!'>La recherche web… sans Google!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/09/GmailBackup-Logo-300x53.png" alt="GmailBackup-Logo" title="GmailBackup-Logo" width="300" height="53" class="alignleft size-medium wp-image-1546" />Il y a quelques jours, <a href="http://www.numerama.com/magazine/14079-google-doit-suspendre-un-compte-gmail-a-cause-d-un-e-mail-recu.html">Google a dû désactiver un compte e-mail légitime</a>. Immédiatement je me suis imaginé dans cette situation insoutenable que serait la perte de toute ma correspondance depuis deux ans !</p>
<p>En effet aujourd&#8217;hui je préfère faire confiance à Google pour conserver mes messages plutôt que risquer la perte de ceux-ci après un crash de mon disque dur. Mais comment tout de même faire un backup mensuel de mon compte Google Apps?<br />
<!--more--></p>
<h3>Gmail Backup</h3>
<p><a href="http://geekfault.org/wp-content/uploads/2009/09/Gmail-Backup.png" title="Gmail Backup" rel="lightbox.1541"><img style=' float: left; padding: 4px; margin: 0 7px 2px 0;' align="left"   src="http://geekfault.org/wp-content/uploads/2009/09/Gmail-Backup-279x300.png" alt="Gmail Backup" title="Gmail Backup" width="279" height="300" class="alignleft size-medium wp-image-1542" /></a>Je suis tombé sur un projet intéressant : <a href="http://www.gmail-backup.com"><strong>Gmail Backup</strong></a>, compatible Windows et Linux. Pour Linux vous aurez le choix entre la ligne de commande et une petite interface en wxPython.</p>
<p>L&#8217;<strong>interface graphique</strong> est très simple d&#8217;utilisation puisqu&#8217;elle vous demande votre adresse Gmail, mot de passe et dossier où enregistrer le backup. On peut éventuellement demander de <strong>ne sauvegarder qu&#8217;une certaine période</strong> dans le temps.</p>
<p>L&#8217;<strong>interface en ligne de commande</strong> est tout aussi puissante, et très pratique si vous souhaitez faire vos backups sur un serveur SSH. </p>
<ul>
<li>Sauvegarder tout le compte : <code>./gmail-backup.sh backup /dossier/où/backup user@gmail.com password</code></li>
<li>Sauvegarder du 28/02/2008 au 31/08/2009 : <code>./gmail-backup.sh backup /dossier/où/backup user@gmail.com password 20080228 20090831</code></li>
<li>Restaurer un backup : <code>./gmail-backup.sh restore /dossier/où/backup user@gmail.com password</code></li>
</ul>
<h3>IMAP Backup</h3>
<p> Personnellement j&#8217;ai une confiance totale en Google pour conserver mes données (Troll inside). Si toutefois vous êtes chez un autre prestataire, le seul moyen efficace que j&#8217;aie trouvé pour faire un backup est d&#8217;utiliser un client e-mail tel que Thunderbird. </p>
<p>Si vous êtes intéressé par un tel backup, je vous renvoie à d&#8217;autres sites:</p>
<ul>
<li><a href="http://kb.wisc.edu/helpdesk/page.php?id=4037">En anglais et très bien illustré</a></li>
<li><a href="http://blog.donax.ch/index.php?p=318">Ou en français si vous êtes vraiment allergique à l&#8217;anglais</a></li>
<p><h3>Si vous avez aimé ce post...</h3><ol>
<li><a href='http://geekfault.org/2009/05/16/rsnapshot/' rel='bookmark' title='Mise en place d&#8217;un système de backup avec Rsnapshot'>Mise en place d&#8217;un système de backup avec Rsnapshot</a></li>
<li><a href='http://geekfault.org/2009/08/05/wave-1-c-est-quoi-wave/' rel='bookmark' title='Google Wave #1 : C&#8217;est quoi Wave?'>Google Wave #1 : C&#8217;est quoi Wave?</a></li>
<li><a href='http://geekfault.org/2009/08/17/exit-google/' rel='bookmark' title='La recherche web… sans Google!'>La recherche web… sans Google!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://geekfault.org/2009/10/24/backup-dun-compte-gmail/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

