web-dev-qa-db-ja.com

openvpnをdockerで動作させる方法

私は最近プライバシーvpnをインストールしましたが、有効なopenvpnがdockerを破壊することがわかりました。

docker-compose upを実行しようとすると、次のエラーが表示されます

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

Vpnを無効にすると問題が修正されます(ただし、無効にしたくないのですが)。これら2つを平和的に共存させる方法はありますか?私はdebian jessieを使用しており、私のopenvpnには次のバージョン文字列があります

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

多くの人がopenvpnを無効にすることでこの問題を「解決」したので、これら2つの機能を同時に動作させる方法について具体的に尋ねています。

参照:

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

これで違いが生じる場合、私のvpnプロバイダーは次のとおりです: https://www.ovpn.com/ そしてここに(やや編集された)設定ファイルがあります:

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
32
jb.

ソリューション(TL; DR;)

次の内容で/etc/openvpn/fix-routes.shスクリプトを作成します。

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

ファイルに実行可能ビットを追加します:chmod o+x /etc/openvpn/fix-routes.sh。このファイルの所有者をルートに変更します:chown root:root /etc/openvpn/fix-routes.sh

次の2行に従って構成に追加します。

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

説明

Openvpnは、次のネットワーク用のルートを追加します:0.0.0.0/1および128.0.0.0/1(これらのルートはIP範囲全体をカバーします)、dockerはIPアドレスの範囲を見つけて独自のプライベートネットワークを作成できません。

(openvpnを介してすべてをルーティングするために)デフォルトルートを追加し、これら2つの特定のルートを無効にする必要があります。 fix-routesスクリプトはそれを行います。

このスクリプトは、openvpnが独自のルートを追加した後に呼び出されます。スクリプトを実行するには、script-security2に設定する必要があります。これにより、openvpnコンテキストからbashスクリプトを実行できます。

ありがとう

githubのこのコメントの著者 に感謝します。 ovpnサポート にも感謝します。

37
jb.

Docker composeファイルでサブネットCIDRを定義する場合、docker-composeを動作させることもできます。

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

別のオプション:最初にサブネットCIDRでネットワークを作成してから、このネットワークを使用するdocker composeファイルで指定します。

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

Docker composeファイルで:

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

Anas El Barkaniからの回答 に基づいて、PostgreSQLを使用した完全なステップバイステップの例を示します。

VPNが接続されていない間、永続的な docker network を作成します:

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

Docker-composeファイルで、ネットワークを外部として指定します。

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

それで全部です。これで、VPNを有効にして、通常どおりコンテナを開始/停止できます。

docker-compose up -d
docker-compose down

VPNを毎回オン/オフしたり、奇妙なスクリプトをルートとして追加したりする必要はありません。

5

たぶんそれを行う1つの方法は、172.16.0.0/12を除くすべてのルートをVPN経由のルートに追加して、出て行くすべてが適切に処理されるようにすることです。

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

ここにいくつかの追加コンテキスト:0.0.0.0および128.0.0.0ルートは、OpenVPNサーバー(別名アクセスサーバー)がルートをプッシュしてVPN経由ですべてのエンドポイントのインターネットトラフィックを送信するように構成されている場合にのみ作成されます。これらの広範なルートを追加することにより、ユーザーのインターネットトラフィックをローカルLANでのルーティングを妨げずにルーティングでき、エンドポイントがOpenVPNトラフィック自体をローカルルーターにルーティングできるようにします。

OpenVPNサーバーを介してすべてのインターネットトラフィックを送信する必要がない場合、VPN管理者に、すべてではなくVPNを介してトラフィックを必要な宛先(プライベートIPアドレス範囲など)にルーティングするプロファイルを作成するよう依頼する方がよい場合があります。これにより、エンドポイント上のルートを混乱させる必要がなくなります。

0
SecurityGuy