Deblan blog

Simon Vieille

DevOp animé par la culture du libre et du hacking

Mettre en place un VPN avec Wireguard

Les VPN ont le vent en poupe depuis quelques temps. Rares sont les vidéastes qui n'auront pas fait l'éloge de services comme NordVPN. Cependant, avant de permettre de visualiser le contenu US de Netflix, un VPN permet de créer un réseau entre plusieurs machines au travers d'autres réseaux comme Internet. Ainsi, quand des machines sont connectées au même réseau VPN, elles peuvent communiquer de la même façon que dans un réseau local. C'est donc très intéressant lorsque l'ont souhaites isoler une application d'internet en la rendant tout de même accessible dans ce réseau isolé.

VPN

Il existe tout un tas de solutions pour réaliser son VPN. La plus connue est certainement OpenVPN mais je lui préfère Wireguard pour sa très grande simplicité d'installation.

Dans mon cas d'usage, j'ai un serveur Wireguard sous Debian et des clients qui tournent principalement sur Debian mais aussi Windows et Android.

Sous Debian 10, il est nécessaire d'utiliser les dépots backports pour insaller Wireguard.

echo "deb http://deb.debian.org/debian buster-backports main contrib non-free" \
  | sudo tee /etc/apt/sources.list.d/buster-backports.list

Une fois le dépot ajouté, il suffit de mettre à jour la liste des paquets et d'installer Wireguard.

sudo apt update && sudo apt install wireguard

Sur d'autres distributions, il faudra installer wireguard-tools mais je vous laisse vous référer à la page d'installation pour plus d'informations.

En complément de Wireguard, je vous invite à installer iptables et resolvconf sur le serveur et uniquement resolvconf sur vos clients linux. iptables va permettre de realiser le routage des paquets tandis que resolvconf va permettre de gérer les DNS via la connexion VPN.

Une fois l'installation terminée, on va générer un couple de clés sur le serveur.

cd /etc/wireguard
umask 077
wg genkey | tee privateKey | wg pubkey > publicKey

Suite à ces commandes, 2 nouveaux fichiers ont été générés : privateKey contient la clé privée et publicKey contient la clé publique. Il faudra conserver la clé privée secrète tandis que la clé publique va permettre d'identifier le serveur auprès des clients. Son contenu sera donc partagé sur d'autres machines. Vous pouvez réaliser la même opération sur vos machines clientes qui seront elles aussi identifiées avec leur clé publique. Les interfaces graphiques de Wireguard réaliseront la générations des clés automatiquement. Bien sur, vous pouvez créer autant de clés que vous le désirez. Je recommande de créer un couple de clé par serveur VPN.

Exemples

Nous allons ensuite générer le fichier /etc/wireguard/wg0.confwg0 désigne le nom de l'interface réseau qui sera créée par wireguard. Selon vos besoins, vous pourrez en ajouter autant que vous le désirez.

[Interface]
Address = 10.0.0.1/24
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERAD = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = clé_privée_du_serveur

Dans cette configuration, je définie la page IP du réseau (10.0.0.1/24) et l'IP du serveur (10.0.0.1). Veillez à modifier le nom de l'interface connectée à Internet (ici eth0). Insérer également le contenu de la clé privée à la dernière ligne. SaveConfig à false indique que le fichier pourra être modifié pendant que le serveur est lancé. Enfin, on indique que le serveur écoute sur le port 51820. Vous pourrez répéter cette opération sur vos client mais vous devrez omettre les lignes avec PostUp, PostDown et ListenPort. Vous devrez également changer Address en incrémentant l'ip et en fixant la page à 32 (exemple : 10.0.0.2/32, 10.0.0.3/32, etc.).

Enfin, il faudra renseigner la liste des clients du réseau VPN en utilisant leur clé publique et l'adresse IP qu'ils auront configurée.

[Interface]
...

[Peer]
PublicKey = clé_publique_du_client_1
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = clé_publique_du_client_2
AllowedIPs = 10.0.0.3/32

Coté client, il faudra renseigner le serveur :

[Interface]
...

[Peer]
PublicKey = clé_publique_du_server
AllowedIPs = 10.0.0.0/24
Endpoint = ip.du.serveur.vpn:51820
PersistentKeepalive = 20

Dans cet exemple, j'ai définie que seuls les paquets à destination du réseau VPN seront routés dans le VPN : AllowedIPs = 10.0.0.0/24. Si vous voulez router tout votre traffic, saisissez AllowedIPs = 0.0.0.0/0. Pour ajouter plusieurs plages, il suffit de les séparer par des virgules. Dans le bloc [Interface] des clients, vous avez la possibilté d'ajouter une propriété DNS afin de paramétrer un ou plusieurs serveurs DNS. Les serveurs DNS devront être accessibles par le serveur VPN ou le client selon le paramétrage de AllowedIPs. Attention, les DNS seront paramétrés comme des DNS classiques et ils seront sollicités pour résoudre tous les noms.

