rss logo

Créer un tunnel VPN avec OpenSSH entre Debian 12 et Arch Linux

Logo OpenSSH

Intro

Dans un de mes nombreux projets, j'avais besoin d'accéder à un réseau distant qui ne disposait que d'un serveur SSH. Je savais que les outils SSH permettaient de mettre en place un tunnel VPN, mais je n'avais jamais essayé. C'est finalement assez simple à mettre en œuvre et cela peut être utile dans de nombreux cas.

Dans cet article, je vais donc expliquer étape par étape comment configurer un tunnel VPN temporaire avec OpenSSH.

Schéma réseau

Schéma d’un tunnel VPN SSH entre un serveur Debian 12 (interface tun0) et un client Arch Linux (interface tun0), utilisant OpenSSH pour établir la connexion sécurisée.
Architecture d'un réseau VPN SSH

Debian (Destination)

  • Configuration IP:
    • eth0: 192.168.1.10/24
    • tun0: 10.110.0.100/32

Prérequis

Éditer la configuration de sshd

  • Éditez le fichier /etc/ssh/sshd_config et permettre le login root et la tunnelization:
PermitRootLogin yes
PermitTunnel yes
  • Redémarrez ensuite le service SSH afin d'appliquer les modifications :
root@host:~# systemctl restart sshd

Configurer le NAT

Nous avons besoin d'une règle de masquerade pour permettre au client d'accéder au réseau distant. Nous allons voir comment faire cela en utilisant iptables ou nftables.

  • Que vous utilisiez iptables ou nftables, vous devez activer l'IP forwarding (routage) :
root@host:~# echo 1 | tee /proc/sys/net/ipv4/ip_forward
  • Avec iptables :
root@host:~# iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -o eth0 -j MASQUERADE
  • Avec nftables :
root@host:~# nft add table ip NAT
root@host:~# nft add chain ip NAT my_masquerade '{ type nat hook postrouting priority 100; }'
root@host:~# nft add rule NAT my_masquerade ip daddr { 192.168.1.0/24 } oifname eth0 counter masquerade

Maintenant que nous avons terminé la pré-configuration de notre serveur Debian, nous devons démarrer le tunnel SSH depuis le client.

Source : Archlinux

  • Configuration IP:
    • eth0: 192.168.2.10/24
    • tun0: 10.110.0.200/32

Commandes

  • -w local_tun[:remote_tun] : Demande le transfert des périphériques tun(4) spécifiés entre le client (local_tun) et le serveur (remote_tun).
  • -N : Ne pas exécuter de commande distante
  • -f : Demande à SSH de passer en arrière-plan juste avant l'exécution de la commande
root@host:~# ssh -Nf -w 0:0 -p 22 root@1.1.1.1
  • Définir l'adresse IP de l'interface tun0 :
root@host:~# ip addr add 10.110.0.200/32 peer 10.110.0.100 dev tun0
  • Activez l'interface :
root@host:~# ip link set tun0 up
  • Ajoutez la route vers le réseau distant :
root@host:~# ip route add 192.168.1.0/24 via 10.110.0.100

Établissement du tunnel (Debian)

Avec la commande précédente (ssh -Nf -w 0:0) exécutée depuis le client, le périphérique virtuel tun0 devrait apparaître sur le serveur Debian. La dernière étape consiste simplement à l'activer et à le configurer côté Debian.

  • Définir l'adresse de tun0 :
root@host:~# ip addr add 10.110.0.100/32 peer 10.110.0.200 dev tun0
  • Configurer l'adresse IP de l'interface tun0 :
root@host:~# ip link set tun0 up

Et voilà ! Le réseau 192.168.1.0/24 devrait maintenant être accessible depuis le client.

Références