web-dev-qa-db-fra.com

Comment faire fonctionner openvpn avec docker

J'ai récemment installé Privacy VPN, et il s'avère que l'openvpn activé interrompt le menu fixe. 

Lorsque j'essaie d'exécuter docker-compose up, j'obtiens l'erreur suivante. 

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

La désactivation de vpn corrige le problème (toutefois, je préfère ne pas le désactiver). Existe-t-il un moyen de faire coexister ces deux personnes pacifiquement? J'utilise Debian Jessie, et mon openvpn a la chaîne suivante

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

Beaucoup de gens ont "résolu" ce problème en désactivant l'openvpn, je demande donc spécifiquement comment faire fonctionner ces deux en même temps. 

Références: 

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

Si cela fait une différence, mon fournisseur de vpn est: https://www.ovpn.com/ et voici un fichier de configuration (quelque peu rédigé): 

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.

Solution (TL; DR;)

Créez un script /etc/openvpn/fix-routes.sh avec le contenu suivant: 

#!/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

Ajoutez le bit exécutable au fichier: chmod o+x /etc/openvpn/fix-routes.sh. Changez le propriétaire de ce fichier en root: chown root:root /etc/openvpn/fix-routes.sh

Ajoutez à votre configuration les deux lignes suivantes: 

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

Explication

Openvpn ajoute des routes pour les réseaux suivants: 0.0.0.0/1 et 128.0.0.0/1 (ces routes couvrent toute la plage d'adresses IP), et docker ne peut pas trouver une plage d'adresses IP pour créer son propre réseau privé. 

Vous devez ajouter une route par défaut (pour tout router via openvpn) et désactiver ces deux routes spécifiques. Le script fix-routes fait cela. 

Ce script est appelé après que openvpn ajoute ses propres routes. Pour exécuter les scripts, vous devez définir script-security sur 2, ce qui permet l'exécution de scripts bash à partir du contexte openvpn. 

Merci

Je voudrais remercier auteur de ce commentaire sur github , également grâce à ovpn support

26
jb.

Vous pouvez également utiliser docker-compose si vous définissez le CIDR du sous-réseau dans votre fichier de composition:

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

Une autre option: créer d’abord le réseau avec le sous-réseau CIDR, puis spécifier dans le fichier de composition de menu fixe que vous souhaitez utiliser ce réseau:

network create your-network --subnet 172.24.24.0/24

Dans votre docker composez le fichier:

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

Basé sur réponse de Anas El Barkani , voici un exemple complet pas à pas utilisant PostgreSQL.

Tant que le VPN n’est pas connecté, créez un réseau permanent Menu fixe :

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

Dans le fichier docker-compose, spécifiez le réseau comme externe:

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

C'est tout. Vous pouvez maintenant activer votre VPN et démarrer/arrêter le conteneur comme d'habitude:

docker-compose up -d
docker-compose down

Pas besoin d'activer/désactiver VPN à chaque fois, ou d'ajouter des scripts étranges en tant que root.

2
alexanderlukanin13

Une façon de le faire est peut-être d'ajouter toutes les routes, à l'exception de 172.16.0.0/12, pour acheminer via un réseau privé virtuel (VPN) afin que nous puissions nous assurer que toutes les sorties sont correctement traitées:

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

Un contexte supplémentaire ici: les routes 0.0.0.0 et 128.0.0.0 ne sont créées que si le serveur OpenVPN (ou serveur d'accès) est configuré sur Push routes pour envoyer tout le trafic Internet du point de terminaison via le VPN. En ajoutant ces grandes routes, le trafic Internet de l'utilisateur peut être routé sans interférer avec le routage sur le réseau local, et en veillant à ce que le point de terminaison reste capable d'acheminer lui-même le trafic OpenVPN vers le routeur local.

Si l'envoi de tout le trafic Internet via le serveur OpenVPN n'est pas une exigence, il vaut peut-être mieux demander à votre administrateur VPN de créer un profil qui acheminera le trafic uniquement vers des destinations requises (telles que des plages d'adresses IP privées) via le VPN plutôt que pour tout. Cela devrait éviter de gâcher les routes sur le noeud final.

0
SecurityGuy