web-dev-qa-db-ja.com

Dockerコンテナからホストのsshトンネルにアクセスします

Ubuntu tustyを使用すると、リモートマシンで実行されているサービスがあり、localhost:9999からsshトンネルを介してポート転送を介してアクセスできます。

Dockerコンテナを実行しています。コンテナ内から、ホストのトンネル経由でそのリモートサービスにアクセスする必要があります。

-L 9000:Host-ip:9999を使用してコンテナからホストへのトンネリングを試みましたが、コンテナ内から127.0.0.1:9000を介してサービスにアクセスすると接続に失敗します。ポートマッピングがオンかどうかを確認するために、nc -luv -p 9999 # at Host nc -luv -p 9000 # at containerを試しました

次の this、parag。2 しかし、コンテナでnc -luv Host-ip -p 9000を実行しているときでも、知覚される通信はありませんでした

また、docker run -p 9999:9000経由でポートをマッピングしようとしましたが、ホストポートが既に使用されているため(おそらくホストトンネルからリモートマシンへ)バインドが失敗したことが報告されます。

だから私の質問は

1-接続をどのように達成しますか?ホストへのsshトンネルをセットアップする必要がありますか、またはこれはdockerポートマッピングのみで実現できますか?

2-接続が確立されていることをテストする簡単な方法は何ですか?できればbash経由。

ありがとう。

32
npit

Docker実行に--net=Hostを追加することでそれができると思います。しかし、この質問も参照してください: ホストポートをdockerコンテナに転送

15
Matthew

--net=Hostを介して、またはnetwork_mode: Hostを介してdocker-composeでコンテナのネットワークとしてホストネットワークを使用することは1つのオプションですが、これは(a)ホストシステムでコンテナポートを公開するという望ましくない副作用があります(b)ホストネットワークにマッピングされていないコンテナには接続できなくなります。

あなたの場合、迅速かつクリーンな解決策は、ホスト環境でドッカーコンテナを公開するのではなく(例えば、sshをdocker0ブリッジにバインドすることにより)、sshトンネルをドッカーコンテナに「利用可能」にすることです(推奨)受け入れられた答えで)。

トンネルのセットアップ:

これが機能するには、docker0ブリッジが使用しているIPを取得します。

ifconfig

次のようなものが表示されます。

docker0   Link encap:Ethernet  HWaddr 03:41:4a:26:b7:31  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

ここで、sshに このip にバインドして、ポート9000に向けられたトラフィックをリッスンする必要があります。

ssh -L 172.17.0.1:9000:Host-ip:9999

bind_addressを設定しない場合、:9000only をホストのループバックインターフェイスで使用でき、それ自体はドッカーコンテナでは使用できません。

サイドノート:トンネルを0.0.0.0にバインドすることもできます。これにより、sshはすべてのインターフェースをリッスンします。

アプリケーションのセットアップ:

コンテナ化されたアプリケーションで、同じdocker0 ipを使用してサーバーに接続します:172.17.0.1:9000。これで、docker0ブリッジを介してルーティングされるトラフィックもsshトンネルに到達します:)

たとえば、:9000にあるリモートデータベースに接続する必要がある "DOT.NET Core"アプリケーションがある場合、 "ConnectionString"には"server=172.17.0.1,9000;が含まれます。

17
B12Toaster