it-swarm-pt.tech

Como fazer o openvpn funcionar com o docker

Eu instalei recentemente privacidade vpn, e verifica-se que habilitado openvpn quebra docker. 

Quando tento executar docker-compose up recebo o seguinte erro 

ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

Desabilitar o vpn corrige o problema (no entanto, prefiro não desativá-lo). Existe alguma maneira de fazer esses dois coexistirem pacificamente? Eu uso o debian jessie, e meu openvpn tem a seguinte string de versão

 OpenVPN 2.3.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 26 2017

Muitas pessoas "resolveram" esse problema desabilitando o openvpn, então estou perguntando especificamente como fazer esses dois funcionarem ao mesmo tempo. 

Referências: 

  1. https://stackoverflow.com/a/45377351/7918
  2. https://stackoverflow.com/a/42499393/7918

Se isso faz alguma diferença, meu provedor de VPN é: https://www.ovpn.com/ e aqui está um arquivo de configuração (um pouco redigido): 

client
dev tun

proto udp

remote Host port
remote-random

mute-replay-warnings
replay-window 256

Push "dhcp-option DNS 46.227.67.134"    
Push "dhcp-option DNS 192.165.9.158"

remote-cert-tls server
cipher aes-256-cbc
pull

nobind
reneg-sec 432000
resolv-retry infinite

comp-lzo
verb 1

persist-key
persist-tun
auth-user-pass /etc/openvpn/credentials
ca ovpn-ca.crt
tls-auth ovpn-tls.key 1
22
jb.

Solução (TL; DR;)

Crie o script /etc/openvpn/fix-routes.sh com o seguinte conteúdo: 

#!/bin/sh

echo "Adding default route to $route_vpn_gateway with /0 mask..."
ip route add default via $route_vpn_gateway

echo "Removing /1 routes..."
ip route del 0.0.0.0/1 via $route_vpn_gateway
ip route del 128.0.0.0/1 via $route_vpn_gateway

Adicione o bit executável ao arquivo: chmod o+x /etc/openvpn/fix-routes.sh. Altere o proprietário deste arquivo para a raiz: chown root:root /etc/openvpn/fix-routes.sh

Adicione à sua configuração seguindo duas linhas: 

 script-security 2
 route-up  /etc/openvpn/fix-routes.sh

Explicação

O OpenVPN adiciona rotas para as seguintes redes: 0.0.0.0/1 e 128.0.0.0/1 (essas rotas abrangem todo o intervalo de IP) e a janela de encaixe não pode encontrar um intervalo de endereços IP para criar sua própria rede privada. 

Você precisa adicionar uma rota padrão (para rotear tudo através de openvpn) e desabilitar essas duas rotas específicas. O script fix-routes faz isso. 

Esse script é chamado depois que o openvpn adiciona suas próprias rotas. Para executar scripts, você precisará configurar script-security para 2, que permite a execução de scripts bash a partir do contexto openvpn. 

Obrigado

Gostaria de agradecer autor deste comentário no github , também graças ao ovpn support

26
jb.

Você também pode fazer o docker-compose funcionar se definir o CIDR da sub-rede em seu arquivo de composição do docker:

networks:
  your-network:
   ipam:
      config:
      - subnet: 172.16.238.0/24
        gateway: 172.16.238.1

Outra opção: criar primeiro a rede com a sub-rede CIDR e, em seguida, especificar no arquivo de composição da janela de encaixe que você deseja usar essa rede:

network create your-network --subnet 172.24.24.0/24

Em seu arquivo de composição do docker:

networks:
  your-network:
    external: true
11
Anas El Barkani

Com base no answer do Anas El Barkani , aqui está um exemplo passo-a-passo completo usando o PostgreSQL.

Enquanto a VPN não estiver conectada, crie uma rede permanente docker :

docker network create my-network --subnet 172.24.24.0/24

No arquivo de composição do docker, especifique rede como externa:

version: "2"
services: postgres: container_name: postgres image: postgres volumes: - ./volumes/postgres/data:/var/lib/postgresql/data environment: - POSTGRES_DB=dummy - POSTGRES_USER=user - POSTGRES_PASSWORD=123456 - POSTGRES_Host=localhost networks: - default ports: - "127.0.0.1:5432:5432"
networks: default: external: name: my-network

Isso é tudo. Agora você pode ativar sua VPN e iniciar/parar o contêiner como de costume:

docker-compose up -d
docker-compose down

Não há necessidade de ligar/desligar a VPN toda vez, ou adicionar scripts estranhos como root.

2
alexanderlukanin13

Talvez uma maneira de fazer isso seja adicionar todas as rotas excluindo 172.16.0.0/12 para rotear através de VPN, então temos certeza de que tudo o que está saindo é tratado adequadamente:

Sudo ip route add 192.0.0.0/2 via $route_vpn_gateway
Sudo ip route add 128.0.0.0/3 via $route_vpn_gateway
Sudo ip route add 176.0.0.0/4 via $route_vpn_gateway
Sudo ip route add 160.0.0.0/5 via $route_vpn_gateway
Sudo ip route add 168.0.0.0/6 via $route_vpn_gateway
Sudo ip route add 174.0.0.0/7 via $route_vpn_gateway
Sudo ip route add 173.0.0.0/8 via $route_vpn_gateway
Sudo ip route add 172.128.0.0/9 via $route_vpn_gateway
Sudo ip route add 172.64.0.0/10 via $route_vpn_gateway
Sudo ip route add 172.32.0.0/11 via $route_vpn_gateway
Sudo ip route add 172.0.0.0/12 via $route_vpn_gateway

# And finally delete the default route which handle 172.16.0.0/12
Sudo ip route del 128.0.0.0/1 via $route_vpn_gateway
0
geoffreybr

Algum contexto adicional aqui: as rotas 0.0.0.0 e 128.0.0.0 só são criadas se o servidor OpenVPN (também conhecido como Servidor de Acesso) estiver configurado para Enviar rotas para enviar todo o tráfego de Internet do ponto de extremidade através da VPN. Ao adicionar essas rotas amplas, o tráfego da Internet do usuário pode ser roteado sem interferir com o roteamento na LAN local e garantir que o endpoint permaneça capaz de rotear o próprio tráfego do OpenVPN para o roteador local.

Se enviar todo o tráfego da Internet através do servidor OpenVPN não for um requisito, talvez seja melhor pedir ao administrador da VPN para criar um perfil que direcione o tráfego somente para os destinos exigidos (como intervalos de endereços IP privados) através da VPN. Isso deve evitar ter que mexer com as rotas no endpoint.

0
SecurityGuy