web-dev-qa-db-ja.com

1つのDockerコンテナーからVPNを介してトラフィックをルーティングする(2番目のコンテナーによって提供される)

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:

前に説明したシナリオ

1

最後に問題を発見しました。

デフォルトでは、ネットワークinternal: trueを定義すると、lanセグメント上のすべてのコンテナーがネットワークから抜け出すのをブロックするために、いくつかのiptablesルールが施行されます。

最初は、192.168.80.2から192.168.80.1(そのLANセグメントのホストマシンに割り当てられたIP)からインターネットへのルートだと思っていました。すべてのiptablesルールを注意深く読んだところ、転送も無効になっていることがわかりました。

internal: trueを削除すると、Webサーバーがパブリックインターネットに直接アクセスできるようになる代わりに、コンテナがVPN経由でルーティングできるようになります。

1