Compare commits
No commits in common. "6837bd8ee12a3a48dc84f500e830f3ce1d4f49da" and "4d83b20f5a14866ddf5918c6ff5263ca49ca1be7" have entirely different histories.
6837bd8ee1
...
4d83b20f5a
2 changed files with 1 additions and 214 deletions
|
@ -1,213 +0,0 @@
|
||||||
Title: Wireguard et OpenWRT, le VPN facile
|
|
||||||
Category: sysadmin
|
|
||||||
Tags: réseau, VPN, OpenWRT, Android, pl-fr, sécurité
|
|
||||||
Date: 2020-04-02 14:34
|
|
||||||
|
|
||||||
[Wireguard][l_wireguard] est un logiciel et un protocole de communication pour
|
|
||||||
créer un **VPN en mode point à point routé ou bridgé**. Il se compose d'un
|
|
||||||
module noyau et d'outils en espace utilisateur.
|
|
||||||
|
|
||||||
Il se veut **léger**, **sécurisé**, **facile à configurer** (coucou OpenVPN) et
|
|
||||||
intègre par défaut des protocoles de chiffrement modernes :
|
|
||||||
|
|
||||||
- [Curve25519][l_curve] pour l'échange de clé.
|
|
||||||
- [ChaCha20 ][l_chacha] pour le chiffrement et [Poly1305][l_poly] pour
|
|
||||||
l'authentification des messages.
|
|
||||||
- [SipHash][l_siphash] pour les [tables de hachage][l_hashtable].
|
|
||||||
- [BLAKE2s][l_blake2] comme fonction de hachage [cryptographique][l_hashc]
|
|
||||||
|
|
||||||
Il devrait être intégré comme **module du noyau GNU/Linux dans la version 5.6**
|
|
||||||
mais il est d'ores est déjà disponible via dkms sur des distributions comme
|
|
||||||
Debian ou Archlinux ou encore FreeBSD.
|
|
||||||
|
|
||||||
Il est aussi disponible dans **les dépôts OpenWRT**, le sujet même de cet
|
|
||||||
article
|
|
||||||
|
|
||||||
## Installation sous OpenWRT
|
|
||||||
|
|
||||||
Je vais l'installer sur mon [Turris Omnia][l_turris], mais avant toute chose, je
|
|
||||||
vais définir le plan d'adressage :
|
|
||||||
|
|
||||||
- le LAN déjà en place avec la place 192.168.100.0/24 et la passerelle en
|
|
||||||
192.168.100.254 (le routeur)
|
|
||||||
- tout ce qui concerne Wireguard avec comme adresse 10.100.100.0/24 avec comme
|
|
||||||
passerelle 10.100.100.254 (notre interface wireguard sur le routeur).
|
|
||||||
|
|
||||||
Pour commencer l'installation, connectons nous en SSH[^n_ssh] au routeur:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
opkg install wireguard wireguard-tools
|
|
||||||
```
|
|
||||||
|
|
||||||
Il est conseillé de **redémarrer le routeur** après l'installation de Wireguard
|
|
||||||
pour que le module noyau soit chargé[^n_reboot].
|
|
||||||
|
|
||||||
[^n_ssh]:Il est possible de le faire entièrement avec LUCI, l'interface graphique
|
|
||||||
d'OpenWRT mais ce n'est pas le sujet de cet article.
|
|
||||||
|
|
||||||
[^n_reboot]:Certain utilisateurs on rapporté des instabilités lorsque le routeur
|
|
||||||
n'était pas redémarré après l'installation.
|
|
||||||
|
|
||||||
### Générer la paire de clefs
|
|
||||||
|
|
||||||
Pour fonctionner, Wireguard utilise une **paire de clefs privée / publique**
|
|
||||||
qu'il est possible de générer via `wg`.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
umask u=rw,g=,o=
|
|
||||||
wg genkey | tee wireguard.key | wg pubkey > wireguard.pub
|
|
||||||
```
|
|
||||||
|
|
||||||
### Créer l'interface réseau
|
|
||||||
|
|
||||||
Maintenant que les clefs sont créées et le port ouvert nous allons configurer
|
|
||||||
notre interface réseau dédiées à Wireguard.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
uci set network.wg0="interface"
|
|
||||||
uci set network.wg0.proto="wireguard"
|
|
||||||
uci set network.wg0.private_key="$(cat /root/wireguard.key)"
|
|
||||||
uci set network.wg0.listen_port="51820"
|
|
||||||
uci add_list network.wg0.adresses="10.100.100.254/24"
|
|
||||||
uci commit network
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ouvrir le port udp nécessaire
|
|
||||||
|
|
||||||
Wireguard fonctionne exclusivement en UDP, il est donc nécessaire d'ouvrir un
|
|
||||||
port sur notre pare-feu afin de laisser passer les trames nécessaires. Le port
|
|
||||||
choisit est le 51820, voici les commandes à entrer (toujours via SSH)
|
|
||||||
|
|
||||||
```shell
|
|
||||||
uci add firewall rule
|
|
||||||
uci set firewall.@rule[-1].src="wan"
|
|
||||||
uci set firewall.@rule[-1].target="ACCEPT"
|
|
||||||
uci set firewall.@rule[-1].proto="udp"
|
|
||||||
uci set firewall.@rule[-1].dest_port="51820"
|
|
||||||
uci set firewall.@rule[-1].name="Allow Wireguard Inbound"
|
|
||||||
uci commit firewall
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ajouter les règles au pare-feu pour notre nouvelle interface
|
|
||||||
|
|
||||||
Il serait possible de créer une nouvelle zone de pare-feu pour régler finement
|
|
||||||
le pare-feu pour notre interface `wg0`. Nous allons nous contenter de rattacher
|
|
||||||
cette interface à notre zone lan.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
uci rename firewall.@zone[0]="lan"
|
|
||||||
uci add_list firewall.lan.network="wg0"
|
|
||||||
uci commit
|
|
||||||
/etc/init.d/firewall restart
|
|
||||||
```
|
|
||||||
|
|
||||||
### Configurer un "peer" sur le routeur
|
|
||||||
|
|
||||||
Dans le langage de Wireguard, **un peer est une machine cliente**. Nous allons
|
|
||||||
maintenant en rajouter un. Mais avant il faut penser à créer un couple de clefs
|
|
||||||
publique / privée pour celui-ci.
|
|
||||||
|
|
||||||
|
|
||||||
Il est aussi possible de générer une *pre-shared key* afin de renforcer le
|
|
||||||
chiffrement **celle-ci devra être différente pour chaque client pour des
|
|
||||||
raisons de sécurité** :
|
|
||||||
|
|
||||||
```shell
|
|
||||||
wg genpsk > client1.psk
|
|
||||||
```
|
|
||||||
|
|
||||||
Puis configurer notre premier client :
|
|
||||||
|
|
||||||
```shell
|
|
||||||
uci set network.wgclient="wireguard_wg0"
|
|
||||||
uci set network.wgclient.public_key="<cle_publique_client1>"
|
|
||||||
uci set network.wgclient.preshared_key="$(cat /root/client1.psk)"
|
|
||||||
uci add_list network.wgclient.allowed_ips="10.100.100.0/24"
|
|
||||||
uci add_list network.wgclient.description="My phone"
|
|
||||||
uci commit network
|
|
||||||
/etc/init.d/network restart
|
|
||||||
```
|
|
||||||
|
|
||||||
Il faut bien sûr remplacer `<cle_publique_client1>` par la clé publique de votre
|
|
||||||
client.
|
|
||||||
|
|
||||||
## Configuer son Client.
|
|
||||||
|
|
||||||
Le client se configure à l'aide d'un fichier de configuration, voici un exemple
|
|
||||||
que l'on nommera `wg.conf`:
|
|
||||||
|
|
||||||
```
|
|
||||||
[interface]
|
|
||||||
Address = 10.100.100.42/32
|
|
||||||
PrivateKey = <clé_privée_client1>
|
|
||||||
|
|
||||||
[peer]
|
|
||||||
EndPoint = <ip_publique_openwrt>:51820
|
|
||||||
AllowedIPs = 0.0.0.0/24
|
|
||||||
PersistentKeepAlive = 25
|
|
||||||
PreSHaredKey = <cle_psk_client1>
|
|
||||||
PublicKey = <clé_publique_serveur>
|
|
||||||
```
|
|
||||||
|
|
||||||
Il faut bien sur remplacer ces éléments :
|
|
||||||
|
|
||||||
- `<clé_privée_client1>` par la clé privée de votre client, nous avons utilisé
|
|
||||||
la clé publique pour configurer l'accès sur notre routeur
|
|
||||||
- `<ip_publique_openwrt>` par l'adresse IP publique de votre routeur (ou son
|
|
||||||
nom DNS)
|
|
||||||
- `<cle_psk_client1>` par la *pre shared key* que nous avons créé pour la
|
|
||||||
configuration de notre client sur le routeur
|
|
||||||
- `<clé_publique_serveur>` par la clé publique de notre Wireguard sur le
|
|
||||||
routeur créée au tout début de cet article.
|
|
||||||
- `AllowedIPs = 0.0.0.0/24` signifie que tous le trafic de notre client sera
|
|
||||||
envoyé vers le VPN. Cette partie est à adapter selon les besoins.
|
|
||||||
|
|
||||||
Ce fichier servira à la commande `wg-quick` pour lancer la connexion sur un
|
|
||||||
système *NIX, ou sera à importer dans l'interface graphique de Wireguard sous
|
|
||||||
Windows.
|
|
||||||
|
|
||||||
Il existe aussi une version Android disponible sur
|
|
||||||
[F-Droid][l_wg-fdroid][^n_fdroid], dans ce cas on peut utiliser un QR-code. Il
|
|
||||||
est possible de le générer dans un terminal avec [qrencode][l_qrencode]. Il est
|
|
||||||
disponible sur Archlinux, Debian et FreeBSD (de ce que j'ai vérifié) et sûrement
|
|
||||||
d'autre distributions / systèmes.
|
|
||||||
|
|
||||||
Sous Archlinux, en `root` ça donne :
|
|
||||||
|
|
||||||
```shell
|
|
||||||
pacman -S qrencode
|
|
||||||
qrencode -t ansiutf8 < wg0.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
Il ne reste plus qu'à *"flasher"* le QR-code avec l'application Android.
|
|
||||||
|
|
||||||
## En conclusion
|
|
||||||
|
|
||||||
Voici une solution simple et efficace de mettre en place un VPN léger, robuste
|
|
||||||
et fiable sur son routeur. Avec Wireguard, j'ai accès à mon réseau local depuis
|
|
||||||
n'importe où que se soit sur mon ordinateur portable ou mon ordiphone. Il est
|
|
||||||
bien entendu possible **d'aller plus loin** : routage plus fin, pare-feu plus
|
|
||||||
élaboré, plan d'adressage plus complexe etc.
|
|
||||||
|
|
||||||
[^n_fdroid]:Il l'est sûrement aussi sur le Google Play Store.
|
|
||||||
|
|
||||||
## Bibliographie
|
|
||||||
|
|
||||||
- [La documentation](https://doc.turris.cz/doc/en/public/wireguard) sur le site
|
|
||||||
du Turris Omnia
|
|
||||||
- [Wireguard](https://openwrt.org/docs/guide-user/services/vpn/wireguard/basic)
|
|
||||||
sur le wiki d'OpenWRT
|
|
||||||
|
|
||||||
*[VPN]:Virtual Private Network
|
|
||||||
|
|
||||||
[l_wireguard]:https://www.wireguard.com/
|
|
||||||
[l_curve]:https://fr.wikipedia.org/wiki/Curve25519
|
|
||||||
[l_chacha]:https://fr.wikipedia.org/wiki/Salsa20#Chacha
|
|
||||||
[l_poly]:https://en.wikipedia.org/wiki/Poly1305
|
|
||||||
[l_siphash]:https://en.wikipedia.org/wiki/SipHash
|
|
||||||
[l_hashtable]:https://fr.wikipedia.org/wiki/Table_de_hachage
|
|
||||||
[l_blake2]:https://en.wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2
|
|
||||||
[l_hashc]:https://fr.wikipedia.org/wiki/Fonction_de_hachage_cryptographique
|
|
||||||
[l_turris]:https://www.turris.cz/en/omnia/
|
|
||||||
[l_wg-fdroid]:https://f-droid.org/en/packages/com.wireguard.android/
|
|
||||||
[l_qrencode]:https://fukuchi.org/works/qrencode/
|
|
2
theme
2
theme
|
@ -1 +1 @@
|
||||||
Subproject commit 505f5cbea00dfb537ec93f2ba96fba389f0f7acd
|
Subproject commit bd554b3814185be6fc9f5fc8180873fa49d2ece7
|
Loading…
Add table
Add a link
Reference in a new issue