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)
Pour débloquer le port 25 vous devrez contacter le service client
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.
Vous avez maintenant un fichier .ovpn qu’il faudra par la suite copier sur le client, nous verrons cela un peu plus bas.
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
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.
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
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 &
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"
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.