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.
2 Likes

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

Bonjour!
Ce tutoriel m’a été d’une grande aide et la passerelle (VPS Ionos) a très bien fonctionné sur deux serveurs installés sur des Raspberry Pi 4. Merci beaucoup!
Malheureusement, il y a quelques jours, j’ai mis à jour le Client OpenVPN sur YNH. Résultat plus d’accès. Désinstallation du client, réinstallation, création de nouveau fichier .ovpn, … rien. J’avais un autre Raspberry Pi 4 sous la main : installation d’un einstrance toute neuve et toute propre avec uniquement le client OpenVPN dessus : rien à faire.

The VPN client didn’t complete initiliasation … cannot open ‘’/var/log/openvpn-client.log’'’ for reading: No such file or directory

Qqun a eu le même problème? Une solution? Esse bien la mise à jour du paquet OpenVPN de YNH qui bloque tout?

Merci beaucoup.

Hello ! Il faut rajouter

status /var/log/openvpn-client.status
log-append /var/log/openvpn-client.log

à la fin du fichier de configuration client que tu vas importer dans YunoHost

Commentaire

Merci beaucoup @nounix

Cette solution me semble excellente et bon marché . Néanmoins, il y a des manques dans ce tuto, du moins des manques pour les newbies. Stupide exemple: j’ai du réinstaller plusieurs fois yunohost avant de comprendre pourquoi je perdais l’accès SSH (le firewall de Ionos)

Avant de passer à tout ceci, j’ai paramétré mes DNS. Mon nom de domaine étant sur OVH, j’ai utilisé l’api d’OVH (merci @jarod5001 ) .

  • Être connecté à OVH
  • yunohost > domaines : Sélectionner son domaine puis cliquer sur la section dns. Yunohost détecte automatiquement le registrar et fourni le lien pour créer des informations de connexion pour l’api et explique comment faire.

Après l’installation finale, j’ai quand même fameusement ramé sur ces réglages. L’idée étant que YunoHost et OVH reprennent l’IP publique du serveur (pas celle du VPN)

Finalement mon Yunohost fonctionne mais avec des erreurs que je dois encore comprendre.

Ce tuto mériterait d’être encore amélioré et repris dans la Doc

Ci-dessous, je reprends le tuto de @nounix tel quel en mentionnant !!! mes ajouts.


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:

!!!: Oui, par téléphone car ils veulent vérifier votre numéro

!!!: Dans le panneau d’utilisateur de Ionos,

  • N’installons pas d’adresse IPv6 [A vérifier]
  • Ouvrons le firewall pour les ports que nous allons utiliser (sinon nous n’aurons pas d’accès). Dans l’exemple ci-dessous, il faut ouvrir les ports 65100 (UDP pour le VPN) et 65022 (TCP pour le SSH)

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
  • !!!: Utilisez la commande chmod +x openvpn-install.sh pour lui donner les permissions d’exécution
  • ./openvpn-install.sh

Il suffit de se laisser guider par le script :

  • Entrer l’adresse ip publique du serveur !!! Le nouveau script le propose automatiquement
  • !!! Do you want to enable IPv6 support (NAT)? [y/n]: n
  • Configurer le serveur openvpn pour écouter un port > 65000, par exemple le port 65100
  • !!! What protocol do you want OpenVPN to use? : 1 UDP
  • !!! What DNS resolvers do you want to use with the VPN? : 3 CloudFlare
  • 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.
  • !!! Si nécessaire, relancer le script permet de créer des utilisateurs supplémentaires. ./openvpn-install.sh

: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.

!!! : sudo systemctl restart sshd

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)

!!! Comment comprendre ceci

Dans cette instruction, “ens192” ne représente pas une adresse IP, mais plutôt le nom de l’interface réseau principale de votre serveur. Chaque serveur a une ou plusieurs interfaces réseau, qui peuvent porter des noms comme ens192, eth0, ou encore wlan0 (selon le système d’exploitation et sa configuration). Ces noms identifient les interfaces réseau qui connectent le serveur à un réseau local ou à Internet.

Pour trouver le nom de votre interface réseau : Utilisez la commande suivante

ip addr

Cette commande affiche les interfaces réseau du VPS :

  1. Interface lo (Loopback) :
    • C’est l’interface interne du système, utilisée pour communiquer avec lui-même (adresse IP : 127.0.0.1).
  2. Interface ens192 :
    • C’est votre interface réseau principale, connectée à Internet.
    • L’adresse publique du VPS est xxx.xxx.xx.xxx/xx (IPv4). Cette interface a aussi une adresse IPv6 (chiffres de l’IPv6).
    • Le suffixe altname xxx indique un autre nom possible pour cette interface (il s’agit juste d’une alternative).

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

!!! La solution pour systemd a fonctionné pour moi

Solution pour systemd

Solution pour SystemV (obsolète)
Solution au démarrage du réseau
Solution avec crontab

: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)
  • !!! En mode newbie et, avec Filezilla, allons récupérer notre fichier .ovpn à la racine de notre VPS et, autre connexion Filezilla, mettons-le côté YunoHost

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.

2 Likes