85 votes

Comment faire fonctionner openvpn avec docker

J'ai récemment installé privacy vpn, et il s'avère que l'activation de openvpn casse docker.

Quand j'essaie d'exécuter docker-compose up Je reçois 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 du vpn règle le problème (mais je préfère ne pas le désactiver). Y a-t-il un moyen de faire coexister pacifiquement ces deux-là ? J'utilise debian jessie, et mon openvpn a la chaîne de version 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, donc je demande spécifiquement comment faire fonctionner les 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 vpn est : https://www.ovpn.com/ et voici le fichier de configuration (quelque peu expurgé) :

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

95voto

jb. Points 4932

Solution (TL;DR ;)

Créer /etc/openvpn/fix-routes.sh script 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

Ajouter 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 y 128.0.0.0/1 (ces routes couvrent toute la gamme d'adresses IP), et docker ne peut pas trouver de gamme d'adresses IP pour créer son propre réseau privé.

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

Ce script est appelé après que openvpn ait ajouté ses propres routes. Pour exécuter script, vous devrez définir script-security a 2 qui permet l'exécution de bash scripts depuis le contexte openvpn.

Gracias

Je tiens à remercier auteur de ce commentaire sur github Merci également à support ovpn .

16 votes

Attention avec cette suggestion - si vous voulez todo pour passer par le VPN, ce script enverra votre trafic via votre ancienne route par défaut (non protégée). OpenVPN ajoute un /1 route qui est plus spécifique que par défaut. Pour que cela fonctionne réellement, vous devez supprimer la route par défaut dans le fichier route-up script et le rajouter ensuite dans un down script. OpenVPN passe $route_net_gateway donc quelque chose comme ip route delete default via $route_net_gateway para route-up y ip route add default via $route_net_gateway para down .

0 votes

En fait, il semble que j'ai un VPN par le VPN (tout le trafic est acheminé là). Il semble que mon système ait plus d'une route par défaut, et que celle d'OpenVPN soit juste la première (et donc la seule utilisée). Une partie du trafic passe par d'autres routes (trafic local) mais dans ma configuration, le trafic local est le dernier de mes soucis. Cependant, votre suggestion rendrait la table de routage plus agréable. J'ai besoin de lire davantage sur les réseaux linux.

0 votes

Je ne voulais pas tout faire passer par mon VPN, alors j'ai utilisé : ip route add 10.8.0.0/24 via "$route_vpn_gateway" . C'est cette réponse qui m'a conduit à la solution. Merci !

58voto

Anas El Barkani Points 161

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

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

Autre option : créer d'abord le réseau avec le sous-réseau CIDR, puis spécifier dans le fichier docker compose que l'on veut utiliser ce réseau :

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

Dans votre fichier docker compose :

networks:
  your-network:
    external: true

11 votes

Ceci a fonctionné et est une bien meilleure réponse. Merci !

6 votes

Gateway : ne fonctionne pas actuellement avec docker-compose V3.0 C'est une limitation connue, la seule solution de contournement est de s'en tenir à la V2 ou d'utiliser la commande de création de réseau qui a également été suggérée.

1 votes

Fonctionne dans la version 1.25.5 de docker compose. Merci à vous

22voto

Sur la base de réponse de Anas El Barkani Voici un exemple complet, étape par étape, utilisant PostgreSQL.

Pendant que le VPN n'est pas connecté, créez un compte permanent de réseau de dockers :

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. Maintenant vous pouvez 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 le VPN à chaque fois, ou d'ajouter des scripts bizarres comme Root.

0 votes

"pas besoin de désactiver le vpn" mais la création de réseau ne fonctionne que lorsque le vpn n'est pas connecté....

0 votes

@sarkiroka Vous avez désactivé le VPN. une fois lors de la création du réseau. Le réseau est persistant. Vous pouvez réutiliser ce réseau dans de nombreux fichiers de composition.

2 votes

Vous avez raison, mais par exemple nous utilisons un outil pour créer tous les conteneurs, les réseaux tout automatiquement par projet. Et encore pour d'autres projets. Nous ne voulons pas que ces étapes manuelles ralentissent nos développeurs. Ils changent de projet chaque semaine. La configuration d'openvpn ip range par fichier de configuration est une solution beaucoup plus acceptable pour notre cas.

1voto

geoffreybr Points 21

Peut-être qu'une façon de faire est d'ajouter toutes les routes excluant 172.16.0.0/12 pour qu'elles passent par le VPN afin d'être sûr que tout ce qui sort est correctement traité :

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

0voto

SecurityGuy Points 11

Un peu plus de contexte ici : les routes 0.0.0.0 et 128.0.0.0 ne sont créées que si le serveur OpenVPN (aka Access Server) est configuré pour pousser les routes afin d'envoyer tout le trafic Internet du point final via le VPN. En ajoutant ces routes larges, le trafic Internet de l'utilisateur peut être acheminé sans interférer avec le routage sur le LAN local, et en s'assurant que le point d'extrémité reste capable de router le trafic OpenVPN lui-même vers le routeur local.

Si l'envoi de tout le trafic Internet via le serveur OpenVPN n'est pas une exigence, il est préférable de demander à votre administrateur VPN de créer un profil qui achemine le trafic uniquement vers les destinations requises (telles que les plages d'adresses IP privées) via le VPN au lieu de tout acheminer. Cela devrait éviter d'avoir à modifier les routes sur le point final.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X