Olá, pessoal da Habr! Vocês já se depararam com a situação em que gostariam de se teletransportar virtualmente para outra cidade, país ou até mesmo outro continente? Eu enfrentava essa necessidade com frequência, por isso o desejo de ter meu próprio servidor VPN, que pode ser ativado em qualquer lugar em poucos segundos, era bastante urgente. Neste artigo, quero compartilhar meu projeto, que surgiu quando eu procurava uma solução pronta, neste caso uma imagem Docker, que permitisse levantar rapidamente um servidor OpenVPN, com o mínimo de configurações e um nível aceitável de segurança.
Antecedentes
A capacidade de executar o serviço em qualquer máquina: seja um servidor físico, um servidor virtual privado ou até mesmo um espaço de container dentro de outro sistema de gerenciamento de containers — era crucial. Meu foco imediatamente se voltou para o Docker. Primeiro, esse serviço está ganhando popularidade, e, consequentemente, cada vez mais provedores oferecem soluções prontas com ele já instalado; segundo, existe um repositório centralizado de imagens, de onde você pode baixar e iniciar o serviço com um único comando no terminal. A ideia de que um projeto como esse já deveria existir me ocorreu, e eu procurei incessantemente. No entanto, a maioria dos projetos que encontrei eram ou muito pesados (era necessário criar um container para armazenamento permanente de dados e iniciar várias vezes o container com o aplicativo com diferentes parâmetros), ou sem documentação decente, ou até abandonados. Não encontrando nada aceitável, comecei a trabalhar no meu projeto. Tive muitas noites sem dormir estudando documentação, escrevendo código e depurando, mas, no final das contas, meu serviço viu a luz do dia e iluminou com todas as cores do painel LED monocromático do roteador. Então, por favor, conheçam e recebam com carinho — . Eu até criei um logotipo (acima, antes do corte), mas não o julguem muito rigorosamente, pois não sou designer (ainda). Quando implementei este projeto, coloquei em primeiro lugar a velocidade de implantação, o mínimo de configurações e um nível razoável de segurança. Por meio de tentativas e erros, encontrei o equilíbrio ideal entre esses critérios, embora em alguns casos tenha sido necessário sacrificar a velocidade de implantação em nome da segurança, e o mínimo de configurações custou portabilidade: na configuração atual, um container criado em um servidor não pode ser transferido e iniciado em outro. Por exemplo, todos os certificados do cliente e do servidor são gerados ao iniciar o serviço, e isso leva cerca de 2 segundos. No entanto, a geração do arquivo de Diffie-Hellman teve que ser feita em tempo de construção: ele é criado durante a construção da imagem docker e pode levar até 10 minutos. Eu realmente gostaria de receber uma auditoria de segurança de uma solução semelhante da respeitada comunidade.
Iniciar
Para iniciar o serviço, precisamos de algumas coisas:
- Servidor: físico ou virtual. Teoricamente, é possível rodar em modo docker dentro de docker, mas não realizei testes em larga escala com essa opção;
- O próprio Docker. Muitos provedores de hospedagem oferecem soluções prontas com Docker 'a bordo';
- Endereço IP público.
Se todos os pré-requisitos estiverem em ordem, então 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/openvpnLeitores atentos podem ter notado que o endereço IP do servidor é determinado automaticamente através de ipify.org. Se por algum motivo isso não funcionar, você pode indicar o endereço manualmente. Se todos os passos anteriores foram executados corretamente, devemos ver no console algo semelhante a:
Sun Jun 9 08:56:11 2019 Sequência de Inicialização Completa
Sun Jun 9 08:56:12 2019 O arquivo Client.ovpn foi gerado
Sun Jun 9 08:56:12 2019 Servidor de configuração iniciado, baixe sua configuração client.ovpn em http://example.com/
Sun Jun 9 08:56:12 2019 NOTA: Após você baixar sua configuração do cliente, o servidor http será desligado!Estamos próximos do objetivo: agora precisamos copiar (no seu caso, será o endereço do seu servidor) e cole na barra de endereços do navegador. Após pressionar Enter, o arquivo client.ovpn será baixado e o servidor http deixará de existir. Se essa solução gerar dúvidas, você pode usar o seguinte truque: execute o comando anterior e adicione as flags zp e a senha. Agora, se você colar o link gerado na janela do navegador - você receberá um arquivo zip com a senha. Quando você tiver o arquivo de configuração do cliente, pode usar qualquer cliente adequado. Eu uso o Tunnelblick para Mac.
Tutorial em vídeo
Este tutorial em vídeo contém instruções detalhadas sobre como implantar o serviço na DigitalOcean.

EDIT1:
- Corrigi erros na publicação,
- Respondendo aos comentários, decidi trazer essa informação aqui: a flag —privileged é necessária para trabalhar com iptables
EDIT2:
- Melhorei o comando para iniciar a imagem: agora não requer a flag —privileged
- Adicionei um link para um guia em vídeo em russo:
Fonte: habr.com
