Bonjour, chers habrovchans ! Avez-vous dĂ©jĂ Ă©tĂ© dans une situation oĂč vous avez vraiment eu envie de vous tĂ©lĂ©porter virtuellement dans une autre ville, un autre pays ou un autre continent ? J'ai souvent ce besoin, c'est pourquoi avoir mon propre serveur VPN, que je peux dĂ©marrer n'importe oĂč en quelques secondes, est devenu essentiel. Dans cet article, je souhaite vous parler de mon projet, que j'ai conçu lorsque je cherchais une solution prĂȘte Ă l'emploi, en l'occurrence une image Docker, qui permettrait de dĂ©ployer rapidement un serveur OpenVPN, avec un minimum de configurations et un niveau de sĂ©curitĂ© acceptable.
Contexte
La possibilitĂ© de lancer le service sur n'importe quelle machine : qu'il s'agisse d'un serveur physique, d'un serveur privĂ© virtuel, ou mĂȘme d'un espace de conteneurs au sein d'un autre systĂšme de gestion de conteneurs â Ă©tait d'une importance cruciale. Mon attention s'est immĂ©diatement portĂ©e sur Docker. PremiĂšrement, ce service gagne en popularitĂ©, et par consĂ©quent, de plus en plus de fournisseurs proposent des solutions prĂȘtes Ă l'emploi avec son installation ; deuxiĂšmement, il existe un dĂ©pĂŽt centralisĂ© d'images, d'oĂč l'on peut tĂ©lĂ©charger et lancer le service avec une seule commande dans le terminal. L'idĂ©e qu'un tel projet devait dĂ©jĂ exister me traversait l'esprit, et j'ai cherchĂ© avec persistance. Mais la plupart des projets que j'ai trouvĂ©s Ă©taient soit trop encombrants (il fallait crĂ©er un conteneur pour le stockage persistant des donnĂ©es et lancer plusieurs fois le conteneur avec l'application avec diffĂ©rents paramĂštres), soit sans documentation dĂ©cente, soit complĂštement abandonnĂ©s. Ne trouvant rien de convenable, j'ai commencĂ© Ă travailler sur mon projet. J'ai passĂ© de nombreuses nuits blanches Ă Ă©tudier la documentation, Ă Ă©crire du code et Ă dĂ©boguer, mais finalement mon service a vu le jour et a brillĂ© de toutes les couleurs de la LED monochrome du panneau du routeur. Alors, je vous demande de l'accueillir chaleureusement â . J'ai mĂȘme conçu un logo (ci-dessus, avant la coupure), mais ne le jugez pas trop sĂ©vĂšrement, car je ne suis pas designer (encore). Lorsque j'ai rĂ©alisĂ© ce projet, j'ai mis l'accent sur la rapiditĂ© de dĂ©ploiement, un minimum de configurations et un niveau de sĂ©curitĂ© acceptable. Par essais et erreurs, j'ai trouvĂ© un Ă©quilibre optimal entre ces critĂšres, bien que, dans certains cas, j'ai dĂ» sacrifier la rapiditĂ© de dĂ©ploiement au profit de la sĂ©curitĂ©, et le minimum de configurations a eu un coĂ»t en portabilitĂ© : dans la configuration actuelle, un conteneur créé sur un serveur ne peut pas ĂȘtre dĂ©placĂ© et exĂ©cutĂ© sur un autre. Par exemple, tous les certificats clients et serveurs sont gĂ©nĂ©rĂ©s au moment du lancement du service et cela prend environ 2 secondes. Cependant, la gĂ©nĂ©ration du fichier Diffie-Hellman a dĂ» ĂȘtre effectuĂ©e au moment de la construction : il est créé lors de la construction de l'image Docker et peut prendre jusqu'Ă 10 minutes. J'aimerais beaucoup obtenir un audit de sĂ©curitĂ© d'une telle solution de la part de la trĂšs respectĂ©e communautĂ©.
Lancement
Pour lancer le service, nous avons besoin de quelques éléments :
- Serveur : physique ou virtuel. Théoriquement, il est possible de lancer en mode Docker-in-Docker, mais je n'ai pas effectué de tests à grande échelle de cette option ;
- Docker lui-mĂȘme. De nombreux fournisseurs d'hĂ©bergement proposent des solutions prĂȘtes Ă l'emploi avec Docker « intĂ©grĂ© » ;
- Une adresse IP publique.
Si toutes les informations sont en ordre, nous n'avons plus qu'à exécuter la commande suivante dans la console de votre serveur :
docker run --cap-add=NET_ADMIN
-it -p 1194:1194/udp -p 80:8080/tcp
-e HOST_ADDR=$(curl -s https://api.ipify.org)
alekslitvinenk/openvpnLe lecteur attentif a peut-ĂȘtre remarquĂ© que l'adresse IP du serveur est dĂ©terminĂ©e automatiquement Ă l'aide de ipify.org. Si, pour une raison quelconque, cela ne fonctionne pas, l'adresse peut ĂȘtre spĂ©cifiĂ©e manuellement. Si toutes les Ă©tapes prĂ©cĂ©dentes ont Ă©tĂ© correctement exĂ©cutĂ©es, nous devrions voir dans la console quelque chose de semblable :
Sun Jun 9 08:56:11 2019 Initialization Sequence Completed
Sun Jun 9 08:56:12 2019 Le fichier Client.ovpn a été généré
Sun Jun 9 08:56:12 2019 Le serveur de configuration a démarré, téléchargez votre configuration client.ovpn à http://example.com/
Sun Jun 9 08:56:12 2019 REMARQUE : AprĂšs avoir tĂ©lĂ©chargĂ© votre configuration client, le serveur HTTP sera arrĂȘtĂ© !Nous sommes proches de notre objectif : maintenant, nous devons copier (dans votre cas, ce sera l'adresse de votre serveur) et collez-la dans la barre d'adresse de votre navigateur. AprĂšs avoir appuyĂ© sur EntrĂ©e, le fichier client.ovpn sera tĂ©lĂ©chargĂ© et le serveur http disparaĂźtra. Si cette solution suscite des doutes, vous pouvez utiliser cette astuce : relancer la commande prĂ©cĂ©dente et ajouter des drapeaux zp et le mot de passe. Maintenant, si vous collez le lien gĂ©nĂ©rĂ© dans la fenĂȘtre de votre navigateur, vous recevrez une archive zip avec le mot de passe. Lorsque vous avez le fichier de configuration client, vous pouvez utiliser n'importe quel client appropriĂ©. J'utilise Tunnelblick pour Mac.
Tutoriel vidéo
Ce tutoriel vidéo contient des instructions détaillées sur le déploiement du service sur DigitalOcean.

EDIT1 :
- J'ai corrigé des erreurs dans la publication,
- En rĂ©pondant aux commentaires, j'ai dĂ©cidĂ© de mettre cette information ici : le drapeau âprivileged est nĂ©cessaire pour travailler avec iptables
EDIT2 :
- J'ai amĂ©liorĂ© la commande de lancement de l'image : elle ne nĂ©cessite plus le drapeau âprivileged
- J'ai ajouté un lien vers un tutoriel vidéo en russe :
Source : habr.com
