deblan.io-gemini/blog/posts/599.gmi
2021-04-09 15:40:55 +02:00

130 lines
6.9 KiB
Plaintext

# Mettre en place un VPN avec Wireguard
* 2021-04-07 10:30:00
* Informatique
```html
<p>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é.</p>
```
```html
<p><img src="https://upload.deblan.org/u/2021-04/606cc06e.png" alt="VPN" /></p>
```
```html
<p>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.</p>
```
```html
<p>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.</p>
```
```html
<p>Sous Debian 10, il est nécessaire d'utiliser les dépots backports pour insaller Wireguard.</p>
```
```html
<pre><code class="language-bash">echo "deb http://deb.debian.org/debian buster-backports main contrib non-free" \
| sudo tee /etc/apt/sources.list.d/buster-backports.list
</code></pre>
```
```html
<p>Une fois le dépot ajouté, il suffit de mettre à jour la liste des paquets et d'installer Wireguard.</p>
```
```html
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt install wireguard
</code></pre>
```
```html
<p>Sur d'autres distributions, il faudra installer <code>wireguard-tools</code> mais je vous laisse vous référer à <a href="https://www.wireguard.com/install/">la page d'installation</a> pour plus d'informations.</p>
```
```html
<p>En complément de Wireguard, je vous invite à installer <code>iptables</code> et <code>resolvconf</code> sur le serveur et uniquement <code>resolvconf</code> sur vos clients linux. <code>iptables</code> va permettre de realiser le routage des paquets tandis que <code>resolvconf</code> va permettre de gérer les DNS via la connexion VPN.</p>
```
```html
<p>Une fois l'installation terminée, on va générer un couple de clés sur le serveur.</p>
```
```html
<pre><code class="language-bash">cd /etc/wireguard
umask 077
wg genkey | tee privateKey | wg pubkey &gt; publicKey
</code></pre>
```
```html
<p>Suite à ces commandes, 2 nouveaux fichiers ont été générés : <code>privateKey</code> contient la clé privée et <code>publicKey</code> 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.</p>
```
```html
<p><img src="https://upload.deblan.org/u/2021-04/606cd5c8.jpg" alt="Exemples" /></p>
```
```html
<p>Nous allons ensuite générer le fichier <code>/etc/wireguard/wg0.conf</code> où <code>wg0</code> 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.</p>
```
```html
<pre><code class="language-bash">[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
</code></pre>
```
```html
<p>Dans cette configuration, je définie la page IP du réseau (<code>10.0.0.1/24</code>) et l'IP du serveur (<code>10.0.0.1</code>). Veillez à modifier le nom de l'interface connectée à Internet (ici <code>eth0</code>). Insérer également le contenu de la clé privée à la dernière ligne. <code>SaveConfig</code> à <code>false</code> indique que le fichier pourra être modifié pendant que le serveur est lancé. Enfin, on indique que le serveur écoute sur le port <code>51820</code>.
Vous pourrez répéter cette opération sur vos client mais vous devrez omettre les lignes avec <code>PostUp</code>, <code>PostDown</code> et <code>ListenPort</code>. Vous devrez également changer <code>Address</code> en incrémentant l'ip et en fixant la page à 32 (exemple : <code>10.0.0.2/32</code>, <code>10.0.0.3/32</code>, etc.).</p>
```
```html
<p>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.</p>
```
```html
<pre><code class="language-bash">[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
</code></pre>
```
```html
<p>Coté client, il faudra renseigner le serveur :</p>
```
```html
<pre><code class="language-bash">[Interface]
...
[Peer]
PublicKey = clé_publique_du_server
AllowedIPs = 10.0.0.0/24
Endpoint = ip.du.serveur.vpn:51820
PersistentKeepalive = 20
</code></pre>
```
```html
<p>Dans cet exemple, j'ai définie que seuls les paquets à destination du réseau VPN seront routés dans le VPN : <code>AllowedIPs = 10.0.0.0/24</code>. Si vous voulez router tout votre traffic, saisissez <code>AllowedIPs = 0.0.0.0/0</code>. Pour ajouter plusieurs plages, il suffit de les séparer par des virgules.
Dans le bloc <code>[Interface]</code> des clients, vous avez la possibilté d'ajouter une propriété <code>DNS</code> 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 <code>AllowedIPs</code>. Attention, les DNS seront paramétrés comme des DNS classiques et ils seront sollicités pour résoudre tous les noms.</p>
```
```html
<p>Une fois les configuration effectuée, vous pourrez démarrer ou arrêter la connexion VPN avec <code>sudo wg-quick up wg0</code> et <code>wg-quick down wg0</code> sur le serveur et sur les clients. Vous pourrez monitorer les connexions avec la commande <code>sudo wg</code>.</p>
```