Eu tenho a seguinte configuração:
- Um host CentOS executando o serviço docker
- Uma rede de ponte docker definida pelo usuário
- 2 contêineres do Docker conectados a essa rede de ponte definida pelo usuário
- Uma instalação do OpenVPN (atualmente em execução no host. Também pode ser executada em um contêiner de docker)
- Alguns clientes conectados ao OpenVPN
Como posso permitir que os contêineres do docker na rede de ponte do docker se comuniquem com os clientes openvpn na rede tun0?
Eu gostaria de poder ter uma comunicação baseada em tcp entre o docker1 (10.10.0.3) e os clientes conectados ao vpn (intervalo 172.19.0.x) de maneira transparente.
O que preciso configurar no lado do docker (rede / iptables / ...) e no host (iptables?)
tap
, malucotun
, estou trabalhando nisso há mais de 12 horas sem sucesso até agora.Respostas:
Contexto
Estou usando o muito bom contêiner Docker da Kyle Manna ( https://github.com/kylemanna/docker-openvpn ). Estou usando a documentação chamada "paranóica" para configurar meu servidor OpenVPN, mas, na minha opinião, essa deve ser a maneira padrão e não a paranóica.
Configuração
Para permitir a conexão bidirecional entre os contêineres selecionados do Docker e os clientes VPN, é necessário criar uma rede Docker na qual você conectará o contêiner, que deverá ter acesso permitido pelos clientes VPN. O servidor VPN será um desses contêineres.
O servidor VPN deve ter o
client-to-client
,topology subnet
,dev tun0
(ou outro dispositivo de tun) epush "route <docker net IP> <docker net mask>"
configurado.O host do servidor VPN deve ser configurado para oferecer suporte ao encaminhamento de pacotes IP de uma sub-rede para outra. Isso significa definir o sysctl ip_forward como 1 (deve ser o caso se você tiver o Docker instalado), permitindo que os pacotes do dispositivo tun passem pela cadeia iptables FORWARD e definindo o roteamento adequado. Isso pode ser resumido com estes comandos:
De qualquer forma, aqui estão as opções que usei para configurar o servidor:
Isso deve gerar um arquivo de configuração do servidor semelhante a:
Exemplo concreto
Agora vou dar um exemplo concreto. Neste exemplo, executarei o servidor OpenVPN mencionado acima no Docker no host vpn.example.com. Esse contêiner está anexado à rede do Docker docker-net-vpn. Aqui estão os comandos (neste exemplo, eu gero a configuração do servidor diretamente no servidor e pulo a geração da CA, siga a documentação paranóica do projeto de menção acima):
O primeiro comando cria uma nova rede Docker dedicada que define uma nova sub-rede. Vamos conectar o servidor OpenVPN a esta rede.
O segundo cria a configuração do OpenVPN usando a mesma sub-rede definida no 1º comando.
O terceiro cria o servidor OpenVPN. Ele está conectado à rede Docker recém-criada e usa um IP fixo.
O quarto e o quinto comando configuram o encaminhamento de IP.
O último comando adiciona uma nova rota para a configuração do cliente VPN por meio do IP fixo do contêiner OpenVPN.
Nota
Eu não tentei, mas deve ser possível restringir a regra FORWARD para iptables. A criação da rede do Docker criou um novo dispositivo de ponte. Essa ponte é nomeada
br-<ID>
com o ID sendo os primeiros 12 caracteres do ID da rede do Docker. Este ID pode ser obtido comdocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Portanto, o comando a seguir é talvez mais restritivo (melhor em termos de segurança), mas ainda deve permitir que nosso tráfego seja roteado:fonte
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
mas não consigo executar ping ou acessar portas abertas.docker network…
.