我的服务器运行 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/端口都有一个 ssh 守护进程。
有一些可行的变通方法。
端口碰撞是一种可能性。您可以根据您发送的敲门声更改防火墙将您转发到的服务。
您可以做的另一件事是设置一个 .ssh/authorized_keys 文件,该文件将识别您使用的是哪个 SSH key ,然后强制执行一个命令以启动新的 ssh 进程并将您置于正确的相应服务上。
您还可以在不同的端口上运行每个 ssh 服务,并让客户端配置文件处理名称->端口映射。
关于ubuntu - 如何根据请求的域将 SSH 转发到 GitLab Docker 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40425404/