# Tunnel L3 - Wireguard

## **1. Introduction : Pourquoi utiliser Wireguard ?**

### **1.1. À quoi sert un tunnel Wireguard ?**

<span style="white-space: pre-wrap;">Un tunnel </span>**Wireguard**<span style="white-space: pre-wrap;"> permet de créer un lien direct et sécurisé entre deux réseaux distants. Wireguard est un protocole VPN moderne, rapide et simple à configurer. </span>**Exemple concret :**

- Vous avez un réseau local derrière une box opérateur standard.
- Vous voulez une IP publique sur une ou des machines sur votre réseau local

### **1.2. Avantages de Wireguard**

- Extrêmement simple à configurer.
- Chiffrement intégré (pas besoin d'IPsec en complément).
- Connexion possible en IPv4 &amp; IPv6.
- Règles de routage ajoutées automatiquement.
- Aucun port à ouvrir côté client (traverse le NAT nativement).
- Protocole léger et performant.

### **1.3. Inconvénients**

- Moins de support natif sur certains routeurs (Cisco, Juniper...).
- Protocole plus récent que GRE ou IPIP.

---

## **2. Prérequis**

### **2.1. Ce dont vous avez besoin**

- <span style="white-space: pre-wrap;">Un </span>**routeur compatible Wireguard**<span style="white-space: pre-wrap;"> (Linux, MikroTik, etc.).</span>
- <span style="white-space: pre-wrap;">Un </span>**service Tunnel-IP**.

### **2.2. Ports et NAT**

- <span style="white-space: pre-wrap;">Wireguard utilise </span>**UDP**<span style="white-space: pre-wrap;"> (port par défaut : 51820).</span>
- <span style="white-space: pre-wrap;">Contrairement à GRE et IPIP, </span>**aucune redirection de port n'est nécessaire côté client**. Wireguard traverse le NAT nativement grâce au mécanisme de keepalive.

---

## **3. Étape 1 : Créer le tunnel sur Tunnel-IP.com**

### **3.1. Accéder au tableau de bord**

1. <span style="white-space: pre-wrap;">Connectez-vous à </span>[panel.tunnel-ip.com](https://panel.tunnel-ip.com)
2. <span style="white-space: pre-wrap;">Allez dans </span>**"Tunnels"**<span style="white-space: pre-wrap;"> &gt; </span>**"Wireguard"**.
3. Remplissez les informations :
    - **Nom du tunnel**<span style="white-space: pre-wrap;"> (ex : </span>`<span class="editor-theme-code">Tunnel_X</span>`).
    - **Endpoint**<span style="white-space: pre-wrap;"> (IP publique du routeur / box, ex : </span>`<span class="editor-theme-code">203.0.113.1</span>`).
4. Validez. La plateforme s'occupera de choisir les IPs et de configurer le tunnel côté Tunnel-IP.com.
5. Attendez que le tunnel soit créé
6. Cliquez sur "Accéder" pour récupérer les détails du tunnel

<span style="white-space: pre-wrap;">Il vous suffit de configurer votre wireguard avec les paramètres indiqués en </span>**1**<span style="white-space: pre-wrap;">, pour linux vous pouvez suivre </span>[ce tutoriel](https://www.malekal.com/utiliser-wg-quick-wireguard/)

### **3.2. Créer le subnet (Route côté plateforme)**

1\. Allez dans "Subnets"

2\. Copiez le bloc d'IP publique et collez le dans le formulaire

3\. Cliquez sur Créer

4\. Une fois son statut à "Actif", la route est correctement installée sur les routeurs de la plateforme, il ne vous reste plus qu'à configurer le tunnel

---

## **4. Étape 2 : Configurer le tunnel**

### **4.1. Exemple pour Linux (Ubuntu/Debian) avec wg-quick**

#### **Étapes :**

1. **Installer Wireguard**<span style="white-space: pre-wrap;"> :</span>  
    ```
    apt update && apt install wireguard -y
    ```
2. **Créer le fichier de configuration**<span style="white-space: pre-wrap;"> :</span>  
    ```
    nano /etc/wireguard/wg0.conf
    ```
    
      
    Contenu du fichier (à adapter avec les paramètres fournis par la plateforme) :  
    ```
    [Interface]
     PrivateKey = <votre_clé_privée>
     Address = 100.64.0.6/30
     Address = fd00:42:cafe:1::2/64
    
     [Peer]
     PublicKey = <clé_publique_plateforme>
     Endpoint = 172.16.126.33:51820
     AllowedIPs = 0.0.0.0/0, ::/0
     PersistentKeepalive = 25
    ```
    
    
    - `<span class="editor-theme-code">PrivateKey</span>`<span style="white-space: pre-wrap;"> : Votre clé privée (générée automatiquement ou manuellement avec </span>`<span class="editor-theme-code">wg genkey</span>`).
    - `<span class="editor-theme-code">Address</span>`<span style="white-space: pre-wrap;"> : IPs internes du tunnel (fournies par la plateforme).</span>
    - `<span class="editor-theme-code">PublicKey</span>`<span style="white-space: pre-wrap;"> : Clé publique du serveur Tunnel-IP.com.</span>
    - `<span class="editor-theme-code">Endpoint</span>`<span style="white-space: pre-wrap;"> : Adresse et port du serveur distant.</span>
    - `<span class="editor-theme-code">AllowedIPs</span>`<span style="white-space: pre-wrap;"> : Plages d'IPs autorisées à passer par le tunnel.</span>
    - `<span class="editor-theme-code">PersistentKeepalive</span>`<span style="white-space: pre-wrap;"> : Envoie un paquet toutes les 25 secondes pour maintenir la connexion à travers le NAT.</span>
3. **Activer le tunnel**<span style="white-space: pre-wrap;"> :</span>  
    ```
    wg-quick up wg0
    ```
4. **Activer au démarrage**<span style="white-space: pre-wrap;"> :</span>  
    ```
    systemctl enable wg-quick@wg0
    ```
5. **Activer le forwarding IP**<span style="white-space: pre-wrap;"> (pour permettre le routage) :</span>  
    ```
    echo 1 > /proc/sys/net/ipv4/ip_forward
    ```
    
      
    **(Pour rendre permanent, ajoutez** **`<strong class="editor-theme-bold editor-theme-code editor-theme-italic">net.ipv4.ip_forward=1</strong>`** **dans** **`<strong class="editor-theme-bold editor-theme-code editor-theme-italic">/etc/sysctl.conf</strong>`*****.)**

---

### **4.2. Exemple pour MikroTik**

#### **Étapes :**

1. **Créer l'interface Wireguard**<span style="white-space: pre-wrap;"> :</span>```
    /interface/wireguard/add name=wg0 listen-port=51820
    ```
2. **Récupérer la clé publique**<span style="white-space: pre-wrap;"> (à fournir à la plateforme) :</span>```
    /interface/wireguard/print
    ```
3. **Ajouter le peer (serveur Tunnel-IP.com)**<span style="white-space: pre-wrap;"> :</span>```
    /interface/wireguard/peers/add interface=wg0 \
       public-key="<clé_publique_plateforme>" \
       endpoint-address=172.16.126.33 \
       endpoint-port=51820 \
       allowed-address=0.0.0.0/0,::/0 \
       persistent-keepalive=25
    ```
4. **Assigner une IP au tunnel**<span style="white-space: pre-wrap;"> :</span>```
    /ip/address/add address=100.64.0.6/30 interface=wg0
     /ipv6/address/add address=fd00:42:cafe:1::2/64 interface=wg0
    ```

---

### **4.3. Note pour Cisco, Arista et Juniper**

<p class="callout warning">Wireguard n'est pas nativement supporté sur la plupart des routeurs Cisco (IOS/XE), Arista (EOS) et Juniper (JunOS). Si vous devez utiliser l'un de ces équipements, vous pouvez :</p>

- Utiliser un serveur Linux comme point de terminaison Wireguard, puis router le trafic vers votre routeur.
- Utiliser un autre type de tunnel (GRE, IPIP, IPsec) nativement supporté par ces équipements.

---

## **5. Étape 3 : Router les IP publiques vers le tunnel**

### **5.1. Pourquoi ?**

<span style="white-space: pre-wrap;">La plateforme vous route un bloc d'IP publiques (ex : </span>`<span class="editor-theme-code">198.51.100.0/30</span>`) sur votre IP interne du tunnel, afin que ces IPs fonctionnent correctement, vous devez router ce bloc d'IP sur votre réseau et le trafic sortant par le tunnel.

Pour cela, 3 principales méthodes s'offrent à vous :

- **NAT 1:1**<span style="white-space: pre-wrap;"> (1 IP publique → 1 IP privée)</span>
- **LAN public**<span style="white-space: pre-wrap;"> (utilisation directe des IPs publiques)</span>
- **Routage en /32**<span style="white-space: pre-wrap;"> (1 IP publique par machine)</span>

---

### **5.2. Rappel : Architecture du Tunnel**

```
Internet → [Infrastructure Tunnel-IP.com] → (Tunnel Wireguard) → [Votre Routeur] → [Votre Réseau]
```

- <span style="white-space: pre-wrap;">La plateforme vous route un bloc public (ex: </span>`<span class="editor-theme-code">198.51.100.0/30</span>`).
- Votre routeur doit gérer ce bloc pour exposer vos services.

---

### **5.3. Cas d'Usage du Bloc /30**

<span style="white-space: pre-wrap;">Un </span>`<span class="editor-theme-code">/30</span>`<span style="white-space: pre-wrap;"> contient </span>**4 adresses IP**<span style="white-space: pre-wrap;"> :</span>

- `<span class="editor-theme-code">198.51.100.0</span>`<span style="white-space: pre-wrap;"> : Adresse réseau (inutilisable en LAN).</span>
- `<span class="editor-theme-code">198.51.100.1</span>`<span style="white-space: pre-wrap;"> : IP Utilisable</span>
- `<span class="editor-theme-code">198.51.100.2</span>`<span style="white-space: pre-wrap;"> : IP Utilisable</span>
- `<span class="editor-theme-code">198.51.100.3</span>`<span style="white-space: pre-wrap;"> : Adresse broadcast (inutilisable en LAN).</span>

---

### **5.4. Méthode 1 : NAT 1:1 (Translation 1 IP publique → 1 IP privée)**

**Avantages principaux :**<span style="white-space: pre-wrap;"> Permet de ne pas avoir à modifier l'adressage privé de votre réseau, et permet d'utiliser l'IP de réseau et broadcast.</span>

**Inconvénients :**<span style="white-space: pre-wrap;"> Adressage moins clair (Conversion IP publique -&gt; privée), charge plus lourde sur le routeur (Le routeur est en charge de la translation NAT)</span>

### **Schéma :**

```
Internet → Infrastructure Tunnel-IP.com → [Votre Routeur] 198.51.100.0 → 192.168.1.100 (Privée)
```

### **Configurations :**

#### **Linux :**

```
# Activer l'IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Ajouter l'IP sur une interface (on utilise la loopback par exemple)
ip a add 198.51.100.0/32 dev lo

# 1:1 Static NAT
iptables -t nat -A PREROUTING -d 198.51.100.0 -j DNAT --to-destination 192.168.1.100
iptables -t nat -A POSTROUTING -s 192.168.1.100 -j SNAT --to-source 198.51.100.0
```

#### **MikroTik :**

```
/ip address add address=198.51.100.0/32 interface=eth0
/ip firewall nat add chain=dstnat dst-address=198.51.100.0 action=dst-nat to-addresses=192.168.1.100
/ip firewall nat add chain=srcnat src-address=192.168.1.100 action=src-nat to-addresses=198.51.100.0
```

---

### **5.5 Méthode 2 : LAN Public (Utilisation directe des IPs publiques)**

**Avantages principaux :**<span style="white-space: pre-wrap;"> Adressage propre, explicite</span>

**Inconvénients :**<span style="white-space: pre-wrap;"> Perte de 2 IPs utilisables (IP de réseau et IP de broadcast) + 1 IP est forcément assignée au routeur.</span>

<p class="callout warning">**(Attention : Avec un /30 en LAN, vous n'avez qu'une seule IP utilisable. Pour plus d'IPs, prenez un bloc plus grand, ex:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">/29</span>`**. ou faites du NAT 1:1 ou attribution en /32)**</p>

### **Configurations :**

#### **Linux :**

```
# Assigner l'IP de la passerelle (votre routeur)
ip addr add 198.51.100.1/30 dev eth1
```

#### **MikroTik :**

```
/ip address add address=198.51.100.1/30 interface=ether1
```

---

### **5.6. Méthode 3 : Routage en /32 (1 IP publique par machine)**

**Avantages principaux :**<span style="white-space: pre-wrap;"> Adressage propre, explicite, aucune perte d'IP</span>

**Inconvénients :**<span style="white-space: pre-wrap;"> Non supporté par Windows, mal supporté par certains routeurs / OS, 100% du trafic passe par le routeur</span>

### **Configurations :**

#### **Linux :**

```
# Sur le routeur :
ip route add 198.51.100.0/30 dev eth0  # eth0 = interface vers la Machine A

# Sur la Machine A :
ip addr add 203.0.113.1/32 dev eth0
ip route add default via 192.168.1.100 dev eth0 # IP de votre routeur local
# Si error lors de l'ajout de la route, il faut ajouter une règle :
# ip route add 192.168.1.100 dev eth0
```

#### **MikroTik :**

```
/ip route add dst-address=198.51.100.0/30 interface=LAN

# Sur la Machine A :
# Pareil que pour Linux, IP : 198.51.100.1 Gateway 192.168.1.100
```

---

### **5.7. Router le trafic sortant par le tunnel**

<p class="callout danger">Si vous ne faites pas cette étape, les IPs ne fonctionneront pas</p>

<p class="callout info"><span style="white-space: pre-wrap;">Si vous avez configuré </span>`<span class="editor-theme-code">AllowedIPs = 0.0.0.0/0</span>`<span style="white-space: pre-wrap;"> dans votre configuration Wireguard, tout le trafic passe déjà par le tunnel. Cependant, si vous souhaitez un routage plus fin (uniquement le trafic des IPs publiques), utilisez les méthodes ci-dessous :</span></p>

#### **Linux (ip route + policy routing)**

```
# Création d'une table de routage
echo "144 tunnel" >> /etc/iproute2/rt_tables

# Routage vers l'extérieur via l'IP locale de la plateforme
ip route add default via 100.64.0.5 table tunnel
# Tout le trafic en provenance de nos IPs publiques, sortent via le tunnel
ip rule add from 198.51.100.0/30 table tunnel
```

**Effet :**<span style="white-space: pre-wrap;"> Tout hôte du réseau </span>`<span class="editor-theme-code">198.51.100.0/30</span>`<span style="white-space: pre-wrap;"> sort par le tunnel, les autres via la gateway par défaut.</span>

<p class="callout info">Si vous êtes à l'aise avec les VRF, il est aussi possible de faire avec :</p>

```
ip link add vrf-WG type vrf table 144 # On créer la VRF
ip link set dev wg0 master vrf-WG # On ajoute le tunnel dans la VRF
ip route add default via 100.64.0.5 table 144 # On ajoute la route par défaut
ip link set dev eth0 master vrf-WG # On ajoute notre interface LAN dans la VRF (Attention si elle est partagée avec votre réseau local, le réseau local ne marchera plus, pour cela vous pouvez créer une interface dummy ou utiliser une interface séparée)
```

---

#### MikroTik

```
/routing/table/add name=WG-OUT fib
/routing/rule/add action=lookup-only-in-table table=WG-OUT src-address=198.51.100.0/30
/ip route add dst-address=0.0.0.0/0 gateway=100.64.0.5 routing-table=WG-OUT
```

<p class="callout info">Si vous êtes à l'aise avec les VRF, il est aussi possible de faire avec :</p>

```
/ip/vrf add name=WG-VRF interfaces=wg0,ether1
/ip route add routing-table=WG-VRF dst-address=0.0.0.0/0 gateway=100.64.0.5
```

---

## **6. Commandes spécifiques par constructeur**

<table id="bkmrk-constructeurcommande"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>Constructeur

</th><th>Commande pour vérifier le tunnel

</th><th>Commande pour vérifier le routage

</th></tr><tr><td>**Linux**

</td><td>`<span class="editor-theme-code">wg show</span>`

</td><td>`<span class="editor-theme-code">ip route</span>`

</td></tr><tr><td>**MikroTik**

</td><td>`<span class="editor-theme-code">/interface wireguard print</span>`

</td><td>`<span class="editor-theme-code">/ip route print</span>`

</td></tr></tbody></table>

## **7. Vérification et Dépannage**

### **7.1. Tester la connectivité**

- **Depuis votre routeur**<span style="white-space: pre-wrap;"> :</span>```
    ping 100.64.0.5 # Ping de l'ip distante du tunnel
      wg show # Vérifier l'état du handshake
    ```
- **Depuis une machine locale**<span style="white-space: pre-wrap;"> :</span>```
    ping 8.8.8.8 # Vérification internet
      curl -4 ifconfig.me # Vérification de l'IP sortante
    ```

### **7.2. Problèmes courants**

<table id="bkmrk-sympt%C3%B4mecause-possib"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>**Symptôme**</th><th>**Cause Possible**</th><th>**Solution**</th></tr><tr><td>Le tunnel ne s'établit pas (pas de handshake)

</td><td>Clé publique/privée incorrecte

</td><td><span style="white-space: pre-wrap;">Vérifiez les clés avec </span>

`<span class="editor-theme-code">wg show</span>`

<span style="white-space: pre-wrap;"> et comparez avec la plateforme</span>

</td></tr><tr><td>Le tunnel ne s'établit pas

</td><td>Endpoint incorrect ou port UDP bloqué

</td><td>Vérifiez l'endpoint et que le port UDP est accessible

</td></tr><tr><td>Les IPs publiques ne pingent pas

</td><td>Route manquante ou NAT mal configuré

</td><td><span style="white-space: pre-wrap;">Vérifiez </span>

`<span class="editor-theme-code">ip route</span>`

<span style="white-space: pre-wrap;"> ou </span>

`<span class="editor-theme-code">/ip route print</span>`

</td></tr><tr><td>Latence élevée / Pertes de paquets

</td><td>MTU trop grande

</td><td><span style="white-space: pre-wrap;">Réduisez la MTU : </span>

`<span class="editor-theme-code">ip link set mtu 1420 dev wg0</span>`

</td></tr><tr><td>Connexion perdue derrière NAT

</td><td>PersistentKeepalive non configuré

</td><td><span style="white-space: pre-wrap;">Ajoutez </span>

`<span class="editor-theme-code">PersistentKeepalive = 25</span>`

<span style="white-space: pre-wrap;"> dans la configuration du peer</span>

</td></tr></tbody></table>

---

## **8. Bonnes Pratiques**

1. **Sécurité**<span style="white-space: pre-wrap;"> :</span>
    - Wireguard intègre le chiffrement nativement (ChaCha20, Poly1305, Curve25519).
    - <span style="white-space: pre-wrap;">Filtrez le trafic entrant avec un pare-feu (ex: </span>`<span class="editor-theme-code">iptables</span>`).
    - Protégez vos clés privées et ne les partagez jamais.
2. **Performance**<span style="white-space: pre-wrap;"> :</span>
    - <span style="white-space: pre-wrap;">La MTU par défaut de Wireguard est </span>`<span class="editor-theme-code">1420</span>`. Ajustez si nécessaire en fonction de votre connexion.
    - <span style="white-space: pre-wrap;">Activez le </span>**PersistentKeepalive**<span style="white-space: pre-wrap;"> (ex: </span>`<span class="editor-theme-code">25</span>`<span style="white-space: pre-wrap;"> secondes) si vous êtes derrière un NAT.</span>
3. **Redondance**<span style="white-space: pre-wrap;"> :</span>
    - Configurez un deuxième tunnel Wireguard pour le failover.

---