Inicie o OpenVPN no Docker em 2 segundos

Olá, residentes de Khabrovsk! Você já se deparou com uma situação em que realmente queria ser transportado virtualmente para outra cidade, país ou continente? Tenho essa necessidade com bastante frequência, então a oportunidade de ter meu próprio servidor VPN, que pode ser lançado em qualquer lugar, em alguns segundos, era bastante urgente. Neste artigo quero falar sobre meu projeto, que idealizei quando era procurando uma solução pronta, neste caso Docker uma imagem que permitisse configurar rapidamente um servidor OpenVPN, com um mínimo de configurações e um nível de segurança aceitável.

Inicie o OpenVPN no Docker em 2 segundos

Pré-história

A capacidade de executar o serviço em qualquer máquina – seja um servidor físico, ou um servidor virtual privado, ou mesmo um espaço de contêiner dentro de outro sistema de gerenciamento de contêineres – era crítica. Meu olhar imediatamente caiu sobre Docker. Em primeiro lugar, este serviço está a ganhar popularidade e, por isso, cada vez mais fornecedores oferecem soluções prontas com a sua pré-instalação; em segundo lugar, existe um armazenamento centralizado de imagens de onde você pode baixar e executar o serviço usando um comando no terminal. A ideia de que tal projeto já deveria existir me veio e procurei muito. Mas a maioria dos projetos que encontrei eram muito complicados (era necessário criar um contêiner para armazenamento permanente de dados e iniciar o contêiner com o aplicativo várias vezes com parâmetros diferentes), ou sem documentação sensata, ou completamente abandonados. , comecei a trabalhar no seu projeto. Houve noites sem dormir antes de estudar documentação, escrever código e depurar, mas finalmente meu serviço viu a luz do dia e começou a brilhar com todas as cores do painel de LED monocromático do roteador. Então, peço que você ame e favoreça - Docker-OpenVPN. Até criei um logotipo (acima, antes do corte), mas não julgue à risca, porque (mais) não sou designer.Quando implementei esse projeto, priorizei a velocidade de implantação, um mínimo de configurações e um nível aceitável de segurança. Por tentativa e erro, encontrei o equilíbrio ideal desses critérios, porém, em alguns lugares tive que sacrificar a velocidade de implantação por uma questão de segurança e tive que pagar pela portabilidade para um mínimo de configurações: na configuração atual, um O contêiner, uma vez criado em um servidor, não pode ser transferido e iniciado em outro. Por exemplo, todos os certificados de cliente e servidor são gerados quando o serviço é iniciado e isso levará cerca de 2 segundos. Porém, a geração do arquivo Hellman Defi teve que ser levada em tempo de construção: ele é criado durante a construção da imagem docker e pode durar até 10 minutos. Eu realmente gostaria de receber uma auditoria de segurança de tal solução da comunidade respeitada.

Lançar

Para iniciar o serviço precisamos de várias coisas:

  1. Servidor: físico ou virtual. É teoricamente possível executar no modo docker-dentro-docker, mas não testei extensivamente essa opção;
  2. Na verdade Docker. Muitos provedores de hospedagem fornecem soluções prontas com Docker integrado;
  3. Endereço IP público.

Se todos os detalhes estiverem corretos, basta executar o seguinte comando no console do seu servidor:

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/openvpn

Um leitor atento deve ter notado que o endereço IP do servidor é determinado automaticamente usando ipify.org. Se por algum motivo isso não funcionar, você pode especificar o endereço manualmente. Se todas as etapas anteriores foram concluídas corretamente, devemos ver algo semelhante no console:

Sun Jun  9 08:56:11 2019 Initialization Sequence Completed
Sun Jun  9 08:56:12 2019 Client.ovpn file has been generated
Sun Jun  9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/
Sun Jun  9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!

Estamos perto do objetivo: agora precisamos copiar example.com (no seu caso será o endereço do seu servidor) e cole na barra de endereços do seu navegador. Depois de pressionar Enter, o arquivo client.ovpn será baixado e o próprio servidor http desaparecerá no esquecimento. Se esta solução estiver em dúvida, você pode usar o seguinte truque: execute o comando anterior e adicione sinalizadores zp e senha. Agora, se você colar o link gerado em uma janela do navegador, receberá um arquivo zip com uma senha. Depois de ter um arquivo de configuração do cliente, você poderá usar qualquer cliente adequado. Eu uso o Tunnelblick para Mac.

Vídeo tutorial

Este tutorial em vídeo contém instruções detalhadas para implantar o serviço na DigitalOcean.

PS Se você achar este projeto útil, dê uma estrela no GitHub, faça um fork e conte para seus amigos. Contribuintes e auditorias de segurança também são amplamente bem-vindos.PPS Se este artigo acabar no Habr, pretendo escrever o próximo sobre como lancei o docker-in-docker e o docker-in-docker-in-docker, por que fiz isso e o que resultou disso.
EDIT1:

  1. Erros corrigidos na publicação,
  2. Respondendo aos comentários, resolvi colocar esta informação aqui: a flag —privileged é necessária para trabalhar com iptables

EDIT2:

  1. Melhorou o comando de lançamento de imagem: agora não requer o sinalizador –privileged
  2. Adicionado um link para o guia de vídeo em russo: youtu.be/A8zvrHsT9A0

Fonte: habr.com

Adicionar um comentário