ホスト名でssh接続をdockerコンテナーに転送する


10

私は非常に特殊な状況に陥っています。これを行う方法は他にもありますが、これに夢中になり、次のように正確に行う方法を見つけたいと思います。

バックグラウンド

サーバーがいくつかのサービスを実行していて、分離されたDockerコンテナーに隠れているとします。これらのサービスのほとんどはhttpであるため、nginxプロキシを使用して各サービスに特定のサブドメインを公開しています。たとえば、ノードサーバーは、ポートがホスト上に80バインドさ127.0.0.1:8000れたDockerコンテナーで実行されています。私はそのプロキシすべての要求にnginxのでバーチャルホストを作成しますmyapp.mydomain.comしますhttp://127.0.0.1:8000。このようにして、を介して以外から外部からDockerコンテナーにアクセスすることはできませんmyapp.mydomain.com

ここで、gogsコンテナーを指すような方法でgogs Dockerコンテナーを開始したいと思いgogs.mydomain.comます。ホストでバインドされたポートでこのgogsコンテナを開始します。そして、要求にプロキシnginxのサイトに、それがうまく機能し...8000127.0.0.1:8001gogs.mydomain.comhttp://127.0.0.1:8001

しかし、gogsはgitコンテナーなので、経由でリポジトリにアクセスしたいのgit@gogs.mydomain.com:org/repoですが、現在の設定では機能しません。その作業を行う1つの方法22は、コンテナーのポート0.0.0.0:8022をホストのポートにバインドすることですgit@gogs.mydomain.com:8022/repo。その場合、git ssh urlは次のようになります。

(それはうまくいかないようです。そのようなuriでオリジンにプッシュすると、git gitgogs.mydomain.com-ではなく-のユーザーのパスワードを要求しますgogs.mydomain.com:8022が、それはおそらく私が間違っていることであり、この質問の範囲外です私もその診断をお願いします)

問題

私の主な懸念は、<gogs container>:22nginxを使用してhttpポートをプロキシするのと同じように、sshポートをプロキシ化することです。つまりgogs.mydomain.com、コンテナのポートに渡されるssh接続22。すでにホストでsshdが実行されているため、コンテナーのsshポートをホストのsshポートにバインドできません。また、これは、接続*.mydomain.comがコンテナのsshdに渡されることを意味します。


にssh接続したい:

  • mydomain.com host.mydomain.com または受け入れられ、ホスト上のsshdに転送されるmydomainのIPアドレス
  • gogs.mydomain.comまたはgit.mydomain.comgogsコンテナのsshdに渡されたものを受け入れる
  • *.mydomain.com*上記の可能性以外のものはどこですか)拒否されます

httpの場合、nginxを使用して簡単に機能させることができます。SSHでそれを行う方法はありますか?


(また、外に出て尋ねたいと思います:一般的にTCPサービスでそれを達成する方法はありますか?)

ここで私がやろうとしている方法についての洞察も歓迎します。私がやろうとしていることがまったくばかげていると言われてもかまわない。


私がすでに頭に浮かんだこと:

たぶん私はホスト上のsshdソケットをコンテナとしてroボリュームとして共有できますか?これは、コンテナ内のsshdがへのすべての接続を取得できることを意味し*.mydomain.comます。または以外のすべての接続をコンテナ内のsshdに拒否させる方法はありますgogs.mydomain.comgit.mydomain.com?ただし、ホスト上のsshdは、*.mydomain.comとにかくすべての接続を取得しgogs.mydomain.comます。ですから対立が起こります わからないけど、実際に試したことはありません。必要があります私はそれを試してみてください?

回答:


2

これを「ホスト名で」行うことは、単にsshのスコープ内ではありません。sshプロトコル自体は、名前ベースの仮想ホスティングをサポートしていません(実際、HTTPはここのルールの例外です)。

この情報はプロトコル内で渡されないため、受信側のSSHdは、クライアントに接続を要求したホスト名を知ることはできません。

これを使用するためにいくつかのクライアントが必要な場合は、各クライアントを構成してサーバーに接続し、次のようにdockerコンテナーにジャンプできます。

Host yourcontainer
        Hostname internal.ip.of.your.container
        ProxyCommand ssh your.docker.host nc %h %p

この方法でsshはプロキシコマンドを呼び出し、ホストへのsshセッションを開き、netcatコンテナへの接続を確立するために呼び出します。この方法では、コンテナーのsshポートを外部に公開する必要はありません。


0

最近のOpenSSHバージョンには、ProxyJumpディレクティブと-Jフラグがあります。

ssh -J proxyuser@jumphost user@target
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.