私は非常に特殊な状況に陥っています。これを行う方法は他にもありますが、これに夢中になり、次のように正確に行う方法を見つけたいと思います。
サーバーがいくつかのサービスを実行していて、分離された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:8001
で this 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.com
Host.mydomain.com
またはmydomainのIPアドレスが受け入れられ、ホスト上の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
へのすべての接続を取得します。ですから対立が起こりますわからないけど、実際に試したことはありません。 すべきか私はそれを試しますか?
これを「ホスト名で」行うことは、単に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ポートを外部に公開する必要はありません。
最近のOpenSSHバージョンには、ProxyJumpディレクティブと-Jフラグがあります。
ssh -J proxyuser@jumphost user@target