<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>mov ah,31h int 21h</title><link href="https://www.int21h.eu/" rel="alternate"></link><link href="https://www.int21h.eu/feeds/all.atom.xml" rel="self"></link><id>https://www.int21h.eu/</id><updated>2020-04-05T12:30:00+02:00</updated><entry><title>Utilisation d'un kernel Mainline sous Ubuntu</title><link href="https://www.int21h.eu/mainline-kernel-ubuntu.html" rel="alternate"></link><published>2020-04-05T12:30:00+02:00</published><updated>2020-04-05T12:30:00+02:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2020-04-05:/mainline-kernel-ubuntu.html</id><summary type="html">&lt;p&gt;Salut à tous. Petite mise à jour après une longue absence pour vous parler de
Kernel Linux dans sa version &lt;em&gt;mainline&lt;/em&gt;, et de son installation sous Ubuntu quand
vous utiliser &lt;strong&gt;SecureBoot&lt;/strong&gt; (surement sans le savoir).&lt;/p&gt;
&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Commençons par une simple question, &lt;strong&gt;pourquoi&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Plusieurs raison pour installer le kernel &lt;em&gt;mainline&lt;/em&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Une …&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Salut à tous. Petite mise à jour après une longue absence pour vous parler de
Kernel Linux dans sa version &lt;em&gt;mainline&lt;/em&gt;, et de son installation sous Ubuntu quand
vous utiliser &lt;strong&gt;SecureBoot&lt;/strong&gt; (surement sans le savoir).&lt;/p&gt;
&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Commençons par une simple question, &lt;strong&gt;pourquoi&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Plusieurs raison pour installer le kernel &lt;em&gt;mainline&lt;/em&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Une version plus récente que le kernel fourni par Ubuntu est disponible, et
celle-ci apporte des améliorations sur un ou plusieurs drivers dont vous avez
besoin.&lt;/li&gt;
&lt;li&gt;Vous développer un driver et avez besoin de la toute dernière version pour
celui-ci.&lt;/li&gt;
&lt;li&gt;Vous aimez vivre dangeureusement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personellement, ma nouvelle carte graphique, une Radeon RX5500 XT 8Go, basé sur
l'architecture RDNA de AMD va bientôt arriver à la maison. Et coté driver, la
dernier version 5.6 du kernel Linux apporte beaucoup d'amélioration. Voir sur le
site &lt;a class="reference external" href="https://www.phoronix.com"&gt;Phoronix&lt;/a&gt; les pages &lt;a class="reference external" href="https://www.phoronix.com/scan.php?page=news_item&amp;amp;px=Linux-5.6-AMDGPU-Test-Drive"&gt;Running The Linux 5.6 Kernel With AMD Radeon Graphics&lt;/a&gt;
et &lt;a class="reference external" href="https://www.phoronix.com/scan.php?page=article&amp;amp;item=linux-56-features&amp;amp;num=1"&gt;Linux 5.6 Is The Most Exciting Kernel In Years&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Donc, j'anticipe un petit peu l'installation de cette version du kernel Linux
sous Ubuntu 19.10.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;L'installation du kernel &lt;em&gt;mainline&lt;/em&gt; sur Ubuntu 19.10 est relativement simple.
Il suffit de télécharger les packages &lt;tt class="docutils literal"&gt;.deb&lt;/tt&gt; sur le site &lt;em&gt;officiel&lt;/em&gt; des
kernel &lt;em&gt;Mainline&lt;/em&gt; pour Ubuntu.&lt;/p&gt;
&lt;p&gt;Aller sur la page &lt;a class="reference external" href="https://wiki.ubuntu.com/Kernel/MainlineBuilds"&gt;MainlineBuilds&lt;/a&gt; et naviguer vers le répertoire du dernier
kernel disponible &lt;a class="reference external" href="https://kernel.ubuntu.com/~kernel-ppa/mainline/?C=N;O=D"&gt;ici&lt;/a&gt; (5.6.2 à l'heure d'écrire cette petite page).&lt;/p&gt;
&lt;p&gt;Puis télécharger tous les fichiers &lt;tt class="docutils literal"&gt;.deb&lt;/tt&gt; nécessaire à votre architecture et
vos besoins (kernel &lt;em&gt;normal&lt;/em&gt; vs. &lt;em&gt;lowlatency&lt;/em&gt;) ainsi que les fichiers
&lt;tt class="docutils literal"&gt;CHECKSUMS&lt;/tt&gt;. La liste si dessous pour mon cas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;CHECKSUMS
CHECKSUMS.gpg
linux-headers-5.6.2-050602_5.6.2-050602.202004020822_all.deb
linux-headers-5.6.2-050602-lowlatency_5.6.2-050602.202004020822_amd64.deb
linux-image-unsigned-5.6.2-050602-lowlatency_5.6.2-050602.202004020822_amd64.deb
linux-modules-5.6.2-050602-lowlatency_5.6.2-050602.202004020822_amd64.deb
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Après téléchargement, &lt;strong&gt;verifiez les signatures des fichiers&lt;/strong&gt; puis installez
les avec la commande suivante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;bureau:~/Téléchargements$&lt;/span&gt; gpg --recv-key &lt;span class="s2"&gt;&amp;quot;60AA7B6F30434AE68E569963E50C6A0917C622B0&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;...&lt;/span&gt;

&lt;span class="gp"&gt;bureau:~/Téléchargements$&lt;/span&gt; gpg --verify CHECKSUMS.gpg CHECKSUMS
&lt;span class="go"&gt;gpg: Signature faite le jeu. 02 avril 2020 16:31:29 CEST&lt;/span&gt;
&lt;span class="go"&gt;gpg:                avec la clef RSA E50C6A0917C622B0&lt;/span&gt;
&lt;span class="go"&gt;gpg: Bonne signature de « Kernel PPA &amp;lt;kernel-ppa@canonical.com&amp;gt; » [inconnu]&lt;/span&gt;
&lt;span class="go"&gt;gpg: Attention : cette clef n&amp;#39;est pas certifiée avec une signature de confiance.&lt;/span&gt;
&lt;span class="go"&gt;gpg:          Rien n&amp;#39;indique que la signature appartient à son propriétaire.&lt;/span&gt;
&lt;span class="go"&gt;Empreinte de clef principale : 60AA 7B6F 3043 4AE6 8E56  9963 E50C 6A09 17C6 22B0&lt;/span&gt;

