如何根据请求的域将 SSH 转发到 GitLab Docker 容器

How to forward SSH into GitLab Docker container based on requested domain

我有服务器 运行 Ubuntu 16.04 安装了 Docker 引擎。

在一个容器中,我是 运行 GitLab 服务(当然还有许多其他容器和其他东西)。我们称它为 Docker 网络地址 GITLAB_IP.

我正在使用 nginx-proxy 根据 VIRTUAL_HOST 环境变量代理来自外部的 HTTP 请求。

DNS 已设置,因此针对 *.mydomain.com 的所有内容都会转到 mydomain.com 并在同一主机上解析。

发往 mydomain.com 的请求由我的主 nginx 容器提供,而发往 gitlab.mydomain.com 的请求由我的 GitLab 容器提供。

端口 80(和 443)一切正常。

现在我希望能够通过 ssh 使用 git。我想要实现的是,如果我这样做

> ssh mydomain.com

我最终会进入我的主机服务器的终端。如果我这样做

> ssh gitlab.mydomain.com

然后我想在 GitLab 容器的终端结束。

我知道我可以将容器的端口 22 映射到主机上某个未使用的端口,因此我可以通过 ssh-ing 访问容器,例如。端口 10022,但我更喜欢它干净清晰。

有什么方法可以让主机上的 ssh 服务器在检测到特定域时以某种方式充当代理?

与启用 HTTP 或 SNI 的 TLS 服务不同,SSH 服务没有任何类型的基于名称的逻辑检测。

总而言之,每个 ip/port.

都有一个 ssh 守护进程

有一些可行的解决方法。

端口碰撞是一种可能性。您可以根据您发送的敲门声更改防火墙将您转发到的服务。

你可以做的另一件事是设置一个 .ssh/authorized_keys 文件来识别你使用的是哪个 SSH 密钥,然后强制执行一个命令来启动一个新的 ssh 进程并让你进入正确的相应服务.

您还可以 运行 每个 ssh 服务在不同的端口上,并让客户端配置文件处理名称->端口映射。