J'ai la configuration suivante:
- Un hôte CentOS exécutant le service Docker
- Un réseau de pont Docker défini par l'utilisateur
- 2 conteneurs Docker connectés à ce réseau de ponts défini par l'utilisateur
- Une installation OpenVPN (en cours d'exécution sur l'hôte. Peut également s'exécuter dans un conteneur Docker)
- Certains clients connectés à OpenVPN
Comment puis-je autoriser les conteneurs Docker du réseau Docker Bridge à communiquer avec les clients OpenVPN sur le réseau Tun0?
Je voudrais pouvoir avoir une communication basée sur TCP entre Docker1 (10.10.0.3) et les clients connectés au VPN (gamme 172.19.0.x) de manière transparente.
Que dois-je configurer du côté docker (réseau / iptables / ...) et sur l'hôte (iptables?)
tap
, écroutun
, je travaille dessus depuis plus de 12 heures sans succès jusqu'à présent.Réponses:
Le contexte
J'utilise le très bon conteneur Docker de Kyle Manna ( https://github.com/kylemanna/docker-openvpn ). J'utilise la documentation dite "paranoïaque" pour configurer mon serveur OpenVPN, mais à mon avis, cela devrait être la méthode standard et non la méthode paranoïaque.
Configuration
Afin de permettre une connexion bidirectionnelle entre les conteneurs Docker sélectionnés et les clients VPN, vous devez créer un réseau Docker sur lequel vous allez attacher un conteneur auquel les clients VPN devraient pouvoir accéder. Le serveur VPN va être l'un de ces conteneurs.
Le serveur VPN doit avoir le
client-to-client
,topology subnet
,dev tun0
(ou tout autre dispositif de tun) etpush "route <docker net IP> <docker net mask>"
configuré.L'hôte du serveur VPN doit être configuré pour prendre en charge le transfert de paquets IP d'un sous-réseau à un autre. Cela signifie mettre le sysctl ip_forward à 1 (ce devrait être le cas si vous avez installé Docker), autoriser les paquets du périphérique tun à passer par la chaîne iptables FORWARD et définir le routage approprié. Cela peut être résumé par ces commandes:
Quoi qu'il en soit, voici les options que j'ai utilisées pour configurer le serveur:
Cela devrait générer un fichier de configuration du serveur similaire à:
Exemple concret
Je vais maintenant prendre un exemple concret. Dans cet exemple, je vais exécuter le serveur OpenVPN mentionné ci-dessus dans Docker sur l'hôte vpn.example.com. Ce conteneur est attaché au réseau Docker docker-net-vpn. Voici les commandes (dans cet exemple, je génère la configuration du serveur directement sur le serveur et j'ignore la génération CA, veuillez plutôt suivre la documentation paranoïaque du projet mentionné ci-dessus):
La première commande crée un nouveau réseau Docker dédié qui définit un nouveau sous-réseau. Nous attacherons le serveur OpenVPN à ce réseau.
Le second crée la configuration OpenVPN en utilisant le même sous-réseau que celui défini dans la 1ère commande.
Le troisième crée le serveur OpenVPN. Il est attaché au réseau Docker nouvellement créé et utilise une adresse IP fixe.
Les quatrième et cinquième commandes configurent le transfert IP.
La dernière commande ajoute une nouvelle route vers la configuration du client VPN via l'IP fixe du conteneur OpenVPN.
Remarque
Je ne l'ai pas essayé, mais il devrait être possible de restreindre la règle FORWARD pour iptables. La création du réseau Docker a créé un nouveau périphérique de pont. Ce pont est nommé
br-<ID>
avec l'ID étant les 12 premiers caractères de l'ID réseau Docker. Cet ID peut être obtenu avecdocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Par conséquent, la commande suivante est peut-être plus restrictive (donc meilleure sur le plan de la sécurité) mais devrait toujours permettre à notre trafic d'être routé:la source
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
mais je ne peux pas cingler ou atteindre les ports ouverts.docker network…
.