Utiliser un VPS comme passerelle avec openvpn | The easy way

Bonjour, j’ai cherché à créer un VPN avec un VPS de la façon la plus simple et la plus accessible possible et je vous présente une solution que j’utilise et qui fonctionne pour moi. J’espère qu’elle vous plaira.

Sorry for English speakers, but my language level does not allow me to transcribe correctly…

Introduction

Aujourd’hui avec la fibre, l’auto-hébergement est facilité, encore faut-il que votre FAI vous le permette et que vous soyez suffisamment motivé pour configurer votre accès convenablement.

Une solution simple et efficace est de connecter votre serveur à travers un VPN, il n’aura besoin que d’un simple accès internet et vous n’aurez absolument rien à configurer sur votre réseau domestique. Un avantage supplémentaire est que votre serveur peut-être facilement déménagé et de manière transparente pour les utilisateurs.

Pour cela vous pouvez souscrire à une offre VPN auprès de l’un des membres de la ffdn, vous aurez la plupart du temps une adhésion à l’année à laquelle vient s’ajouter un abonnement mensuel pour le service VPN, ce qui reviendra dans le meilleur des cas à environ 40€ l’année.

Les petits budgets peuvent eux se tourner vers la location d’un VPS entrée de gamme afin d’obtenir une adresse ip publique et l’utiliser comme passerelle VPN. A ma connaissance, ionos propose l’offre la plus agressive du marché, puisqu’elle démarre avec un VPS à 1.20€TTC/mois avec un engagement d’un an, ce qui fait 14.40€ pour l’année…

Le tutoriel suivant est basé sur cette offre.

Prérequis

Avoir un VPS accessible en ssh avec Debian 11, sans blocage de ports et sans firewall (voir menu Réseau / Stratégies du pare-feu dans l’interface web)

:warning: Pour débloquer le port 25 vous devrez contacter le service client :telephone_receiver:

1. Configuration du serveur

Pour installer openvpn, nous allons utiliser le script suivant qui va automatiser l’installation et la configuration du serveur et du client VPN : GitHub - angristan/openvpn-install: Set up your own OpenVPN server on Debian, Ubuntu, Fedora, CentOS or Arch Linux.

1.1 Récupérer le script et lancer l’installation

  • curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
  • ./openvpn-install.sh

Il suffit de se laisser guider par le script :

  • Entrer l’adresse ip publique du serveur
  • Configurer le serveur openvpn pour écouter un port > 65000, par exemple le port 65100
  • Créer un client sans mot de passe, il sera authentifié via une clé de chiffrement ce qui nous facilitera la connexion automatique au démarrage du système.

:white_check_mark: Vous avez maintenant un fichier .ovpn qu’il faudra par la suite copier sur le client, nous verrons cela un peu plus bas.

:information_source: Le premier client créé aura l’adresse ip 10.8.0.2 d’attribuée

1.2 Configurer ssh

Le service ssh va lui aussi écouter un port > 65000, nous choisirons le port 65022 pour qu’on puisse se connecter à notre VPS en cas de besoins.

  • nano /etc/ssh/sshd_config
Port 65022

:white_check_mark: Après avoir redémarré le service ssh, pensez à essayer de vous connecter avec une nouvelle session avant de vous déconnecter.

1.3 Rediriger tous les ports vers le client VPN

Un numéro de port est codé sur 16 bits, ce qui fait qu’il existe un maximum de 2^16, soit 65 536 ports distincts par machine. Ces ports sont classés en 3 catégories en fonction de leur numéro:

  • les numéros de port de 0 à 1 023 correspondent aux ports “bien-connus” (well-known ports), utilisés pour les services réseaux les plus courants,
  • les numéros de ports de 1 024 à 49 151 correspondent aux ports enregistrés (registered ports), assignés par l’IANA ,
  • les numéros de ports de 49 152 à 65 535 correspondent aux ports dynamiques, utilisables pour tout type de requêtes TCP ou UDP autres que celle citées précédemment.

Plus d’informations

:warning: Pensez à remplacer ens192 par votre interface réseau principale (ip addr)

On redirige tous les ports jusqu’au 65000 vers le client VPN, une règle pour le protocole tcp et une autre pour le protocle udp :

  • iptables -t nat -A PREROUTING -i ens192 -p tcp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
  • iptables -t nat -A PREROUTING -i ens192 -p udp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2

On redirige le protocole icmp , ce n’est plus le VPS qui répondra au ping mais le client VPN.

  • iptables -t nat -A PREROUTING -i ens192 -p icmp -j DNAT --to 10.8.0.2

On autorise l’ip forwarding

  • echo 1 > /proc/sys/net/ipv4/ip_forward

1.4 Rendre persistantes les règles iptables

Solution pour systemd
  • nano /root/iptables.sh
#!/bin/sh
iptables -t nat -A PREROUTING -i ens192 -p tcp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
iptables -t nat -A PREROUTING -i ens192 -p udp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
iptables -t nat -A PREROUTING -i ens192 -p icmp -j DNAT --to 10.8.0.2
  • chmod +x /root/iptables.sh
  • nano /etc/systemd/system/iptables.service
[Unit]
Description=Setup firewall
After=network.target local-fs.target

[Service]
RemainAfterExit=true
ExecStart=/root/iptables.sh

[Install]
WantedBy=multi-user.target
  • systemctl enable iptables.service
Solution pour SystemV (obsolète)
  • nano /etc/init.d/iptables.sh
