web-dev-qa-db-ja.com

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

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

バックグラウンド

サーバーがいくつかのサービスを実行していて、分離されたDockerコンテナーに隠れているとします。これらのサービスのほとんどはhttpであるため、nginxプロキシを使用して、特定のサブドメインを各サービスに公開しています。たとえば、ノードサーバーは、ポート80がホストの127.0.0.1:8000にバインドされたDockerコンテナーで実行されています。 nginxで、myapp.mydomain.comからhttp://127.0.0.1:8000へのすべてのリクエストをプロキシするvhostを作成します。こうすることで、myapp.mydomain.comを経由しない限り、外部からdockerコンテナーにアクセスできなくなります。

ここで、gogs.mydomain.comがgogsコンテナーを指すように gogs dockerコンテナーを開始したいと思います。したがって、ホストの8000にバインドされたポート127.0.0.1:8001this gogs container を開始します。そして、nginxサイトはgogs.mydomain.comからhttp://127.0.0.1:8001へのリクエストをプロキシし、うまく機能します...

しかし、gogsはgitコンテナーなので、[email protected]:org/repoなどを介してリポジトリにアクセスしたいのですが、現在の設定では機能しません。これを機能させる1つの方法は、コンテナーのポート22をホストのポート0.0.0.0:8022にバインドすることです。その場合、git ssh urlは[email protected]:8022/repoのようになります。

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

問題

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


にssh接続したい:

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

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


(また、手足を伸ばして質問したい:anytcpサービス一般でそれを達成する方法はありますか?)

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


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

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

10
Zia Ur Rehman

これを「ホスト名で」行うことは、単に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ポートを外部に公開する必要はありません。

2
Andreas Rogge

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

ssh -J proxyuser@jumphost user@target
0
ptman