2つのDockerコンテナーを次のようなシナリオで機能させる方法を理解する必要があります。
ルーターとクライアントを備えた支社があります。ネットワークは192.168.190.0/24で、アドレスは1と57です。
他にどこかにありますVMパブリックIP XYZKを使用してインターネットに面し、上にdocker環境がインストールされています。内部には2つのコンテナがあります。最初の1つはプライベートネットワークのみに面するWebサーバーです。他のコンテナは、アドレス192.168.80.44のプライベートネットワークに接続しており、他のネットワークインターフェースの1194ポートをパブリックIPに公開しています。
192.168.190.57で192.168.80.2のページを開くことができるようにする必要があります。
VPNの部分は問題なく動作し(ルーターが接続し、クライアントからping可能です)、私はそれについて助けを必要としません。
これは私のdocker-composeファイルのモックアップです。
version: '2'
services:
openvpn:
image: mycompany/openvpn
restart: 'always'
cap_add:
- NET_ADMIN
ports:
- '1194:1194/udp'
networks:
nat:
private_net:
ipv4_address: '192.168.80.44'
coredns:
image: 'nginx'
restart: 'always'
links:
- openvpn:private_net_vpn
networks:
private_net:
ipv4_address: '192.168.80.2'
networks:
private_net:
internal: true
ipam:
config:
- subnet: '192.168.80.0/24'
nat:
最後に問題を発見しました。
デフォルトでは、ネットワークinternal: true
を定義すると、lanセグメント上のすべてのコンテナーがネットワークから抜け出すのをブロックするために、いくつかのiptablesルールが施行されます。
最初は、192.168.80.2から192.168.80.1(そのLANセグメントのホストマシンに割り当てられたIP)からインターネットへのルートだと思っていました。すべてのiptablesルールを注意深く読んだところ、転送も無効になっていることがわかりました。
internal: true
を削除すると、Webサーバーがパブリックインターネットに直接アクセスできるようになる代わりに、コンテナがVPN経由でルーティングできるようになります。