Une fois les configuration effectuée, vous pourrez démarrer ou arrêter la connexion VPN avec sudo wg-quick up wg0 et wg-quick down wg0 sur le serveur et sur les clients. Vous pourrez monitorer les connexions avec la commande sudo wg.


Migration de blog vers Murph

Mon blog a été mon premier vrai projet quand j'ai commencé de faire du développement web et il me suit toujours aujourd'hui.

Beaucoup de versions ont été réalisées car elles suivent mon évolution et les technologies que j'utilise. La précédente mouture était basée sur Trinity, un CMF basé sur Symfony 2, développé par web&design et sur lequel j'ai beaucoup travaillé. Trinity est puissant mais la conception n'est plus d'actualité et la migration vers une version récente de Symfony est impossible.
Je travaille sur la refonte du site web de l'association Tinternet & cie et s'est rapidement posée la question du CMS. Cela m'a permis d'entreprendre l'écriture de Murph, un CMF qui repose sur Symfony 5 et qui reprend les bonnes idées de Trinity avec une conception qui tient plus la route.

Tandis que Trinity était un hommage à Matrix, Murph est tout droit tiré d'Interstellar, un film pour lequel j'ai une affection très particulière. Voici quelques images du backoffice.

Si le projet vous intéresse, le code source du blog est disponible ici et celui du squelette de Murph se trouve là.


Mon thème pour ZSH

Cela fait des années que j'utilise ZSH comme interpréteur de commande. En complément, j'utilise également des plugins disponibles via l'excellent projet oh-my-zsh.

J'ai harmonisé l'ensemble des configurations sur mes différents accès. Pour ce faire, j'ai principalement travaillé sur le prompt et je publie aujourd'hui le code de mon thème.

Voici une capture d'écran qui décrit l'ensemble des fonctionnalités de mon thème :

  • Une gestion des codes de sortie avec différentes couleurs et éventuellement le code
  • L'affichage de l'heure
  • L'affichage de l'utilisateur et de la machine
  • Changement de couleur si l'utilisateur⋅trice est privilégié⋅e
  • Le chemin courant avec un retour à la ligne s'il dépasse une certaine longueur
  • Intégration de GIT (nécessite olivierverdier/zsh-git-prompt)

Mon thème pour ZSH

Le code source est disponible sur cette page et il est totalement libre.


Google démantèle son éthique (et tout le monde s'en fout...)

Google démantèle son éthique (et tout le monde s'en fout...)

https://tube.fede.re/videos/watch/798c8a45-9457-4fed-80a0-c53b38581de6

En 2 mois, Google a licencié ses deux co-directrices de l'éthique des IA, Timnit Gebru et Margarett Mitchell. Pendant ce temps, Google a aussi développé, et probablement bientôt déployé, des algorithmes entraînés sur d'immenses quantités de données non-sécurisées, de manière extrêmement opaque, ce qui avait été critiqué par les deux co-directrices dans un article de recherche.

Le déploiement précipité d'algorithmes très dangereux sans aucune audit interne ni externe, sur les téléphones de milliards d'humains, me semble absolument terrifiant. Mais le plus effrayant, c'est que cette histoire est complètement ignorée par le grand public, les médias, l'industrie de la tech et le monde académique...

Lien permanent


Bilan tech de l'année 2020

Cette année très particulière m'a quand même permis de consacrer plus de temps pour le logiciel libre que l'an passé.

Mes efforts se sont naturellement dirigés vers les outils que j'utilise et c'est Nextcloud et son écosystème sur lesquels je me suis concentré.

Mon plus gros projet de 2020 est Custom menu, une application pour Nextcloud qui permet de modifier le menu par défaut en proposant d'autres affichages. Je suis très content du résultat et beaucoup d'administrateurs ont décidé de l'installer sur leur instance. En effet, toutes versions confondues, Custom menu a été téléchargé plus de 102 mille fois et les dernières versions sont installées sur environ 9000 instances.

J'ai réalisé du code pour faire évoluer l'application Forms on y ajoutant de nouveaux types de champ. Cela n'a pas du tout été évident d'échanger avec l'équipe de développement mais j'espère voir arriver ces évolutions dans une prochaine version.

Ensuite, j'ai traduis Analytics en français même si je ne suis pas satisfait. Je vais faire de nouvelles traductions l'année prochaine ! Cette application permet de mettre en graphique des données stockées sur Nextcloud ou accessibles depuis une API. C'est encore relativement basique mais c'est tout de même très pratique.

Même si le développement n'est pas très actif, j'utilise l'application Printer et j'ai proposé du code pour gérer les permissions et réduire les risques d'injection de code.

Dans un contexte très différent de Nextcloud, j'ai apporté un correctif au projet PDNS Manager, une interface web qui permet de gérer les enregistrements d'un serveur Powerdns.

J'ai récemment publié Mail RSS, une application pour transformer des emails en flux RSS. Enfin, un peu plus tôt cette année, j'ai mis en ligne les sources du site web qui permet de monitorer le terrarium de la maison.

Je crois avoir fait le tour de mon activité en espérant poursuivre en 2021 !