> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/reseau/tunnel/tunnel-gre.md).

# Tunnel GRE

GRE (Generic Routing Encapsulation) est un protocole pour encapsuler des paquets dans d'autres paquets réseaux. Il fonctionne avec un certain nombre de protocoles de la couche réseau.

### **GRE entre 2 machines sur le même réseau local**

1. Sur la 1ère machine:

**Création du tunnel**

```
sudo apt -y install iproute2
sudo ip tunnel add gre1 mode gre remote <ip machine 2> local <ip machine 1> ttl 255
```

**Ajout d'une IP et activation de l'interface**

```
sudo ip addr add 10.0.0.1/24 dev gre1
sudo ip link set gre1 up
sudo sysctl -w net.ipv4.ip_forward=1
```

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2FQ7MUvKHj42107v2EgO3G%2FCapture%20d%E2%80%99%C3%A9cran%202024-03-11%20102011.png?alt=media&amp;token=1454c557-e930-4f31-933d-2eb80686ea5e" alt=""><figcaption><p>Nouvelle interface</p></figcaption></figure>

{% hint style="success" %}
On voit bien notre interface `gre1` activée avec son IP et le lien entre les 2 IP des machines.&#x20;

Les interfaces 5, 6 et 7 sont créées par la commande:

```
sudo ip tunnel add gre1 mode gre remote <ip machine 2> local <ip machine 1> ttl 255
```

{% endhint %}

2. Sur la 2e machine:

**Création du tunnel**

```
sudo apt -y install iproute2
sudo ip tunnel add gre1 mode gre remote <ip machine 1> local <ip machine 2> ttl 255
```

**Ajout d'une IP et activation de l'interface**

```
sudo ip addr add 10.0.0.2/24 dev gre1
sudo ip link set gre1 up
sudo sysctl -w net.ipv4.ip_forward=1
```

Si on peut ping avec les IP de la nouvelle interface c'est bon !

```
# Depuis la 1ère machine
ping 10.0.0.2

# Depuis la 2e machine
ping 10.0.0.1
```

**Capture du trafic**

Si la machine 1 est connectée au réseau local avec l'interface `ens18`

```
wireshark -k -i ens18
```

{% hint style="warning" %}
Il faut que **Wireshark écoute sur l'interface du réseau local**, pas sur la nouvelle interface créée pour le tunnel !
{% endhint %}

<figure><img src="https://1813806532-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZRRTPIEA4wb6exZozwS0%2Fuploads%2F2J5a6hmn0Qf01XAzAMmz%2Fgre-pcap.png?alt=media&amp;token=b4539a50-0f7c-4e02-8986-a455153f58a5" alt=""><figcaption><p>Capture du trafic avec Wireshark</p></figcaption></figure>

On voit que GRE ajoute 2 entêtes à chaque paquet:

* un en-tête GRE
* un entête IP
