Salut à tous, dans le dernier TP on s’est penché sur la définition de plusieurs conteneur dans un Stack pour mettre en place un client Guacamole. Aujourd’hui on va regarder comment monter un serveur openvpn au travers de docker et superviser celui-là avec Splunk en faisant communiquer plusieurs stacks entres-elles, et comme d’habitude dans Portainer.
Rappel des articles de la série « Docker et Portainer » :
- Docker et Portainer part 1 – Les conteneurs pour les nuls ;
- Docker et Portainer part 2 – Stack vsftpd mono-image ;
- Docker et Portainer part 3 – Docker Guacamole via une Stack multi-images ;
- Docker et Portainer part 4 – OpenVPN, Network et Splunk ;
- Docker et Portainer part 5 – Customiser un conteneur PHP-FPM ;
- Docker et Portainer part 6 – NextCloud avec Docker, Déployer un « Cloud » personnel ;
- Docker et Portainer part 7 – Mettre à jour Portainer ;
- Docker et Portainer part 8 – Déployer un jitsi meet avec docker ;
- Docker et Portainer part 9 – Monitoring des performances docker avec Splunk.
- Docker et Portainer part 10 – The Hive & Cortex et installation Docker….
OpenVPN ?
OpenVPN est une technologie opensource de VPN. C’est pas forcément la plus répandue (plutôt du IPsec avec L2TP or IKEv2) mais il lui reste quelques avantages par rapport à du L2TP/IPsec :
- Elle peut fonctionner sur un port HTTPS en parallèle d’un site web sur le même serveur.
- Au dernière nouvelles, le protocole n’est pas cassé par la NSA.
- C’est une techno open-source.
Aujourd’hui la tendance est plutôt à WireGuard, mais OpenVPN reste un bon standard en production. Je passe sur pourquoi utiliser et mettre en place un VPN, il y a tout vos youtubeurs préférés qui ont du vous sensibiliser là-dessus normalement…^^
Mon objectif est assez simple, avoir un VPN pour mon smartphone et manière à pouvoir utiliser les wifi-public sans trop d’inquiétude en déplacement.
Docker et OpenVPN
Tout comme pour Guacamole et VSFTPD, la question d’utiliser une image toute prête ou d’en reconstruire une se pose. Pour ce TP, histoire de gagner du temps, j’ai utilisé celle-ci : kylemanna/openvpn, qui est bien documentée et construit une PKI proprement (et simplement) pour l’authentification. Donc c’est partie.
On doit d’abord créer un volume et placer nos configuration dedans. Vous noterez ci-dessous que je configure mon VPN en TCP et non en UDP comme c’est souvent le cas en VPN :
# docker volume create --name vpn_data # docker run -v vpn_data:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_genconfig -u tcp://vpn.geekeries.org # docker run -v vpn_data:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_initpki
Et donc, à partir de la on peut déployer la Stack suivante :
version: '2'
services:
geekeries_nginx:
container_name: vpn
hostname: vpn
image: kylemanna/openvpn
restart: unless-stopped
volumes:
- vpn_data:/etc/openvpn
ports:
- 8443:1194/tcp
cap_add:
- NET_ADMIN
Dès que votre service est running est votre VPN est accessible sur le port 8443 qui est redirigé sur le 1194 (dès que votre conf DNS sera propagé) si que votre firewall laisse entrer ce trafic. Sauf qu’aucun utilisateur n’est configuré. Il faut donc le créer et sortir de votre conteneur le fichier de configuration pour votre client :
# docker run -v vpn_data:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full Pixel3XL_Etienne # docker run -v vpn_data:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient Pixel3XL_Etienne > Pixel3XL_Etienne.ovpn
Sur votre téléphone, il vous faudra installer l’application OpenVPN Connect – Fast & Safe SSL VPN Client, le protocole, OpenVPN n’étant pas supporté par défaut dans Android. Ensuite on ouvre l’appli et il faut importer le fichier .ovpn
que vous avez généré sur votre serveur, indiquer le mot de passe, et c’est plier. En image ça donne :
Puis :
et enfin :
Connectez-vous et c’est bon :
Et je vous laisse vérifier avec un coup d’œil sur icanhazip.com que votre IP publique est bien celle de votre serveur et plus celle de votre opérateur.
Docker, OpenVPN et Splunk
Bon c’est beau tout ça mais on aimerai bien le superviser notre VPN, non ? Et avec Splunk si possible. Il y a deux scenarios possible :
- Votre Splunk est un serveur « externe » à docker et vous pouvez passer directement au paragraphe log plus bas.
- Votre Splunk est aussi une image Docker dans votre portainer. Et il faut configurer le réseau.
Moi, je suis dans le second cas, donc c’est parti…
Network et docker
Dans le cas où votre Splunk est dans docker, il faut savoir que par défaut, les conteneurs sont placés dans un sous-réseau privée « interne » à docker de type bridge qui est différent pour chaque Stack. Voici, par exemple, celui qui a été créé quand on a lancé notre stack VPN :
Alors au sein d’une même stack on peut définir des alias DNS entre les conteneurs pour leur permettre de se parler sans avoir la connaissance de l’IP, via l’option links, exemple :
web:
[...]
links:
- "php-fpm:php"
- "db:database"
php-fpm:
image: php-fpm
db:
image: mariadb
Ce système fonctionne très bien au sein d’une seule stack, mais lorsqu’on veut connecter plusieurs stacks entre elles, ça devient un peu galère. Et on a pas envi d’intégrer une instance Splunk Free dans chacune de nos Stacks…
Comme je l’ai dit, celles ci sont créées dans des réseaux « interne docker » différents qui ne peuvent pas communiquer entre eux. La première option pour contourner ça consiste à utiliser l’option external_link en complément de la spécification du réseau commun avec l’autre machine dans votre Stack :
version: '2'
services:
vpn:
image: kylemanna/openvpn
external_links:
- splunk
networks:
- bridge
- backend_network
networks:
backend_network
external: true
Et vous pouvez définir votre network comme ça dans Portainer.
Et du coup vos conteneurs se retrouvent avec 2 IP sur les 2 réseaux différents : bridge pour leur accès au net et backend_network pour communiquer entre elles.L’autre option consiste à remplacer le réseau par défaut (bridge), par un autre, du même type, et mettre tout vos conteneurs dans celui ci, et dans mon cas j’en ai profité pour appliquer un adressage IP statique dans ce sous-réseau pour simplifier la supervision. Et donc dans vos stacks définir ainsi la partie réseau :
networks:
Proxy_net:
ipv4_address: 172.18.1.4
networks:
Proxy_net:
external:
name: Proxy_net
Et il faudra évidement faire la même chose pour votre conteneur Splunk.
Logs
Maintenant que nos conteneurs sont configurés pour être dans le même sous-réseau et qu’il peuvent communiquer entre eux. On peut utiliser le module logging de docker pour alimenter directement notre splunk.
La bonne nouvelle c’est que docker embarque un format « Splunk natif » de log prévu pour les HTTP_collector de Splunk. Pour ça rendez vous dans paramètres, entrée de données puis Ajouter un nouveau Collecteur d’événements HTTP. Remplissez les informations comme vous le souhaitez pour votre Splunk.
Pour obtenir un jeton dédié.
A partir de là votre serveur Splunk écoute par défaut sur le port 8088, et indexera les sources de logs qui s’identifient avec le token généré.
Ensuite rendez vous dans votre Stack et configurez-là ainsi pour le logging.
logging:
driver: splunk
options:
splunk-token: "21812b4f-f96d-4414-8706-be2ac02998b8"
splunk-url: "https://172.18.3.1:8088"
splunk-insecureskipverify: "true"
splunk-verify-connection: "false"
tag: "{{.ImageName}}/{{.Name}}/{{.ID}}"
labels: "VPN"
networks:
Proxy_net:
ipv4_address: 172.18.6.1
networks:
Proxy_net:
external:
name: Proxy_net
Redémarrez votre conteneur et (modulo d’éventuels problèmes de firewalls) vous devriez avoir des logs qui remontent dans votre Splunk :
kylemanna/openvpn/vpn/655bf8588a9f Fri Apr 24 11:23:34 2020 123.145.156.178:1337 TLS: Initial packet from [AF_INET]123.145.156.178:1337, sid=25f66787 6d6c659a
Pour terminer, concernant l’extraction des logs de VPN dans Splunk, il n’existe pas de TA pour ça aujourd’hui. Il y a bien la TA-pfsense sauf que les logs sont modifiés pour commencer par « openvpn: » pour la suite pfsense, pas top.
Du coup, j’ai proposé un TA chez splunk pour extraire ces logs, elle est toujours en « waiting approval », on verra si elle est conservées comme mes 3 précédentes.
Conclusion
Voilà, c’est pas mal pour aujourd’hui avec Docker, OpenVPN et Splunk, non? En ces temps de confinement ou les VPN sont devenu l’outil de base pour le boulot, j’espère que ça vous donnera quelques idées pour que tout le monde puisse bosser de chez soit… on commence se rapprocher de la fin de ces TP docker, mais la prochaine fois, je vous expliquerai comment personnalisé un image docker pour l’adapter à vos besoins.
@+
salut,
j’ai installé openvpn depuis un certain temps. il se trouve dans tant que image-docker sur OMV/Docker-Portainer.
OMV est en 192.168.1.240 sur mon LAN et j’y ai quelques dossier partagés.
l’idée d’installer in tel vpn est de pouvoir accéder à mes dossiers LAN depuis « l’extérieur » en toute quiétude en me connectant à ce vpn.
or le réseau d’openvpn est sur un bridge (172.17.0.0/16), je pense que je ne t’apprends rien c’est le même que celui que tu cites plus haut, et je n’arrive pas à voir comment faire un lien vers le LAN. Là ç’est un peu au dessus de mes compétences…
difficile de trouver un tuto tout fait alors j’essaye de trouver de l’aide…
merci d’avance,
ph
Franchement, je n’ai pas le niveau pour
Hello ph,
Effectivement la partie réseau de Docker peut être un peu prise de tête parfois. De ce que je comprend, au niveau de ta serveur OMV (OpenMediaVault?), et lors du déploiement de ton conteneur tu doit spécifier les ports du serveur hôte à forwarder vers le conteneur. Dans les stacks que j’utilise c’est la ligne suivante qui redirige les connexions TCP/8843 sur l’hote vers TCP/1194 sur le conteneur :
ports:
- 8443:1194/tcp
Si tu instancie directement des conteneurs sans passer par des stacks, il faut utiliser l’option
-p 8443:1194
dans la ligne de commande docker pour faire cette redirection.Pour contrôler, un coup de
netstat -tunlp
sur le serveur devrait te montrera que le port est bien ouvert et la configuration du firewall (Iptables -L
) que la redirection est en place et que le port est ouvert).Note enfin que j’utilise ici des networks spécifiques et pas le bridge par défaut de docker (cf. § Network et docker de ce billet).
Dernier point, vue ta description tu as l’air de travailler derrière une box ADSL dans un LAN, n’oublie pas les redirections du NAT de la box vers ton serveur interne OVM et le port à rediriger vers ton conteneur docker du coup.
J’espère que ça t’aidera ! @+
Bonjour,
franchement bravo!
moi qui ne jurait que par proxmox/lxc, vous (tu) m’avez (m’a) donné envie d’utiliser docker!
Les explications sur les volumes, les stacks sont claires et on voit bien l’utilité. J’aime bien l’utilisation de portainer aussi.
Je me posais également des questions sur la gestion des logs, là j’ai de quoi maintenant.
J’ai pu très facilement mettre en place docker+portainer+bitwarden_rs dans une vm proxmox du coup!
Bref que du bonheur monsieur…
Salut Dominique,
« Tu » c’est bon, on est entre gens bien ici…^^
Content d’avoir pu t’aider, merci pour ton commentaire ça fait toujours plaisir d’avoir un retour.
J’utilise bitwarden mais je connaissais pas bitwarden_rs du coup, merci pour l’astuce. J’irai jeter un œil.
@+