diff --git a/README.md b/README.md index 63b5f568decd86686c2c8f04b9f39c7406318985..242ac326d47b56d52d96683bc78815af246960c4 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,357 @@ cette commande est correcte en l’exécutant sur la topologie. # **2 - Routage et adressage** -Voici le résultat du playbook, la 77a0ae0163commande ping est effectivement exécuté et le paquet est bien envoyé sur le bon chemin (code sur le git) +pour lancer cette partie, il faut utiliser la commande `ansible-playbook playbook.yaml` + +On cherche à recréer une typologie comme celle décrite sur l’image  +Nous allons commencer par configurer nos hotes (H1 et H2) + +Nos allons créer un template jinja2 pour ce faire (le même template sera utilisé pour les 4 devices) + +la première ligne de notre template sera + +```bash +auto eth0 +``` + +on indique ici que l’interface redémarre automatiquement au démarrage de l’appareil + +on va maintenant configurer cette même interface + +on commence par indiquer que l’adressage est statique + +```bash +iface eth0 inet static +``` + +puis on lui indique son adresse et son masque de sous réseau (ici pour H1) + +```bash + address 1.0.0.3 + netmask 255.255.255.0 +``` + +on lui indique ensuite comment rejoindre l’autre sous réseau + +```bash + post-up ip route add default via 1.0.0.1 +``` + +on lui indique ici que tout ses paquets devront passer par 1.0.0.1 qui est l’adresse du routeur qui lui est directement lié + +Maintenant notre config au complet + +```bash +auto eth0 +iface eth0 inet static + address 1.0.0.3 + netmask 255.255.255.0 + post-up ip route add default via 1.0.0.1 +``` + +nous voulons pouvoir utiliser le même template pour nos différents appareils nous allons donc utiliser des variables + +```bash +auto {{ifname}} +iface {{ifname}} inet static + address {{ip}} + netmask {{netmask}} + post-up ip route add default via {{gateway}} +``` + +la config de H2 est identique mais avec 3.0.0.3 comme ip et 3.0.0.2 comme gateway + +Passons maintenant à la config de nos routeurs (ici R1) + +nos commençons avec une configuration similaire à celle de H1 + +```bash +auto eth0 +iface eth0 inet static + address 2.0.0.1 + netmask 255.255.255.0 + post-up ip route add 3.0.0.0/24 via 2.0.0.2 +``` + +ici on indique que pour accéder au sous réseau 3.0.0.0 il faut passer par l’ip 2.0.0.2, le reste de la config n’est pas très différent + +il nous faut cependant configurer l’autre interface également + +```bash +auto eth1 +iface eth1 inet static + address 1.0.0.1 + netmask 255.255.255.0 +``` + +configuration identique ici aussi mais nous n’avons pas besoin du post-up + +maintenant la configuration entière + +```bash +auto eth1 +iface eth1 inet static + address 1.0.0.1 + netmask 255.255.255.0 + +auto eth0 +iface eth0 inet static + address 2.0.0.1 + netmask 255.255.255.0 + post-up ip route add 3.0.0.0/24 via 2.0.0.2 + +``` + +comme précédemment il nous faut des variables + +```bash +auto {{ifname}} +iface {{ifname}} inet static + address {{ip}} + netmask {{netmask}} + +auto {{ifname2}} +iface {{ifname2}} inet static + address {{ip2}} + netmask {{netmask}} + post-up ip route add 3.0.0.0/24 via {{gateway}} +``` + +J’avais indiqué que notre config serait utilisée pour tout les appareils nous allons donc ajouter des conditions + +```bash +auto {{ifname}} +iface {{ifname}} inet static + address {{ip}} + netmask {{netmask}} + +{% if type == "host" %} + post-up ip route add default via {{gateway}} +{% endif %} +{% if type == "router" %} + +auto {{ifname2}} +iface {{ifname2}} inet static + address {{ip2}} + netmask {{netmask}} + {% if inventory_hostname == "R1" %} + post-up ip route add 3.0.0.0/24 nexthop via {{gateway}} + {% else %} + post-up ip route add 1.0.0.0/24 nexthop via {{gateway}} + {% endif %} +{% endif %} +``` + +Le premier post-up est nécessaire uniquement pour les hosts tandis que la 2eme partie de la config est destinée au routers uniquement + +la configuration est sauvegardée dans `/etc/network/interfaces.d/ansible.conf` pour être persistante (il serait mieux de la stocker dans deux fichiers différents nommés eth0 et eth1) + +Voici le résultat du playbook, la commande ping est effectivement exécutée + + + On peut voir grâce à la commande traceroute que le paquet utilise le bon chemin - \ No newline at end of file + + +# 3 - **Tunnel wireguard et serveur web** + +On commence par installer wireguard sur nos 2 hosts et nginx sur H2 + +j’ai choisi de faire cette action à la main + +on utilise l’interface de management pour accéder à internet (ce qui n’est généralement pas re commandé mais c’était la solution la plus simple) + +```bash +dhclient -v mgmt0 +apt instal wiregurad-tools +apt install nginx +delete default route +``` + +Ici l’installation sur H2, sur H1 on supprime seulement la 3eme ligne + +la dernière ligne nous sert à supprimer cet accès après son utilisation + +il faudra ensuite à nouveau exécuter la commande + +```bash + post-up ip route add default via {{gateway}} +``` + +pour revenir dans notre état précédent + +passons maintenant à la configuration de notre serveur nginx + +nous allons conserver la configuration par défaut + +```bash +server{ + listen 80 default_server; + listen [::]:80 default_server; + + root /var/www/html; + + index index.html index.htm index.nginx-debian.html; + + server_name _; + + location / { + try_files $uri $uri/ =404; + } +} +``` + +Nous allons simplement ajouter deux lignes pour empêcher toutes les connexions sauf depuis 10.0.0.0/24 + +```bash +allow {{allowed_ips}}; +deny all; +``` + +notre configuration finale sera donc + +```bash +server{ + listen 80 default_server; + listen [::]:80 default_server; + + allow {{allowed_ips}}; + deny all; + + root /var/www/html; + + index index.html index.htm index.nginx-debian.html; + + server_name _; + + location / { + try_files $uri $uri/ =404; + } +} +``` + +elle est aussi stockée dans un fichier template jinja2 + +on se contente ensuite de la copier dans le bon dossier `/etc/nginx/sites-available/default` + +on vient ensuite créer un page web simple grâce à un template jinja2 + +```html +<!DOCTYPE html> +<html> + <head> + <title>{{title}}</title> + </head> + <body> + <h1>{{content}}</h1> + </body> +</html> +``` + +on peut changer la valeur de title et content depuis le playbook + +maintenant passons à la configuration de wireguard + +le plus simple est de le configurer en ligne de commande puis d’utiliser la commande `wg showconf wg0` pour récupérer une config prête à être utilisée + +on commence par créer un interface pour wireguard + +```bash +ip link add wg0 type wireguard +ip addr add 10.0.0.1/24 dev wg0 +ip link set up dev wg0 +``` + +il nous faut ensuite une clef privée et un clef publique pour communiquer + +```bash +wg genkey | tee private.key | wg pubkey > public.key +``` + +et on configure wireguard pour l’utiliser + +```bash +wg seet private-key private.key +``` + +maintenant il faut ajouter notre client + +```bash +wg set wg0 peer <client pub key> allowed-ips 10.0.0.2/32 endpoint 3.0.0.3:<port> +``` + +on récupère la config et on l’utilise dans un template jinja2 + +```bash +[Interface] +{% if inventory_hostname == "H1" %} +Address = {{h1_ip}} +ListenPort = {{h1_port}} +PrivateKey = {{all.h1_private_key}} +{% else %} +Address = {{h2_ip}} +ListenPort = {{h2_port}} +PrivateKey = {{all.h2_private_key}} +{% endif %} + +[Peer] +{% if inventory_hostname == "H1" %} +PublicKey = {{h2_public_key}} +AllowedIPs = {{h1_AllowedIPs}} +Endpoint = {{h1_endpoint}}:{{h2_port}} +{% else %} +PublicKey = {{h1_public_key}} +AllowedIPs = {{h2_AllowedIPs}} +Endpoint = {{h2_endpoint}}:{{h1_port}} +{% endif %} +``` + +ici aussi la config est la même pour H1 et H2 + +pour ne pas stocker la clef privée dans la playbook mais la stocker en sécurité elle est dans un vault ansible crée à partir de la commande + +```bash +ansible-vault create vault.yml +``` + +il faut entrer un mot de passe à la création + +que l’on peut ensuite modifier grâce à la commande + +```bash +ansible-vault edit vault.yml +``` + +pour le modifier ou l’afficher il est nécessaire d’indiquer le mot de passe + +on ajoute donc nos 2 clef privé comme variable et on peut lancer notre playbook + +il faudra juste créer un autre fichier qui contient le mot de passe + +je l’ai appelé vaultpassword + +on le spécifie lorsque lance le playbook + +```bash +ansible-playbook --vault-password-file vaultpassword playbook_2.yaml +``` + +Résultat du playbook avec notre curl sur 10.0.0.2 pour vérifier que wireguard est bien configuré + + + +preuve que l’on peut accéder au serveur uniquement depuis 10.0.0.0/24 + + + +le serveur nous indique bien que nous n’avons pas le droit d’y accéder avec une erreur 403 + +tandis que sur 10.0.0.2 nous avons bien notre page + + + + \ No newline at end of file diff --git a/img/Untitled 10.png b/img/Untitled 10.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a8f9bab88bde4a2b0ef65bc7c734a36f1993a3 Binary files /dev/null and b/img/Untitled 10.png differ diff --git a/img/Untitled 4.png b/img/Untitled 4.png index 878a764ae4f9b694114cb4af214bedae587f5f31..d054531dacc0de103f2d31a03a176f9762e3acdf 100644 Binary files a/img/Untitled 4.png and b/img/Untitled 4.png differ diff --git a/img/Untitled 5.png b/img/Untitled 5.png index e41e3d1d4c8dd12f3af1e6a8f5f2ae687f32b468..878a764ae4f9b694114cb4af214bedae587f5f31 100644 Binary files a/img/Untitled 5.png and b/img/Untitled 5.png differ diff --git a/img/Untitled 6.png b/img/Untitled 6.png new file mode 100644 index 0000000000000000000000000000000000000000..e41e3d1d4c8dd12f3af1e6a8f5f2ae687f32b468 Binary files /dev/null and b/img/Untitled 6.png differ diff --git a/img/Untitled 7.png b/img/Untitled 7.png new file mode 100644 index 0000000000000000000000000000000000000000..402dc6725f3d3e0f56f004dbb951f08ca2c079be Binary files /dev/null and b/img/Untitled 7.png differ diff --git a/img/Untitled 8.png b/img/Untitled 8.png new file mode 100644 index 0000000000000000000000000000000000000000..2a40955e4b8f6d152e088a71e3e939eb71ebe2ce Binary files /dev/null and b/img/Untitled 8.png differ diff --git a/img/Untitled 9.png b/img/Untitled 9.png new file mode 100644 index 0000000000000000000000000000000000000000..12b908f390d6c88203f752cc0bc123c455ba2837 Binary files /dev/null and b/img/Untitled 9.png differ