it-swarm.com.de

Wie kann Openvpn mit Docker funktionieren?

Ich habe vor kurzem Privacy VPN installiert, und es stellt sich heraus, dass Openvpn Docker aktiviert. 

Wenn ich versuche, docker-compose up auszuführen, erhalte ich folgende Fehlermeldung 

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

Durch das Deaktivieren von vpn wird das Problem behoben (ich möchte es jedoch lieber nicht deaktivieren). Gibt es eine Möglichkeit, diese beiden friedlich nebeneinander bestehen zu lassen? Ich verwende debian jessie und mein openvpn hat folgende Versionszeichenfolge

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

Viele Leute haben dieses Problem durch Deaktivieren des openvpn "gelöst", daher frage ich speziell, wie diese beiden gleichzeitig funktionieren sollen. 

Verweise: 

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

Wenn dies einen Unterschied macht, ist mein VPN-Anbieter: https://www.ovpn.com/ und hier ist die (etwas überarbeitete) Konfigurationsdatei: 

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.

Lösung (TL; DR;)

Erstellen Sie ein /etc/openvpn/fix-routes.sh-Skript mit folgendem Inhalt: 

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

Fügen Sie der Datei ein ausführbares Bit hinzu: chmod o+x /etc/openvpn/fix-routes.sh. Ändern Sie den Besitzer dieser Datei in root: chown root:root /etc/openvpn/fix-routes.sh

Fügen Sie Ihrer Konfiguration folgende zwei Zeilen hinzu: 

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

Erläuterung

Openvpn fügt Routen hinzu, die für folgende Netzwerke gelten: 0.0.0.0/1 und 128.0.0.0/1 (diese Routen decken den gesamten IP-Bereich ab), und das Docker kann keinen IP-Adressbereich finden, um ein eigenes privates Netzwerk zu erstellen. 

Sie müssen eine Standardroute hinzufügen (um alles durch openvpn zu routen) und diese beiden spezifischen Routen deaktivieren. fix-routes-Skript macht das. 

Dieses Skript wird aufgerufen, nachdem openvpn seine eigenen Routen hinzugefügt hat. Um Skripts auszuführen, müssen Sie script-security auf 2 setzen, wodurch die Ausführung von Bash-Skripts aus dem openvpn-Kontext ermöglicht wird. 

Vielen Dank

Ich möchte mich bei Autor dieses Kommentars zu github bedanken, auch dank ovpn support

26
jb.

Sie können Docker-Compose auch verwenden, wenn Sie das Subnetz-CIDR in Ihrer Docker-Compose-Datei definieren:

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

Eine weitere Option: Erstellen Sie zuerst das Netzwerk mit dem Subnetz CIDR und geben Sie in der Docker-Compose-Datei an, dass Sie dieses Netzwerk verwenden möchten:

network create your-network --subnet 172.24.24.0/24

In Ihrer Docker-Kompositionsdatei:

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

Basierend auf Antwort von Anas El Barkani , folgt ein komplettes schrittweises Beispiel für PostgreSQL.

Wenn VPN nicht verbunden ist, erstellen Sie ein permanentes Docker-Netzwerk :

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

Geben Sie in der Docker-Compose-Datei das Netzwerk als extern an:

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

Das ist alles. Jetzt können Sie Ihr VPN aktivieren und den Container wie gewohnt starten/stoppen:

docker-compose up -d
docker-compose down

Sie müssen VPN nicht jedes Mal ein- und ausschalten oder seltsame Skripts als Root hinzufügen.

2

Vielleicht können Sie dazu alle Routen mit Ausnahme von 172.16.0.0/12 hinzufügen, um über VPN zu routen, sodass wir sicher sind, dass alles, was ausgeht, ordnungsgemäß verarbeitet wird:

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

Hier einige zusätzliche Zusammenhänge: Die Routen 0.0.0.0 und 128.0.0.0 werden nur erstellt, wenn der OpenVPN-Server (auch als Access Server bezeichnet) Push-Routen zum Senden des gesamten Internetverkehrs des Endpunkts über das VPN konfiguriert ist. Durch das Hinzufügen dieser breiten Routen kann der Internetverkehr des Benutzers geroutet werden, ohne das Routing im lokalen LAN zu beeinträchtigen und sicherzustellen, dass der Endpunkt den OpenVPN-Verkehr selbst an den lokalen Router weiterleiten kann.

Wenn das Senden des gesamten Internetdatenverkehrs über den OpenVPN-Server keine Voraussetzung ist, sollten Sie Ihren VPN-Administrator möglicherweise bitten, ein Profil zu erstellen, das nur den Datenverkehr an erforderliche Ziele (z. B. private IP-Adressbereiche) über das VPN weiterleitet. Das sollte vermeiden, dass Sie sich mit den Routen am Endpunkt herumschlagen müssen.

0
SecurityGuy