&lt;span class="gp"&gt;bureau:~/Téléchargements$&lt;/span&gt; sha256sum -c --ignore-missing CHECKSUMS
&lt;span class="go"&gt;linux-headers-5.6.2-050602_5.6.2-050602.202004020822_all.deb: Réussi&lt;/span&gt;
&lt;span class="go"&gt;linux-headers-5.6.2-050602-lowlatency_5.6.2-050602.202004020822_amd64.deb: Réussi&lt;/span&gt;
&lt;span class="go"&gt;linux-image-unsigned-5.6.2-050602-lowlatency_5.6.2-050602.202004020822_amd64.deb: Réussi&lt;/span&gt;
&lt;span class="go"&gt;linux-modules-5.6.2-050602-lowlatency_5.6.2-050602.202004020822_amd64.deb: Réussi&lt;/span&gt;
&lt;span class="go"&gt;sha256sum: Attention : 28 lignes ne sont pas correctement formatées&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si tout est OK, et seulement dans ce cas, alors vous pouvez installer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;bureau:~/Téléchargements$&lt;/span&gt; sudo dpkg -i linux-*-5.6.2-*.deb
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et voilà, c'est installé.&lt;/p&gt;
&lt;p&gt;Un petit conseil, avant de redémarrer votre ordinateur, assurez-vous que le menu
de démarrage &lt;strong&gt;Grub&lt;/strong&gt; est bien affiché au boot. Vérifiez que vous avez bien
cette configuration dans le fichier &lt;tt class="docutils literal"&gt;/etc/default/grub&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=3
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si ce n'étais pas le cas, modifiez le ficher et re-générez la configuration de
Grub avec la commande suivante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;bureau:~$&lt;/span&gt; sudo update-grub
&lt;span class="go"&gt;Sourcing file `/etc/default/grub&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;Sourcing file `/etc/default/grub.d/init-select.cfg&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;Sourcing file `/etc/default/grub.d/kdump-tools.cfg&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;Generating grub configuration file ...&lt;/span&gt;
&lt;span class="go"&gt;Found linux image: /boot/vmlinuz-5.6.2-050602-lowlatency&lt;/span&gt;
&lt;span class="go"&gt;Found initrd image: /boot/initrd.img-5.6.2-050602-lowlatency&lt;/span&gt;
&lt;span class="go"&gt;Found linux image: /boot/vmlinuz-5.3.0-46-generic&lt;/span&gt;
&lt;span class="go"&gt;Found initrd image: /boot/initrd.img-5.3.0-46-generic&lt;/span&gt;
&lt;span class="go"&gt;Found linux image: /boot/vmlinuz-5.3.0-45-generic&lt;/span&gt;
&lt;span class="go"&gt;Found initrd image: /boot/initrd.img-5.3.0-45-generic&lt;/span&gt;
&lt;span class="go"&gt;Adding boot menu entry for EFI firmware configuration&lt;/span&gt;
&lt;span class="go"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Maintenant, vous pouvez rebooter.&lt;/p&gt;
&lt;p&gt;En cas de soucis, par exemple une erreur de chargement du kernel 5.6,
selectionnez votre précédent kernel, &lt;tt class="docutils literal"&gt;Ubuntu, with Linux &lt;span class="pre"&gt;5.3.0-46-generic&lt;/span&gt;&lt;/tt&gt;
dans le sous-menu &lt;tt class="docutils literal"&gt;Advanced options for Ubuntu&lt;/tt&gt; et démarrez normalement.&lt;/p&gt;
&lt;p&gt;Si votre nouveau kernel a bien démarrer, vous avez terminer. Enjoy! Sinon,
passez au chapitre suivant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="secureboot"&gt;
&lt;h2&gt;SecureBoot&lt;/h2&gt;
&lt;p&gt;Si vous lisez ce chapitre, c'est que tout ne s'est pas bien passé et que vous
avez surement été insulté par &lt;strong&gt;Grub&lt;/strong&gt; sous prétexte que le fichier
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;vmlinuz-5.6.2-050602-lowlatency&lt;/span&gt;&lt;/tt&gt; &lt;strong&gt;has invalid signature&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Rassurez-vous, il y a une solution que j'ai trouvé sur &lt;a class="reference external" href="https://ubuntu.com/blog/how-to-sign-things-for-secure-boot"&gt;le blog ubuntu&lt;/a&gt;. Pour
faire court, j'ai simplement suivi les étapes suivantes indiqué sur cette page
(le chapitre &lt;strong&gt;Certificates in shim&lt;/strong&gt;):&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Création d'un fichier de configuration pour &lt;strong&gt;OpenSSL&lt;/strong&gt;. (Assurez-vous de
bien avoir &lt;tt class="docutils literal"&gt;extendedKeyUsage&lt;/tt&gt; avec la bonne valeur dedans.)&lt;/li&gt;
&lt;li&gt;Création des clés publique et privée, &lt;tt class="docutils literal"&gt;MOK.der&lt;/tt&gt;  &amp;amp; &lt;tt class="docutils literal"&gt;MOK.priv&lt;/tt&gt;, avec
&lt;strong&gt;OpenSSL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Création de la clé publique &lt;tt class="docutils literal"&gt;MOK.pem&lt;/tt&gt; pour l'outil &lt;tt class="docutils literal"&gt;sbsign&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Signature du kernel.&lt;/li&gt;
&lt;li&gt;Enrollement de la clé &lt;tt class="docutils literal"&gt;MOK.der&lt;/tt&gt; dans &lt;tt class="docutils literal"&gt;shim&lt;/tt&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici le fichier de configuration &lt;strong&gt;OpenSSL&lt;/strong&gt; utilisé, &lt;tt class="docutils literal"&gt;MOK.cnf&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# This definition stops the following lines choking if HOME isn&amp;#39;t&lt;/span&gt;
&lt;span class="c1"&gt;# defined.&lt;/span&gt;
&lt;span class="na"&gt;HOME&lt;/span&gt;                    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
&lt;span class="na"&gt;RANDFILE&lt;/span&gt;                &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$ENV::HOME/.rnd&lt;/span&gt;
&lt;span class="k"&gt;[ req ]&lt;/span&gt;
&lt;span class="na"&gt;distinguished_name&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;req_distinguished_name&lt;/span&gt;
&lt;span class="na"&gt;x509_extensions&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;v3&lt;/span&gt;
&lt;span class="na"&gt;string_mask&lt;/span&gt;             &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;utf8only&lt;/span&gt;
&lt;span class="na"&gt;prompt&lt;/span&gt;                  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;

&lt;span class="k"&gt;[ req_distinguished_name ]&lt;/span&gt;
&lt;span class="na"&gt;countryName&lt;/span&gt;             &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FR&lt;/span&gt;
&lt;span class="na"&gt;stateOrProvinceName&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Paris&lt;/span&gt;
&lt;span class="na"&gt;localityName&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Paris&lt;/span&gt;
&lt;span class="na"&gt;0.organizationName&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;whatyouwant&lt;/span&gt;
&lt;span class="na"&gt;commonName&lt;/span&gt;              &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Secure Boot Signing&lt;/span&gt;
&lt;span class="na"&gt;emailAddress&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;example@example.com&lt;/span&gt;

&lt;span class="k"&gt;[ v3 ]&lt;/span&gt;
&lt;span class="na"&gt;subjectKeyIdentifier&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;hash&lt;/span&gt;
&lt;span class="na"&gt;authorityKeyIdentifier&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;keyid:always,issuer&lt;/span&gt;
&lt;span class="na"&gt;basicConstraints&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;critical,CA:FALSE&lt;/span&gt;
&lt;span class="na"&gt;extendedKeyUsage&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;codeSigning,1.3.6.1.4.1.311.10.3.6,1.3.6.1.4.1.2312.16.1.2&lt;/span&gt;
&lt;span class="na"&gt;nsComment&lt;/span&gt;               &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et la séquence de commandes shell exécutée:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;bureau:~$&lt;/span&gt; openssl req -config ./MOK.cnf &lt;span class="se"&gt;\&lt;/span&gt;
    -new -x509 -newkey rsa:2048 &lt;span class="se"&gt;\&lt;/span&gt;
    -nodes -days &lt;span class="m"&gt;36500&lt;/span&gt; -outform DER &lt;span class="se"&gt;\&lt;/span&gt;
    -keyout &lt;span class="s2"&gt;&amp;quot;MOK.priv&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    -out &lt;span class="s2"&gt;&amp;quot;MOK.der&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;bureau:~$&lt;/span&gt; openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem
&lt;span class="gp"&gt;bureau:~$&lt;/span&gt; sudo sbsign --key MOK.priv --cert MOK.pem &lt;span class="se"&gt;\&lt;/span&gt;
    --output /boot/vmlinuz-5.6.2-050602-lowlatency.signed &lt;span class="se"&gt;\&lt;/span&gt;
    /boot/vmlinuz-5.6.2-050602-lowlatency
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;bureau:~$&lt;/span&gt; sudo mokutil --import MOK.der
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Après appel de &lt;tt class="docutils literal"&gt;mokutil&lt;/tt&gt;, vous devez rebooter pour finaliser l'enrollement
de votre clé de signature dans &lt;tt class="docutils literal"&gt;shim&lt;/tt&gt; qui est le module UEFI chargé &lt;strong&gt;avant
Grub&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Lors du reboot, un écran bleu (non pas le &lt;tt class="docutils literal"&gt;Blue Screen of Death&lt;/tt&gt; de Windows)
apparait vous permettant de finalizer l'ajout de votre clé. Suivez les étapes
à l'écran.&lt;/p&gt;
&lt;p&gt;Ensuite, vous arrivez dans &lt;strong&gt;Grub&lt;/strong&gt;. Appuyez sur &lt;tt class="docutils literal"&gt;Echap&lt;/tt&gt; pour arrêter le
décompte. Puis tapez la touche &lt;tt class="docutils literal"&gt;e&lt;/tt&gt; pour éditer la première entrée.&lt;/p&gt;
&lt;p&gt;Vers les dernières lignes, ajoutez &lt;tt class="docutils literal"&gt;.signed&lt;/tt&gt; à la ligne commençant par
&lt;tt class="docutils literal"&gt;linux&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Enfin, appuyez sur &lt;tt class="docutils literal"&gt;F10&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;Ctrl+x&lt;/tt&gt; pour démarrer avec ce kernel signé.&lt;/p&gt;
&lt;p&gt;Et voilà, normalement vous avez démarré sur votre nouveau kernel &lt;em&gt;Mainline&lt;/em&gt;
Linux 5.6.&lt;/p&gt;
&lt;p&gt;Maintenant, remplacez le kernel non signé par la version que vous avez
vous-même signé:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;bureau:~$&lt;/span&gt; sudo mv /boot/vmlinuz-5.6.2-050602-lowlatency&lt;span class="o"&gt;{&lt;/span&gt;.signed,&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C'est fini.&lt;/p&gt;
&lt;p&gt;Garder cette clé, elle vous permettra de signer les prochains kernels
&lt;em&gt;Mainline&lt;/em&gt; que vous installerez.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="signature-automatique-des-prochains-kernel"&gt;
&lt;h2&gt;Signature automatique des prochains kernel&lt;/h2&gt;
&lt;p&gt;Suite à ces manipulations, j'ai ajouté un petit script dans le répertoire
&lt;tt class="docutils literal"&gt;/etc/kernel/postinst.d/&lt;/tt&gt;. Ce script &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;auto-sign-kernel&lt;/span&gt;&lt;/tt&gt; va permettre
de signer automatiquement tous les kernels NON-signé que vous installerez
comme précedement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh -e&lt;/span&gt;

&lt;span class="nv"&gt;KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/root/moksign/MOK.priv
&lt;span class="nv"&gt;CRT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/root/moksign/MOK.pem

&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# passing the kernel version is required&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;W: auto-sign: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DPKG_MAINTSCRIPT_PACKAGE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt; package&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; did not pass a version number&amp;quot;&lt;/span&gt;
    &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c1"&gt;# sbsigntool package is mandatory&lt;/span&gt;

&lt;span class="nb"&gt;command&lt;/span&gt; -v sbverify &amp;gt;/dev/null &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt; -v sbsign &amp;gt;/dev/null &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# check if kernel is already signed&lt;/span&gt;
&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/boot/vmlinuz-&lt;/span&gt;&lt;span class="nv"&gt;$version&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;sbverify --list &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$check&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No signature table present&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;

    &lt;span class="c1"&gt;# not signed, so sign it with registered MOK key&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Signing kernel &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt; using personnal MOK key ...&amp;quot;&lt;/span&gt;
    sbsign --key &lt;span class="nv"&gt;$KEY&lt;/span&gt; --cert &lt;span class="nv"&gt;$CRT&lt;/span&gt; --output &lt;span class="nv"&gt;$name&lt;/span&gt;.signed &lt;span class="nv"&gt;$name&lt;/span&gt;
    mv &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;.signed,&lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Done.&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;else&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Kernel already signed, no need to sign it.&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voilà, c'est terminé. Si tout se passe bien, quand vous installerez le prochain
kernel &lt;em&gt;Mainline&lt;/em&gt;, il sera automatiquement signé par ce script avec les clés
publique et privée indiquées par les variables &lt;tt class="docutils literal"&gt;KEY&lt;/tt&gt; &amp;amp; &lt;tt class="docutils literal"&gt;CRT&lt;/tt&gt;, à modifier
selon votre convenance.&lt;/p&gt;
&lt;p&gt;Bonne journée.&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Décodeur TV UHD Orange avec serveur DNS/DHCP sur NAS</title><link href="https://www.int21h.eu/decodeur-tv-orange.html" rel="alternate"></link><published>2019-01-15T20:00:00+01:00</published><updated>2019-01-15T20:00:00+01:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2019-01-15:/decodeur-tv-orange.html</id><summary type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Suite à l'installation de la Fibre Orange à mon domicile, j'ai souhaité installer
le Décodeur TV UHD fourni avec. Hélas, celui-ci bloque dès le premier écran de
configuration!&lt;/p&gt;
&lt;p&gt;Tous les tests effectués, en Ethernet ou en WiFi ont échoué, donc je me suis
résout à contacter le support Orange …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Suite à l'installation de la Fibre Orange à mon domicile, j'ai souhaité installer
le Décodeur TV UHD fourni avec. Hélas, celui-ci bloque dès le premier écran de
configuration!&lt;/p&gt;
&lt;p&gt;Tous les tests effectués, en Ethernet ou en WiFi ont échoué, donc je me suis
résout à contacter le support Orange.&lt;/p&gt;
&lt;p&gt;Je vous passe les détails, mais la seule piste qui en est ressorti, c'est que
ma configuration de la Livebox 4 et de mon réseau posent problème. En gros,
désactiver le serveur DHCP de la Livebox pour utiliser ses propres services
DNS/DHCP n'est pas supporté et ne permet plus au décodeur TV de fonctionner!
Et le Mr au bout du e-chat voulait limite que j'arrête mon serveur si je
voulais la TV!!!&lt;/p&gt;
&lt;p&gt;J'ai quand même fouiller un peu plus en regardant les logs coté serveur. Et
différents points sont apparus:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Après avoir fourni une adresse DHCP au décodeur, ce dernier fait un certain
nombre de requêtes DNS.&lt;/li&gt;
&lt;li&gt;Ces requêtes pour la plupart ne retourne aucun résultats!&lt;/li&gt;
&lt;li&gt;Si les requêtes sont envoyés à la Livebox ou aux serveurs DNS orange &lt;em&gt;internes&lt;/em&gt;,
on obtiens les bonnes réponses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Après avoir corrigé ça avec une zone &lt;em&gt;forward only&lt;/em&gt; dans la configuration de &lt;a class="reference external" href="https://www.isc.org/downloads/bind/"&gt;Bind9&lt;/a&gt;,
ça ne fonctionnait toujours pas. Donc ce coup-ci, recherches à grand coup de Google
et je suis tombé sur ce topic sur le &lt;a class="reference external" href="https://communaute.orange.fr/t5/TV-par-ADSL-et-Fibre/Param%C3%A8tres-r%C3%A9seau-du-d%C3%A9codeur/td-p/1489894"&gt;forum de la communauté Orange&lt;/a&gt; dans lequel
&lt;strong&gt;Blanquet94&lt;/strong&gt; envoie cette phrase couperet:&lt;/p&gt;
&lt;blockquote&gt;
Le décodeur TV a absolument besoin de faire traiter sa requête DHCP par la Livebox
sans quoi elle ne le reconnaît pas comme étant un décodeur TV et il ne pourra plus
joindre la plateforme de service.&lt;/blockquote&gt;
&lt;p&gt;Nouvelles recherches et la conclusion est évidente. &lt;strong&gt;Le serveur DHCP de la Livebox 4
doit être actif&lt;/strong&gt; et donner lui-même une adresse au décodeur!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Par chance&lt;/em&gt;, la Livebox 4 permet de spécifier la plage des adresses à fournir et
le démon DHCPD sur le serveur peut ignorer un client spécifique.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="reconfiguration-de-la-livebox-4"&gt;
&lt;h2&gt;Reconfiguration de la Livebox 4&lt;/h2&gt;
&lt;p&gt;C'est le plus simple. L'idée c'est que le serveur DHCP de la Livebox ne donne une
IP &lt;strong&gt;qu'au décodeur, et uniquement à lui&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Donc:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;On active le serveur DHCP,&lt;/li&gt;
&lt;li&gt;On change la plage d'adresses pour n'avoir que 2 adresses IP possibles,&lt;/li&gt;
&lt;li&gt;On ajoute les 2 adresses MAC du décodeur TV (Ethernet et WiFi) comme entrées
statiques du serveur DHCP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec cette configuration, le serveur DHCP n'est plus en mesure de donner des IPs
à toutes les autres machines du réseau, et donc ne répond qu'aux demandes du
décodeur et plus aux autres machines sur le réseau.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="modification-de-la-configuration-dhcpd"&gt;
&lt;h2&gt;Modification de la configuration &lt;em&gt;dhcpd&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Du coté de mon serveur, il doit simplement ignorer les requêtes provenant du
décodeur TV d'Orange.&lt;/p&gt;
&lt;p&gt;Ça a l'air facile, mais c'est ce qui m'a pris le plus de temps!&lt;/p&gt;
&lt;p&gt;Premièrement, il faut définir une classe dans le fichier de configuration
&lt;tt class="docutils literal"&gt;/etc/dhcp/dhcpd.conf&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;class &amp;quot;orange&amp;quot; {&lt;/span&gt;
&lt;span class="gp"&gt;  #&lt;/span&gt; exclude orange decodeur from pool! Ie. &lt;span class="m"&gt;30&lt;/span&gt;:24:78:8d:00:98/30:24:78:8d:00:9a
&lt;span class="go"&gt;  match if substring (hardware,1,4) = 30:24:78:8d;&lt;/span&gt;
&lt;span class="go"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'ai bataillé pas mal avec la directive &lt;tt class="docutils literal"&gt;hardware&lt;/tt&gt; et la fonction &lt;tt class="docutils literal"&gt;substring&lt;/tt&gt;,
mais finalement &lt;tt class="docutils literal"&gt;log()&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;concat()&lt;/tt&gt; et plus généralement &lt;tt class="docutils literal"&gt;man &lt;span class="pre"&gt;dhcp-eval&lt;/span&gt;&lt;/tt&gt; sont
nos amis! La mailing-list &lt;a class="reference external" href="https://lists.isc.org/pipermail/dhcp-users/"&gt;dhcp-users&lt;/a&gt; est aussi une bonne aide!&lt;/p&gt;
&lt;p&gt;Ensuite, il faut ajouter la directive &lt;tt class="docutils literal"&gt;deny&lt;/tt&gt; dans &lt;strong&gt;tous les pools&lt;/strong&gt; définis,
&lt;strong&gt;après&lt;/strong&gt; les directives &lt;tt class="docutils literal"&gt;allow&lt;/tt&gt; éventuelles:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;subnet 192.168.0.0 netmask 255.255.255.0 {&lt;/span&gt;
&lt;span class="gp"&gt;  #&lt;/span&gt;...
&lt;span class="go"&gt;  pool {&lt;/span&gt;
&lt;span class="go"&gt;    range 192.168.0.24 192.168.0.63;&lt;/span&gt;
&lt;span class="go"&gt;    allow unknown-clients;&lt;/span&gt;
&lt;span class="go"&gt;    deny members of &amp;quot;orange&amp;quot;;&lt;/span&gt;
&lt;span class="go"&gt;  }&lt;/span&gt;
&lt;span class="go"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, redémarrer &lt;tt class="docutils literal"&gt;dhcpd&lt;/tt&gt; pour prendre en compte la nouvelle configuration. Vous
devriez voir apparaître cette ligne dans les logs quand vous allumer le décodeur TV:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;root@serveur:~#&lt;/span&gt; journalctl -u isc-dhcp-server.service -f
&lt;span class="go"&gt;janv. 15 14:40:51 serveur dhcpd[26774]: DHCPDISCOVER from 30:24:78:8d:00:9a via eth0: network 192.168.0.0/24: no free leases&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's all! Le décodeur a enfin son IP en provenance de la Livebox. Celle-ci ne
perturbe pas les autres clients qui continuent de recevoir leur IP du serveur
principal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Merci encore à la communauté d'utilisateurs, que ce soit celle d'orange ou de ISC
Bind/DHCP pour toutes les informations qui permettent de débloquer une situation.&lt;/p&gt;
&lt;p&gt;Par contre, Sagem et Orange, je dirais pas ce que je pense de leur matos ni de leur
support...&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Streamer la caméra du Raspberry Pi</title><link href="https://www.int21h.eu/stream-raspivid.html" rel="alternate"></link><published>2019-01-10T20:00:00+01:00</published><updated>2019-01-10T20:00:00+01:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2019-01-10:/stream-raspivid.html</id><summary type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;En tant que possesseur d'une caméra sur mon Raspberry Pi 3B, je voulais pouvoir
streamer le flux vidéo à la demande, sans avoir recours à des programmes externes.&lt;/p&gt;
&lt;p&gt;Après avoir testé pendant quelques temps le mode &lt;em&gt;serveur TCP&lt;/em&gt; du programme
&lt;tt class="docutils literal"&gt;raspivid&lt;/tt&gt; via l'option &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-o&lt;/span&gt; &lt;span class="pre"&gt;tcp://0.0.0.0 …&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;En tant que possesseur d'une caméra sur mon Raspberry Pi 3B, je voulais pouvoir
streamer le flux vidéo à la demande, sans avoir recours à des programmes externes.&lt;/p&gt;
&lt;p&gt;Après avoir testé pendant quelques temps le mode &lt;em&gt;serveur TCP&lt;/em&gt; du programme
&lt;tt class="docutils literal"&gt;raspivid&lt;/tt&gt; via l'option &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-o&lt;/span&gt; &lt;span class="pre"&gt;tcp://0.0.0.0:3333&lt;/span&gt;&lt;/tt&gt;, je n'étais pas très
satisfait. Cela m'obligeait à avoir un script qui relance automatiquement
le programme après chaque déconnexion d'un client. De plus, le programme
&lt;tt class="docutils literal"&gt;raspivid&lt;/tt&gt;, plus le script shell, plus la session &lt;tt class="docutils literal"&gt;tmux&lt;/tt&gt;, ça commence
à faire beaucoup pour un truc qui n'est quasiment jamais utilisé!&lt;/p&gt;
&lt;p&gt;Vu la distribution &lt;a class="reference external" href="http://raspbian.org"&gt;Raspbian&lt;/a&gt; qui équipe le Raspberry Pi est basé sur &lt;a class="reference external" href="https://debian.org"&gt;Debian&lt;/a&gt;,
et que celui-ci utilise &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; depuis &lt;em&gt;stretch&lt;/em&gt;, j'ai décidé d'ajouter
un service pour le streaming.&lt;/p&gt;
&lt;p&gt;Plusieurs avantages à utiliser &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; ici:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Pas besoin d'installer un gestionnaire de service réseau tel que &lt;tt class="docutils literal"&gt;inetd&lt;/tt&gt;
ou &lt;tt class="docutils literal"&gt;xinetd&lt;/tt&gt; car c'est déjà possible avec &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Pas de processus supplémentaire qui s'exécute tant qu'il n'y a aucun client
qui souhaite recevoir le flux vidéo.&lt;/li&gt;
&lt;li&gt;On bénéficie naturellement du journal de &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; pour le suivi du service.&lt;/li&gt;
&lt;li&gt;C'est l'avenir, n'en déplaise à ses détracteurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="mise-en-place-du-service"&gt;
&lt;h2&gt;Mise en place du service&lt;/h2&gt;
&lt;p&gt;Pour commencer, on va stocker dans un fichier séparé les options à utiliser pour
lancer &lt;tt class="docutils literal"&gt;raspivid&lt;/tt&gt;. Si dessous le fichier &lt;tt class="docutils literal"&gt;/etc/default/raspivid&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;RASPIVID_OPTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; -w &lt;span class="m"&gt;1280&lt;/span&gt; -h &lt;span class="m"&gt;720&lt;/span&gt; -a &lt;span class="m"&gt;12&lt;/span&gt; -fl -ih -b &lt;span class="m"&gt;800000&lt;/span&gt; -fps &lt;span class="m"&gt;25&lt;/span&gt; -pf main -g &lt;span class="m"&gt;25&lt;/span&gt; -awb auto
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bien sur, vous pouvez adapter ces options là à votre besoin.&lt;/p&gt;
&lt;p&gt;Ensuite on attaque la configuration du service. Pour un service activé à la demande
via une connexion réseau, &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; requière la mise en place de 2 unités:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un fichier &lt;tt class="docutils literal"&gt;nom.socket&lt;/tt&gt; qui décrit le type de connexion réseaux qui va
activer le service.&lt;/li&gt;
&lt;li&gt;Un fichier &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;nom&amp;#64;.service&lt;/span&gt;&lt;/tt&gt; qui décrit le processus à exécuter lorsqu'un
client se connecte à la connexion réseaux décrite par &lt;tt class="docutils literal"&gt;nom.socket&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si dessous, mon fichier &lt;tt class="docutils literal"&gt;raspvid.socket&lt;/tt&gt; qui active une socket TCP écoutant
sur le port 3333 sur toutes les interfaces réseaux locales, en IPv4 ou IPv6:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Raspivid Streaming Socket&lt;/span&gt;

&lt;span class="k"&gt;[Socket]&lt;/span&gt;
&lt;span class="na"&gt;ListenStream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3333&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;MaxConnections&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;SendBuffer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1M&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;sockets.target&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette unité &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; sera mise en place dans la cible &lt;tt class="docutils literal"&gt;socket.target&lt;/tt&gt;
quand elle sera activée. Elle indique aussi que c'est à &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; d'accepter
la connexion entrante, comme le fait &lt;tt class="docutils literal"&gt;inetd&lt;/tt&gt; ou &lt;tt class="docutils literal"&gt;xinetd&lt;/tt&gt; et qu'il ne peut
y avoir qu'une seule connexion à la fois.&lt;/p&gt;
&lt;p&gt;Si dessous le service associé qui sera lancé à chaque nouvelle connexion. Le
fichier doit avoir le même nom de base mais suivi de &lt;tt class="docutils literal"&gt;&amp;#64;&lt;/tt&gt; et avec l'extension
&lt;tt class="docutils literal"&gt;.service&lt;/tt&gt; (voir &lt;tt class="docutils literal"&gt;man systemd.socket&lt;/tt&gt;). Ici, c'est donc &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;raspivid&amp;#64;.service&lt;/span&gt;&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Raspivid Streaming Instance&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;EnvironmentFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;-/etc/default/raspivid&lt;/span&gt;
&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;-/usr/bin/env raspivid $RASPIVID_OPTIONS -v -n -t 0 -o -&lt;/span&gt;
&lt;span class="na"&gt;StandardInput&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;socket&lt;/span&gt;
&lt;span class="na"&gt;StandardError&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;journal&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le service est configuré pour utiliser la socket acceptée comme entrée/sortie
standard et la sortie d'erreur est redirigée vers le journal.&lt;/p&gt;
&lt;p&gt;Le caractère &lt;tt class="docutils literal"&gt;-&lt;/tt&gt; juste après le &lt;tt class="docutils literal"&gt;=&lt;/tt&gt; est nécessaire pour ignorer une éventuelle
erreur lorsque le service se termine. Idem pour le fichier de configuration.&lt;/p&gt;
&lt;p&gt;Il ne reste plus qu'à l'activer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;raspberrypi:~#&lt;/span&gt; systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; raspivid.socket
&lt;span class="go"&gt;Created symlink /etc/systemd/system/sockets.target.wants/raspivid.socket → /etc/systemd/system/raspivid.socket.&lt;/span&gt;
&lt;span class="gp"&gt;raspberrypi:~#&lt;/span&gt; systemctl status raspivid.socket
&lt;span class="go"&gt;● raspivid.socket - Raspivid Streaming Socket&lt;/span&gt;
&lt;span class="go"&gt;   Loaded: loaded (/etc/systemd/system/raspivid.socket; enabled; vendor preset: enabled)&lt;/span&gt;
&lt;span class="go"&gt;   Active: active (listening) since Tue 2019-01-08 12:31:12 CET; 1 day 3h ago&lt;/span&gt;
&lt;span class="go"&gt;   Listen: [::]:3333 (Stream)&lt;/span&gt;
&lt;span class="go"&gt; Accepted: 0; Connected: 0&lt;/span&gt;

&lt;span class="go"&gt;janv. 08 12:31:12 raspberrypi systemd[1]: Listening on Raspivid Streaming Socket.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That's all! Maintenant, utiliser votre application de streaming préféré et
ouvrez le flux réseau &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;tcp://raspberrypi.local:3333&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Une nouvelle instance du service &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;raspivid&amp;#64;.service&lt;/span&gt;&lt;/tt&gt; est lancée. Par exemple
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;raspivid&amp;#64;0-192.168.0.6:3333-192.168.0.4:41722.service&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;raspberrypi:~#&lt;/span&gt; journalctl -u raspivid@0-192.168.0.6:3333-192.168.0.4:41722.service
&lt;span class="go"&gt;-- Logs begin at Thu 2016-11-03 18:16:42 CET, end at Wed 2019-01-09 16:20:01 CET. --&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi systemd[1]: Started Raspivid Streaming Instance (192.168.0.4:41722).&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: &amp;quot;raspivid&amp;quot; Camera App (commit 68e08be38191)&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Camera Name imx219&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Width 1280, Height 720, filename -&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Using camera 0, sensor mode 0&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: GPS output Disabled&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: bitrate 800000, framerate 25, time delay 0&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: H264 Profile main&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: H264 Level 4&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: H264 Quantisation level 0, Inline headers Yes&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: H264 Fill SPS Timings No&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: H264 Intra refresh type (null), period 25&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: H264 Slices 1&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Wait method : Capture forever&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Initial state &amp;#39;record&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Preview No, Full screen Yes&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Preview window 0,0,1024,768&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Opacity 255&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Sharpness 0, Contrast 0, Brightness 50&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Saturation 0, ISO 0, Video Stabilisation No, Exposure compensation 3&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Exposure Mode &amp;#39;nightpreview&amp;#39;, AWB Mode &amp;#39;auto&amp;#39;, Image Effect &amp;#39;none&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Flicker Avoid Mode &amp;#39;off&amp;#39;&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Metering Mode &amp;#39;average&amp;#39;, Colour Effect Enabled No with U = 128, V = 128&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Rotation 0, hflip No, vflip No&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: ROI x 0.000000, y 0.000000, w 1.000000 h 1.000000&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Camera component done&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Encoder component done&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Starting component connection stage&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:55 raspberrypi raspivid[18482]: Connecting camera video port to encoder input port&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:56 raspberrypi raspivid[18482]: Enabling encoder output port&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:05:56 raspberrypi raspivid[18482]: Starting video capture&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:06:47 raspberrypi raspivid[18482]: mmal: Failed to write buffer data (4096 from 5109)- aborting&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:06:47 raspberrypi raspivid[18482]: Finished capture&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:06:47 raspberrypi raspivid[18482]: Closing down&lt;/span&gt;
&lt;span class="go"&gt;janv. 08 15:06:47 raspberrypi raspivid[18482]: Close down completed, all components disconnected, disabled and destroyed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;, le programme &lt;tt class="docutils literal"&gt;raspivid&lt;/tt&gt; a été patché pour qu'il se termine
correctement quand le client se déconnecte. Voir le &lt;a class="reference external" href="https://github.com/raspberrypi/userland/pull/521"&gt;patch&lt;/a&gt; soumis au projet
&lt;tt class="docutils literal"&gt;raspberrypi/userland&lt;/tt&gt; sur &lt;a class="reference external" href="https://github.com/raspberrypi/userland"&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Trafic SMTP(S)/IMAP via tunnel OpenVPN</title><link href="https://www.int21h.eu/mail-through-openvpn.html" rel="alternate"></link><published>2019-01-09T08:30:00+01:00</published><updated>2019-01-09T08:30:00+01:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2019-01-09:/mail-through-openvpn.html</id><summary type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Cette article fait suite à mon précédent article décrivant la mise en place d'un
&lt;a class="reference external" href="https://www.int21h.eu/munin-ssh.html"&gt;monitoring avec Munin&lt;/a&gt; pour mon nouveau VPS chez OVH.&lt;/p&gt;
&lt;p&gt;Pour rappel, la mise en place de ce serveur VPS chez OVH fait suite à un changement
de fournisseur d'accès internet, et la perte prochaine de …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="introduction"&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Cette article fait suite à mon précédent article décrivant la mise en place d'un
&lt;a class="reference external" href="https://www.int21h.eu/munin-ssh.html"&gt;monitoring avec Munin&lt;/a&gt; pour mon nouveau VPS chez OVH.&lt;/p&gt;
&lt;p&gt;Pour rappel, la mise en place de ce serveur VPS chez OVH fait suite à un changement
de fournisseur d'accès internet, et la perte prochaine de mon adresse IPv4 fixe
que celui-ci m'offrait gracieusement depuis quasiment 10 ans.&lt;/p&gt;
&lt;p&gt;Sachant que mon serveur mail est auto-hébergé à mon domicile, la perte de l'adresse
IPv4 fixe, ainsi que la possibilité de configurer le reverse DNS pour celle-ci est
très problématique. Une IPv4 fixe est obligatoire pour mettre en place l'enregistrement
MX dans le DNS pour que les emails arrivent sur le serveur.&lt;/p&gt;
&lt;p&gt;Ajouté au blocage du trafic SMTP sortant imposé par mon futur opérateur, deux solutions
s'offraient à moi:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Déplacer le serveur mail dans son intégralité sur mon VPS.&lt;/li&gt;
&lt;li&gt;Garder le serveur mail à la maison, mais faire passer tout le trafic mail par le VPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sachant que le VPS ne support pas le RAID et qu'il possède qu'une quantité très limité
pour le stockage, j'ai décidé d'utiliser la solution du tunnel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mise-en-place-du-tunnel-openvpn"&gt;
&lt;h2&gt;Mise en place du tunnel OpenVPN&lt;/h2&gt;
&lt;p&gt;Afin de simplifier la mise en place du VPN, celui-ci est dédié à la communication
entre le VPS et le serveur chez moi que j'appellerais dorénavant Maison.&lt;/p&gt;
&lt;p&gt;Il n'utilisera donc pas de certificats RSA, pas de KPI locale à gérer, pas de certificats
à révoquer. Uniquement une clef statique partagée entre les 2 protagonistes.&lt;/p&gt;
&lt;p&gt;L'installation dans ces conditions sur Debian stretch est très simple. Sur le VPS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;vps:~#&lt;/span&gt; apt install openvpn
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;vps:~#&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /etc/openvpn/serveur
&lt;span class="gp"&gt;vps:/etc/openvpn/serveur#&lt;/span&gt; openvpn --genkey --secret static.key
&lt;span class="gp"&gt;vps:/etc/openvpn/serveur#&lt;/span&gt; cat &amp;gt;tun0.conf &amp;lt;&amp;lt;EOF
&lt;span class="go"&gt;dev tun0&lt;/span&gt;
&lt;span class="go"&gt;ifconfig 172.16.123.1 172.16.123.2&lt;/span&gt;
&lt;span class="go"&gt;secret static.key&lt;/span&gt;
&lt;span class="go"&gt;cipher AES-256-CBC&lt;/span&gt;
&lt;span class="go"&gt;;script-security 2&lt;/span&gt;
&lt;span class="go"&gt;;route-up ./tun0.up&lt;/span&gt;
&lt;span class="go"&gt;compress lz4&lt;/span&gt;
&lt;span class="go"&gt;keepalive 15 60&lt;/span&gt;
&lt;span class="go"&gt;persist-tun&lt;/span&gt;
&lt;span class="go"&gt;persist-key&lt;/span&gt;
&lt;span class="go"&gt;verb 3&lt;/span&gt;
&lt;span class="go"&gt;EOF&lt;/span&gt;
&lt;span class="gp"&gt;vps:/etc/openvpn/serveur#&lt;/span&gt; systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; openvpn-server@tun0.service
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si un firewall est actif sur le VPS, ce qui est extrêmement important, il faut
autoriser le trafic OpenVPN. Ici, j'utilise UFW:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;vps:~#&lt;/span&gt; cat &amp;gt;/etc/ufw/applications.d/openvpn-server &amp;lt;&amp;lt;EOF
&lt;span class="go"&gt;[OpenVPN]&lt;/span&gt;
&lt;span class="go"&gt;title=OpenVPN server&lt;/span&gt;
&lt;span class="go"&gt;description=OpenVPN is a free secure VPN client/server implementation.&lt;/span&gt;
&lt;span class="go"&gt;ports=1194/udp&lt;/span&gt;
&lt;span class="go"&gt;EOF&lt;/span&gt;
&lt;span class="gp"&gt;vps:~#&lt;/span&gt; ufw allow OpenVPN
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sur Maison:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;maison:~#&lt;/span&gt; apt install openvpn
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;maison:~#&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /etc/openvpn/client
&lt;span class="gp"&gt;maison:/etc/openvpn/client#&lt;/span&gt; cat &amp;gt;tun0.conf &amp;lt;&amp;lt;EOF
&lt;span class="go"&gt;remote vps.example.com&lt;/span&gt;
&lt;span class="go"&gt;dev tun0&lt;/span&gt;
&lt;span class="go"&gt;ifconfig 172.16.123.2 172.16.123.1&lt;/span&gt;
&lt;span class="go"&gt;secret static.key&lt;/span&gt;
&lt;span class="go"&gt;cipher AES-256-CBC&lt;/span&gt;
&lt;span class="go"&gt;;script-security 2&lt;/span&gt;
&lt;span class="go"&gt;;route-up ./tun0.up&lt;/span&gt;
&lt;span class="go"&gt;compress lz4&lt;/span&gt;
&lt;span class="go"&gt;verb 3&lt;/span&gt;
&lt;span class="go"&gt;EOF&lt;/span&gt;
&lt;span class="gp"&gt;maison:/etc/openvpn/client#&lt;/span&gt; systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; openvpn-client@tun0.service
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis copier le fichier static.key depuis le VPS vers Maison et mettez le dans
&lt;tt class="docutils literal"&gt;/etc/openvpn/client&lt;/tt&gt;. Veillez aux droits d'accès à ce fichier sur les 2
machines.&lt;/p&gt;
&lt;p&gt;Vous pouvez dès maintenant lancer le tunnel en démarrant le service sur les
2 machines &lt;strong&gt;en même temps&lt;/strong&gt; (ils s'attendent mutuellement).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;vps:~#&lt;/span&gt; systemctl start openvpn-serveur@tun0.service
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;maison:~#&lt;/span&gt; systemctl start openvpn-client@tun0.service
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Normalement, là, si tout se passe bien, un tunnel est actif et les 2 machines
peuvent se pinguer via les IPs configurées (172.16.123.1 &amp;amp; 172.16.123.2).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;vps:~#&lt;/span&gt; ifconfig tun0
&lt;span class="go"&gt;tun0: flags=4305&amp;lt;UP,POINTOPOINT,RUNNING,NOARP,MULTICAST&amp;gt;  mtu 1500&lt;/span&gt;
&lt;span class="go"&gt;        inet 172.16.123.1  netmask 255.255.255.255  destination 172.16.123.2&lt;/span&gt;
&lt;span class="go"&gt;        inet6 fe80::ae7e:a7b8:b8dc:8e94  prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)&lt;/span&gt;
&lt;span class="go"&gt;        RX packets 30082  bytes 8228000 (7.8 MiB)&lt;/span&gt;
&lt;span class="go"&gt;        RX errors 0  dropped 0  overruns 0  frame 0&lt;/span&gt;
&lt;span class="go"&gt;        TX packets 18936  bytes 4815846 (4.5 MiB)&lt;/span&gt;
&lt;span class="go"&gt;        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il reste maintenant à faire transiter le traffic mail entrant &lt;strong&gt;et&lt;/strong&gt; sortant
de Maison par ce tunnel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="routage-du-trafic-email-via-le-tunnel"&gt;
&lt;h2&gt;Routage du trafic email via le tunnel&lt;/h2&gt;
&lt;p&gt;C'est la partie la plus compliquée. 2 configurations distinctes doivent être
en place. La première, sur VPS, doit forwarder le trafic venant du tunnel vers
internet, en changeant l'IP source (SNAT) et doit forwarder le trafic entrant
sur le VPS vers le tunnel si et seulement si, c'est du trafic email.&lt;/p&gt;
&lt;p&gt;Par commodité, les règles iptables pour le NAT sont mise en place automatiquement
par OpenVPN après l'établissement des routes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;vps:~#&lt;/span&gt; cat &amp;gt;/etc/openvpn/server/tun0.up &amp;lt;&amp;lt;EOF
&lt;span class="gp"&gt;#&lt;/span&gt;!/bin/bash
&lt;span class="gp"&gt;#&lt;/span&gt; Forwarding is already configured by UFW at boot time.
&lt;span class="go"&gt;echo &amp;quot;Set SMTP routing to/from tunnel peer&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt; Incomming SMTP&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt;/IMAPS connections are DNATed.
&lt;span class="go"&gt;iptables -t nat -F PREROUTING&lt;/span&gt;
&lt;span class="go"&gt;iptables -t nat -A PREROUTING -i ens3 -d 145.239.85.142/32 -p tcp --dport 25 -j DNAT --to-destination 172.16.123.2&lt;/span&gt;
&lt;span class="go"&gt;iptables -t nat -A PREROUTING -i ens3 -d 145.239.85.142/32 -p tcp --dport 465 -j DNAT --to-destination 172.16.123.2&lt;/span&gt;
&lt;span class="go"&gt;iptables -t nat -A PREROUTING -i ens3 -d 145.239.85.142/32 -p tcp --dport 993 -j DNAT --to-destination 172.16.123.2&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt; Outgoing SMTP connections are SNATed.
&lt;span class="go"&gt;iptables -t nat -F POSTROUTING&lt;/span&gt;
&lt;span class="go"&gt;iptables -t nat -A POSTROUTING -o ens3 -s 172.16.123.2/32 -p tcp --dport 25 -j SNAT --to-source 145.239.85.142&lt;/span&gt;
&lt;span class="go"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Comme vous pouvez le voir, il n'y a qu'un seul type de connexion sortante.
Celles sur le port de destination 25 utilisé par le serveur pour envoyer les
email aux serveurs des destinataires.&lt;/p&gt;
&lt;p&gt;Le firewall doit aussi autoriser ce trafic:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;vps:~#&lt;/span&gt; ufw route allow in on ens3 out on tun0 proto tcp to &lt;span class="m"&gt;172&lt;/span&gt;.16.123.2 port &lt;span class="m"&gt;25&lt;/span&gt;
&lt;span class="gp"&gt;vps:~#&lt;/span&gt; ufw route allow in on ens3 out on tun0 proto tcp to &lt;span class="m"&gt;172&lt;/span&gt;.16.123.2 port &lt;span class="m"&gt;465&lt;/span&gt;
&lt;span class="gp"&gt;vps:~#&lt;/span&gt; ufw route allow in on ens3 out on tun0 proto tcp to &lt;span class="m"&gt;172&lt;/span&gt;.16.123.2 port &lt;span class="m"&gt;993&lt;/span&gt;
&lt;span class="gp"&gt;vps:~#&lt;/span&gt; ufw route allow out on ens3 in on tun0 proto tcp to any port &lt;span class="m"&gt;25&lt;/span&gt; from &lt;span class="m"&gt;172&lt;/span&gt;.16.123.2
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voilà, le VPS est prêt pour recevoir tout le trafic SMTP(S)/IMAPS. N'oubliez pas
de supprimer les &lt;tt class="docutils literal"&gt;;&lt;/tt&gt; dans le fichier &lt;tt class="docutils literal"&gt;tun0.conf&lt;/tt&gt; créé au précédent chapitre
pour que OpenVPN puisse lancer le script qui contient les nouvelles règles &lt;tt class="docutils literal"&gt;iptables&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Vous pouvez relancer le service openvpn maintenant.&lt;/p&gt;
&lt;p&gt;Le champ MX de la zone DNS pourrait déjà être mise à jour, mais on va attendre
un petit peu car en l'état, impossible de recevoir un email. Si vous tester avec
telnet, vous verrez qu'il est impossible de se connecter à VPS sur le port 25.&lt;/p&gt;
&lt;p&gt;La demande de connexion (TCP SYN) est bien forwarder vers Maison via le tunnel,
mais la réponse n'arrive jamais sur l'interface &lt;tt class="docutils literal"&gt;tun0&lt;/tt&gt;
(&lt;tt class="docutils literal"&gt;tcpdump &lt;span class="pre"&gt;-i&lt;/span&gt; tun0 &lt;span class="pre"&gt;-n&lt;/span&gt; &lt;span class="pre"&gt;-v&lt;/span&gt; 0 tcp port 25&lt;/tt&gt; ne voit passer que les SYN).&lt;/p&gt;
&lt;p&gt;Ceci est du aux règles de routage qui doivent être adapté. Plus précisément, il
faut faire du routage en fonction de la source pour le trafic email.&lt;/p&gt;
&lt;p&gt;Cela nécessite de créer une nouvelle table de routage en éditant la configuration
iproute2. Ajouter la ligne suivant dans &lt;tt class="docutils literal"&gt;/etc/iproute2/rt_tables&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;maison:~#&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;100 vpn&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt;/etc/iproute2_rt_tables
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis créer le script de configuration &lt;tt class="docutils literal"&gt;tun0.up&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;maison:/etc/openvpn/client#&lt;/span&gt; cat &amp;gt;tun0.up &amp;lt;&amp;lt;EOF
&lt;span class="gp"&gt;#&lt;/span&gt;!/bin/bash
&lt;span class="go"&gt;echo &amp;quot;Set SMTP routing to tunnel peer&amp;quot;&lt;/span&gt;
&lt;span class="go"&gt;iptables -t mangle -F OUTPUT&lt;/span&gt;
&lt;span class="go"&gt;iptables -t nat -F POSTROUTING&lt;/span&gt;
&lt;span class="go"&gt;iptables -t nat -F PREROUTING&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt; add a default route throw tunnel &lt;span class="k"&gt;for&lt;/span&gt; marked traffic
&lt;span class="go"&gt;ip route del default table vpn&lt;/span&gt;
&lt;span class="go"&gt;ip route add default via 172.16.123.1 dev tun0 table vpn&lt;/span&gt;
&lt;span class="go"&gt;ip rule del fwmark 0x1 table vpn&lt;/span&gt;
&lt;span class="go"&gt;ip rule add fwmark 0x1 table vpn&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt; mark all smtp output traffic so that iproute can route it through tun0
&lt;span class="go"&gt;iptables -t mangle -A OUTPUT -o eth0 -p tcp --dport 25 -j MARK --set-mark 0x1&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt; mark all output from tun0 addr to route back through tun0
&lt;span class="go"&gt;iptables -t mangle -A OUTPUT -o eth0 -s 172.16.123.2/32 -j MARK --set-mark 0x1&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt; and rewrite the src-addr of outgoing SMTP connection
&lt;span class="go"&gt;iptables -t nat -A POSTROUTING -o tun0 -p tcp --dport 25 -j SNAT --to-source 172.16.123.2&lt;/span&gt;
&lt;span class="go"&gt;EOF&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C'est un peu plus compliqué. On commence par (re-)créer une nouvelle route par
défaut dans la table de routage spécialement pour le tunnel qui s'appelle &lt;tt class="docutils literal"&gt;vpn&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite, on ajoute une &lt;em&gt;rule&lt;/em&gt; pour activer l'usage de cette table de routage pour
tous les paquets qui sont marqués avec la valeur 0x1.&lt;/p&gt;
&lt;p&gt;Ensuite avec la table &lt;em&gt;mangle&lt;/em&gt; de &lt;tt class="docutils literal"&gt;iptables&lt;/tt&gt;, on marque tout le trafic vers
les serveurs SMTP et le trafic associé à l'IP local du tunnel.&lt;/p&gt;
&lt;p&gt;Enfin, on s'assure que les connexions sortantes vers les serveurs SMTP ont
toutes pour origine l'IP locale du tunnel.&lt;/p&gt;
&lt;p&gt;Tout est enfin prêt. Maintenant, redémarrage du tunnel en relançant le service
openvpn sur les 2 machines, modification et vérification des champs MX et SPF
dans la zone DNS.&lt;/p&gt;
&lt;p&gt;Et voilà! Tout le trafic email passe par le VPN.&lt;/p&gt;
&lt;/div&gt;
</content></entry><entry><title>Pourquoi ce nom?</title><link href="https://www.int21h.eu/pourquoi-ce-nom.html" rel="alternate"></link><published>2019-01-04T16:42:00+01:00</published><updated>2019-01-04T16:42:00+01:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2019-01-04:/pourquoi-ce-nom.html</id><summary type="html">&lt;p&gt;Vous vous posez peut-être la question, mais pourquoi ce nom &lt;em&gt;int21h.eu&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;C'est relativement simple. C'est en rapport à mon apprentissage de l'informatique
dans les années 90. Plus précisément vers 1991 quand j'ai commencé à développer
des programmes résidents sous MS-DOS en Assembleur x86.&lt;/p&gt;
&lt;p&gt;C'est l'époque de mes premiers hacks …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Vous vous posez peut-être la question, mais pourquoi ce nom &lt;em&gt;int21h.eu&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;C'est relativement simple. C'est en rapport à mon apprentissage de l'informatique
dans les années 90. Plus précisément vers 1991 quand j'ai commencé à développer
des programmes résidents sous MS-DOS en Assembleur x86.&lt;/p&gt;
&lt;p&gt;C'est l'époque de mes premiers hacks et ce site est un petit peu un hommage à mon
premier programme résident utile, dévelopé pour protéger l'accès à mon répertoire de
travail sur l'un des PC de la salle informatique du lycée où j'étais en Sup-TA.&lt;/p&gt;
&lt;p&gt;Ce programme était relativement simple et léger. Il:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;détournait l'interuption &lt;em&gt;21h&lt;/em&gt; (la principale interruption de l'API &lt;a class="reference external" href="https://en.wikipedia.org/wiki/DOS_API"&gt;MS-DOS&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;détectait l'usage des fonctions &lt;em&gt;3Ah&lt;/em&gt; jusqu'à &lt;em&gt;3Dh&lt;/em&gt; ainsi que la fonction &lt;em&gt;41h&lt;/em&gt; et
verifiait les arguments pour interdire l'accès et l'écriture dans un répertoire
protégé,&lt;/li&gt;
&lt;li&gt;se terminait en restant résident via l'usage de la fonction &lt;em&gt;31h&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Associé à un autre hack (édition direct du système de fichier &lt;a class="reference external" href="https://en.wikipedia.org/wiki/File_Allocation_Table#FAT16"&gt;FAT16&lt;/a&gt; pour ajouter une
entrée de répertoire récursive), et l'outils &lt;a class="reference external" href="https://en.wikipedia.org/wiki/PC_Tools_(software)"&gt;PCTOOLS&lt;/a&gt; plantait lamentable lors de
l'analyse du disque dur quand il atteignait le répertoire protégé.&lt;/p&gt;
&lt;p&gt;Mes camarades et moi pouvions alors stocker sur les PC de la salle info des données
personnelles et nos développements en cours sans risques d'être effacés par le
professeur qui en avait la charge.&lt;/p&gt;
</content></entry><entry><title>Connection à un Munin-node via SSH</title><link href="https://www.int21h.eu/munin-ssh.html" rel="alternate"></link><published>2018-12-29T08:30:00+01:00</published><updated>2018-12-29T08:30:00+01:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2018-12-29:/munin-ssh.html</id><summary type="html">&lt;p&gt;Suite à la mise en place d'un VPS sous &lt;a class="reference external" href="https://www.debian.org/"&gt;Debian&lt;/a&gt; Stretch chez OVH afin de conserver
une adresse IPv4 fixe pour mon serveur email hébergé chez moi (je vous passe les
détails qui m'oblige à utiliser un VPS), je souhaite monitorer celui-ci avec la
solution déjà mise en place sur …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Suite à la mise en place d'un VPS sous &lt;a class="reference external" href="https://www.debian.org/"&gt;Debian&lt;/a&gt; Stretch chez OVH afin de conserver
une adresse IPv4 fixe pour mon serveur email hébergé chez moi (je vous passe les
détails qui m'oblige à utiliser un VPS), je souhaite monitorer celui-ci avec la
solution déjà mise en place sur mon server principal utilisant &lt;a class="reference external" href="http://munin-monitoring.org/"&gt;Munin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Afin de minimiser les ressources utilisées sur ce serveur VPS, j'ai installé les
paquets debian suivant:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-node-c&lt;/span&gt;&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-plugins-c&lt;/span&gt;&lt;/tt&gt; pour le node &lt;a class="reference external" href="http://munin-monitoring.org/"&gt;Munin&lt;/a&gt; et les plugins en C.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-plugins-core&lt;/span&gt;&lt;/tt&gt; et &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-plugins-extra&lt;/span&gt;&lt;/tt&gt; pour quelques plugins
additionnels en Perl non implémentés en C (&lt;tt class="docutils literal"&gt;fail2ban&lt;/tt&gt; par exemple).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Et là, un gros souci est apparu. Comment le serveur principal va communiquer avec
le serveur VPS pour le traffic Munin sachant que munin-node-c ne supporte pas une
connexion TLS?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs solutions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un tunnel VPN entre mon serveur et le VPS&lt;/li&gt;
&lt;li&gt;Un tunnel SSH avec port-forwarding&lt;/li&gt;
&lt;li&gt;Une connexion SSH directement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est la 3ieme solution qui a été choisi après analyse du code Perl du programe
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-update&lt;/span&gt;&lt;/tt&gt; et plus spécialement de &lt;tt class="docutils literal"&gt;/usr/share/perl5/Munin/Master/Node.pm&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Ce dernier permet d'utiliser une connexion SSH pour lancer un programe sur le
serveur distant. Pour ce faire, l'URL à utiliser doit avoir le format suivant:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[host.example.com]&lt;/span&gt;
&lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ssh://user@host.example.com/path/to/program parameters&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De plus, afin de permettre une connexion sans mot de passe au node Munin sur mon
serveur VPS par le processus &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-update&lt;/span&gt;&lt;/tt&gt;, j'ai créé une clef privée SSH que
j'ai installée pour l'utilisateur munin dans &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/var/lib/munin/.ssh&lt;/span&gt;&lt;/tt&gt; sur mon
serveur principal.&lt;/p&gt;
&lt;p&gt;Sachant que &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-node-c&lt;/span&gt;&lt;/tt&gt; utilise &lt;tt class="docutils literal"&gt;inetd&lt;/tt&gt; et est lancé automatiquement lors
d'une connexion sur le port 4949, il ne reste plus qu'à relier la connexion SSH
et le service lancé par &lt;tt class="docutils literal"&gt;inetd&lt;/tt&gt;. C'est là que &lt;tt class="docutils literal"&gt;netcat&lt;/tt&gt; intervient. Il permet
de faire le lien entre la connexion SSH entrante et le service &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-node-c&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Et voilà. Le processus &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-update&lt;/span&gt;&lt;/tt&gt; sur mon serveur principal communique avec
le processus de collecte &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-node-c&lt;/span&gt;&lt;/tt&gt; sur mon serveur VPS grace à cette config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[vps.example.com]&lt;/span&gt;
&lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ssh://munin@vps.example.com/bin/netcat -q 3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On pourrait aussi bypasser completement &lt;tt class="docutils literal"&gt;inetd&lt;/tt&gt; en executant directement le
démon &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;munin-node-c&lt;/span&gt;&lt;/tt&gt; lors de la connexion SSH, mais il s'execute alors avec
l'utilisateur courant et non plus l'utilisateur &lt;tt class="docutils literal"&gt;nobody&lt;/tt&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[vps.example.com]&lt;/span&gt;
&lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ssh://munin@vps.example.com/usr/sbin/munin-node-c -H vps.example.com&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Voilà, cette configuration me permet de suivre l'évolution de mon VPS dès maintenant
et sans attendre de mettre en place le tunnel VPN qui sera de toute façon requis pour
le traffic SMTP qui nécessite une IP fixe que je n'aurais bientôt plus à la maison.&lt;/p&gt;
</content></entry><entry><title>Welcome</title><link href="https://www.int21h.eu/welcome.html" rel="alternate"></link><published>2018-12-28T18:42:00+01:00</published><updated>2018-12-28T18:42:00+01:00</updated><author><name>David</name></author><id>tag:www.int21h.eu,2018-12-28:/welcome.html</id><summary type="html">&lt;p&gt;Bienvenu sur mon nouveau site dédié aux hacks, tutoriels et autres développements
autour de Linux, Android et autres systèmes.&lt;/p&gt;
&lt;p&gt;Ce site reprendra progressivement mes anciens articles issu de mon précédent site
SPIP, non maintenu depuis trop longtemps maintenant.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez me joindre pour discuter d'un article du site, contactez-moi …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bienvenu sur mon nouveau site dédié aux hacks, tutoriels et autres développements
autour de Linux, Android et autres systèmes.&lt;/p&gt;
&lt;p&gt;Ce site reprendra progressivement mes anciens articles issu de mon précédent site
SPIP, non maintenu depuis trop longtemps maintenant.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez me joindre pour discuter d'un article du site, contactez-moi
par &lt;a class="reference external" href="mailto:admin&amp;#64;int21h.eu"&gt;email&lt;/a&gt; ou via &lt;a class="reference external" href="https://mamot.fr/&amp;#64;dfgweb"&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bonne visite à vous.&lt;/p&gt;
</content></entry></feed>