
私はネットワーク初心者なので、これを初めて試しています。VPN サーバーに接続する openvpn docker を作成しました。dockerwget -q -O - https://api.myip.com
コンテナー内で実行すると、docker のネットワークが VPN に適切に接続され、IP が VPN サーバーのものであることが確認されます。次に、docker コンテナーを介してホスト トラフィックをルーティングし、コンテナーの外部でホスト トラフィックが docker の VPN 接続を使用する同じ結果を達成したいと思います。docker ホスト <-> コンテナー関係からこれを行う方法が私にはよくわからないので、docker のポート マッピング機能を利用し、docker で Web プロキシを立ち上げて http/https リクエストを処理できるのではないかと考えました。
そのため、同じ Docker 内に squid と openvpn サーバーを立ち上げ、ポート 3128 を公開しました (これが squid が listen しているポートであるため)。ホスト上の wget コマンドは次のようになります。
wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345
しかし、テストでは、トラフィックが Docker の VPN 接続を経由していないことが示されています。代わりに、結果は、通信がホストのインターネット接続を経由していることを示しています。
次の Docker 実行コマンドを使用してコンテナを実行します。
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun --name vpn -it --sysctl net.ipv6.conf.all.disable_ipv6=0 -p 12345:3128 vpn-image
上記のアプローチは間違っていますか? 複数の Docker VPN 接続を介してホスト トラフィックをルーティングするための最適なアプローチは何ですか?
以下のリソースはそれが可能であることを示していますが、それぞれのユースケースに固有のソリューションを提供しています。ソリューションの進行状況をデバッグ/テストするのに役立つ wget や curl などの Linux ネットワーク ツールがあれば便利です。
答え1
これは古い質問ですが、最近少なくともいくらかのアクセスがあったようなので、回答します。
何をしようとしているかに応じて、ネットワークを VPN 経由で接続する方法が 2 つあり、何をルーティングしようとしているかに応じて、これを実現する方法が 3 つあります。
プロキシ(フォワードプロキシ)
これには、VPN を使用するホスト システムまたはコンテナーが、そのトラフィックを VPN コンテナーで実行されているプロキシに明示的に転送する必要があります。VPN コンテナーは、アクティブな VPN だけでなくプロキシも実行している必要があります。双方向のネットワーク転送を非常に効率的に管理します。
この手法では、VPN コンテナ内で手動で構成したコンテナ プロキシ サーバーのポートを公開し、localhost:port
プロキシとして使用するようにホスト システムを構成する必要があります。これはかなり複雑で、オプションもたくさんあるため、具体的に Google で検索する必要があります。
直接ネットワークスタック制御(ホスト)
通常、VPN コンテナには別の名前空間で実行される別のネットワーク スタックがありますが、ネットワーク名前空間を分離しないように docker に指示し、代わりにホスト上でネイティブに実行されているかのように完全なネットワーク スタック アクセスを許可することができます。コンテナ化された VPN を、ホストにネイティブにインストールされているかのように使用しようとしている場合は、これを行います。ただし、ホスト ネットワーク名前空間の制御は、単に共有することとは別の権限であるため、いくつかの機能も追加する必要があります。3xact 機能は VPN ソフトウェアによって異なりますが、通常はCAP_NET
、CAP_NET_RAW
、多くの場合 ですCAP_ADMIN
。確信が持てず、アプリケーションを信頼している場合は、特権モードを使用してすべての機能 (および不要なその他の追加機能) を付与できます。そのため、実行コマンドに次の 2 つのオプションを追加します--net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN
。
直接ネットワークスタック制御(別のコンテナ)
このオプションは、ホストの直接ネットワーク スタック制御と同じ概念ですが、VPN をホストではなく別のコンテナーで、そのコンテナー内で実行されているかのように使用できるようにします。このオプションを使用するには、VPN コンテナーとネットワーク スタックを共有するように指示する行を、非 VPN コンテナーの実行コマンドに追加するだけです。--net=container:vpn-container-name