#!/bin/sh
iptables -t nat -A PREROUTING -i ens192 -p tcp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
iptbles -t nat -A PREROUTING -i ens192 -p udp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
iptables -t nat -A PREROUTING -i ens192 -p icmp -j DNAT --to 10.8.0.2
  • chmod +x /etc/init.d/iptables.sh
  • update-rc.d iptables.sh defaults
Solution au démarrage du réseau

On sauvegarde les règles actuelles

  • iptables-save > /etc/iptables.rules

Pour les restaurer au démarrage du réseau, on ajoute sous l’interface réseau principale (iface ens192) : pre-up iptables-restore < /etc/iptables.rules

  • nano /etc/network/interfaces

Ce qui donne :

# The primary network interface
allow-hotplug ens192
iface ens192 inet dhcp
        pre-up iptables-restore < /etc/iptables.rules

Solution avec crontab
  • nano /root/iptables.sh
#!/bin/sh
iptables -t nat -A PREROUTING -i ens192 -p tcp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
iptbles -t nat -A PREROUTING -i ens192 -p udp -m multiport --dports 1:65000 -j DNAT --to 10.8.0.2
iptables -t nat -A PREROUTING -i ens192 -p icmp -j DNAT --to 10.8.0.2
  • chmod +x /root/iptables.sh
  • crontab -e

Ajouter à la fin puis quitter et enregistrer avec ctrl + x :

@reboot /root/iptables.sh

:white_check_mark: On peut vérifier que nos règles sont bien en place après avoir redémarré, avec la commande : iptables -t nat -L

2. Configuration du client

2.1 On installe openvpn

  • apt install openvpn

  • On copie le fichier .ovpn (ou son contenu) précédemment obtenu coté serveur dans le répertoire openvpn (par exemple /etc/openvpn/client.ovpn)

On se connecte au serveur VPN

  • openvpn --config /etc/openvpn/client.ovpn &

:white_check_mark: Si tout se passe bien, vous perdez l’accès ssh et il faut maintenant vous connecter au client en utilisant l’adresse ip du VPS.

2.2 On configure la connexion au VPN lors du démarrage du système

  • mv /etc/openvpn/client.ovpn /etc/openvpn/client.conf
  • nano /etc/default/openvpn

Ajouter la ligne suivante :

AUTOSTART="client"

:white_check_mark: C’est terminé, tout le trafic est maintenant redirigé à travers le tunnel VPN et (presque) toutes les requêtes adressées au VPS sont envoyées au client.

Conclusion

  • Dans cet exemple on considère qu’on a un seul client mais il est tout à fait possible d’en créer plusieurs et de choisir les ports à rediriger.
  • Ce tuto est (très) probablement à améliorer, toutes vos remarques sont les bienvenues, je compléterais au fur et à mesure.
1 Like

Merci. Quelle est la plus-value par rapport à un vpn commercial ?

Pour les petits budgets : là ou un vpn commercial est rarement en dessous de 5€, les offres VPS démarrent à 1,20€ TTC/mois (ionos)

1 Like

Bonjour,

merci pour ce tuto, j’ai essayé de le mettre en place mais je bloque lorsque je veux connecter mon serveur maison à openvpn avec le fichier client. Il semble qu’il y est un problème avec les DNS, lors de la configuration d’openvpn avec le script sur le serveur ionos j’ai laissé les options de base et ai fais le choix “11” pour la configuration DNS, qui est adguard de mémoire, tu as fais quel choix toi stp ?

Merci

Bonjour,

J’avais choisi les dns de FDN.
Mais il me semble que la configuration dns n’entre pas en jeu lors la connexion du client au serveur… quel est le problème que tu rencontre ?

Merci de ton retour rapide :slight_smile:

Lorsque je lance la commande pour connecter le client vpn voici la 1ere ligne qui apparaît :

Unrecognized option or missing or extra parameter(s) in /etc/openvpn/client.ovpn:19: block-outside-dns (2.5.1)

Et je ne suis pas déconnecté en ssh comme cela devrait se produire.

Une autre question pour être sûr (même si de ce que je comprends ça n’influe pas sur la connexion vpn) lors de la redirection des ports, tu utilises l’adresse IP 10.8.0.2, je dois bien mettre mon adresse IP personnelle de chez moi ?

Tu peux commenter la ligne qui pause problème puisque c’est une directive qui concerne windows :

# setenv opt block-outside-dns # Prevent Windows 10 DNS leak

Pour voir l’évolution, mais j’ai peur que ce soit un problème qui en cache un autre…

Une autre question pour être sûr (même si de ce que je comprends ça n’influe pas sur la connexion vpn) lors de la redirection des ports, tu utilises l’adresse IP 10.8.0.2, je dois bien mettre mon adresse IP personnelle de chez moi ?

Il faut utiliser l’adresse ip du client vpn. Normalement tu doit toi aussi utiliser l’adresse 10.8.0.2 puisque c’est l’adresse attribuée par défaut au premier client. Une fois connecté, tu peux vérifier l’adresse ip_vpn de ton client (depuis le serveur) : cat /var/log/openvpn/status.log

Bonjour,

Après une nuit de sommeil on y voit plus clair, le problème venait du fait que je n’avais pas ouvert le port 65100 sur le serveur Ionos… Maintenant tout marche :smiley:

Encore merci pour ton tuto et ton aide :+1:

1 Like