Créer un conteneur Docker client OpenVPN

On crée un dossier pour le projet et on s'y rend :

mkdir openvpn-client && cd openvpn-client

On crée un fichier avec l'identifiant et le mot de passe de son service VPN :

nano auth-user-pass.txt
<Nom d'utilisateur>
<Mot de passe>

On crée un dossier configs afin de stocker différents fichiers de configuration OpenVPN (.ovpn) de son service VPN :

mkdir configs

Pour y copier les fichiers connectez vous à votre Raspberry par SFTP.

On crée un script shell qui s'exécutera à la connexion du service VPN :

nano up.sh
#!/bin/bash
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT

La première règle ajoute une opération de "masquage" sur les paquets sortant via l'interface VPN tun0, ce qui permet aux machines du réseau local d'accéder à Internet en utilisant l'adresse IP du conteneur comme si c'était leur propre adresse. Les deux autres règles gèrent le transfert de paquets entre l'interface VPN tun0 et l'interface réseau locale eth0, autorisant uniquement les paquets associés à des connexions déjà établies ou en réponse à des requêtes initiées par le réseau local à traverser dans le sens tun0 vers eth0 et vice versa.

On crée un script shell qui s'exécutera à la déconnexion de son service VPN :

nano down.sh
#!/bin/bash
iptables -D FORWARD -i eth0 -o tun0 -j ACCEPT
iptables -D FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -D POSTROUTING -o tun0 -j MASQUERADE

On supprime les règles crées lors de la connexion au service VPN.

On crée un script shell qui s'exécutera à l'exécution du conteneur :

nano entrypoint.sh
#!/bin/bash
while true; do
	CONFIG_FILE=$(find /configs -type f -name '*.ovpn' | shuf -n 1)
	openvpn --config "$CONFIG_FILE" --auth-user-pass "/auth-user-pass.txt" --resolv-retry 60 --script-security 2 --up "/up.sh" --down "/down.sh" --ping 10 --ping-exit 60
	sleep 10
done

On crée une boucle infinie dans laquelle on choisit un fichier de configuration OpenVPN (.ovpn) au hasard, on exécute OpenVPN, et si ce dernier s'interrompt brutalement, 10 secondes, après on choisit à nouveau un fichier de configuration OpenVPN (.ovpn) au hasard et on exécute à nouveau OpenVPN.

On crée le Dockerfile qui contient les instructions afin de créer une image de conteneur :

nano Dockerfile
FROM debian:latest

RUN apt-get update && apt-get install -y net-tools iptables openvpn curl iputils-ping

COPY up.sh /up.sh
RUN chmod +x /up.sh

COPY down.sh /down.sh
RUN chmod +x /down.sh

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

On consruit l'image :

docker build -t openvpn-client .

On lance un conteneur à partir de l'image créée :

docker run -d --name openvpn-client --network macvlan-network --ip <ADRESSE IP STATIQUE> --dns <SERVEUR DNS PRIMAIRE DU SERVICE VPN> --dns <SERVEUR DNS SECONDAIRE DU SERVICE VPN> --device=/dev/net/tun -v /etc/localtime:/etc/localtime:ro -v ~/openvpn-client/auth-user-pass.txt:/auth-user-pass.txt -v ~/openvpn-client/configs:/configs --cap-add=NET_ADMIN --cap-add=NET_RAW --sysctl net.ipv4.ip_forward=1 --sysctl net.ipv6.conf.all.disable_ipv6=1 --sysctl net.ipv6.conf.default.disable_ipv6=1 --sysctl net.ipv6.conf.lo.disable_ipv6=1 --restart unless-stopped openvpn-client

La commande présentée lance un conteneur Docker nommé openvpn-client qui exécute un client VPN OpenVPN en arrière-plan, assurant une connexion internet sécurisée. Elle spécifie notre réseau Docker, une adresse IP statique pour garantir qu'il conserve la même adresse IP sur le réseau, des serveurs DNS pour la confidentialité, et monte des volumes pour les configurations VPN et l'authentification. Le conteneur est également configuré pour utiliser le périphérique réseau virtuel tun, avec des permissions réseau étendues et des ajustements du noyau pour optimiser le trafic IP et désactiver IPv6. Cette configuration garantit que le conteneur redémarre automatiquement à moins d'être arrêté, fournissant une solution robuste et sécurisée pour se connecter à des réseaux via VPN.

On vérifie que notre conteneur soit en cours d'exécution :

docker ps

On affiche les journaux (ou logs) générés par le conteneur, particulièrement utile pour le débogage, permettant de comprendre le comportement du conteneur, de suivre son processus d'exécution ou d'identifier des problèmes et des erreurs potentielles :

docker logs openvpn-client

Commandes utiles

Arrêter le conteneur :

docker stop openvpn-client

Supprimer le conteneur :

docker rm openvpn-client

Redémarrer le conteneur :

docker restart openvpn-client

Dernière mise à jour