私は最近プライバシー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つの機能を同時に動作させる方法について具体的に尋ねています。
参照:
これで違いが生じる場合、私の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
次の内容で/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-security
を2
に設定する必要があります。これにより、openvpnコンテキストからbashスクリプトを実行できます。
githubのこのコメントの著者 に感謝します。 ovpnサポート にも感謝します。
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
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を毎回オン/オフしたり、奇妙なスクリプトをルートとして追加したりする必要はありません。
たぶんそれを行う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.0.0.0および128.0.0.0ルートは、OpenVPNサーバー(別名アクセスサーバー)がルートをプッシュしてVPN経由ですべてのエンドポイントのインターネットトラフィックを送信するように構成されている場合にのみ作成されます。これらの広範なルートを追加することにより、ユーザーのインターネットトラフィックをローカルLANでのルーティングを妨げずにルーティングでき、エンドポイントがOpenVPNトラフィック自体をローカルルーターにルーティングできるようにします。
OpenVPNサーバーを介してすべてのインターネットトラフィックを送信する必要がない場合、VPN管理者に、すべてではなくVPNを介してトラフィックを必要な宛先(プライベートIPアドレス範囲など)にルーティングするプロファイルを作成するよう依頼する方がよい場合があります。これにより、エンドポイント上のルートを混乱させる必要がなくなります。