通过主机名将SSH连接转发到Docker容器


10

我遇到了一个非常具体的情况,尽管还有其他方法可以做到这一点,但我还是对此非常着迷,并想找到一种完全像这样的方法:

背景

假设我有一台服务器运行多个服务,这些服务藏在隔离的Docker容器中。由于大多数服务都是http,因此我正在使用nginx代理向每个服务公开特定的子域。例如,节点服务器在其端口80绑定到127.0.0.1:8000主机的docker容器上运行。我会在nginx的是代理的所有请求创建一个虚拟主机myapp.mydomain.comhttp://127.0.0.1:8000。这样,只能通过外部从外部访问docker容器myapp.mydomain.com

现在,我要以一种指向gogs容器的方式启动gogsgogs.mydomain.com docker容器。因此,我使用绑定到主机上的端口来启动此gogs容器。并且Nginx网站将请求代理到,并且效果很好...8000127.0.0.1:8001gogs.mydomain.comhttp://127.0.0.1:8001

但是,gogs是一个git容器,我也想像这样访问存储库,git@gogs.mydomain.com:org/repo但不适用于当前设置。进行此工作的一种方法22是将容器的端口绑定到0.0.0.0:8022主机上的端口,然后git ssh url可能类似于git@gogs.mydomain.com:8022/repo

(这似乎不工作;当我推到与URI这样的原点,混帐要求密码对gitgogs.mydomain.com-而不是gogs.mydomain.com:8022-但不过这可能是什么我做错了,超出范围的这个问题,我也很感谢任何诊断)

问题

我主要关心的是,我希望<gogs container>:22代理ssh端口,就像使用nginx代理http端口一样;即任何gogs.mydomain.com要传递到容器port的ssh连接22。现在,我无法将容器的ssh端口绑定到主机的ssh端口,因为主机上已经有一个sshd在运行。同样,这意味着任何要*.mydomain.com传递到容器sshd的连接。


我想要任何ssh连接到:

  • mydomain.com host.mydomain.com 或mydomain的IP地址被接受并转发到主机上的sshd
  • gogs.mydomain.com或被git.mydomain.com接受传递到gogs容器上的sshd
  • *.mydomain.com*除上述可能性之外,还有其他什么)被拒绝

如果是http,我可以通过nginx轻松实现。有没有办法做到这一点的SSH?


(也想出去问:一般来说,有没有一种方法可以通过任何 tcp服务来完成?)

也欢迎您对我在这里尝试的方式有任何见解。当我要做的事情完全愚蠢时,我不介意被告知。


我已经想到的是:

也许我可以与容器作为ro卷共享主机上的sshd套接字?这意味着容器内的sshd可以拾取与的所有连接*.mydomain.com。有没有办法使容器内的sshd 拒绝gogs.mydomain.comor 以外的所有连接git.mydomain.com?但是,主机上的sshd *.mydomain.com无论如何都将占用所有的连接,包括gogs.mydomain.com; 所以会有冲突。我不知道,我实际上没有尝试过。我应该尝试吗?

Answers:


2

“按主机名”执行此操作根本不在ssh的范围内。ssh协议本身不支持基于名称的虚拟主机(实际上HTTP是此处规则的例外)。

接收方的SSHd永远不会知道您要求客户端连接的主机名,因为此信息未在协议内传递。

如果您只需要几个客户端就可以使用它,则可以配置每个客户端以连接到服务器,然后跳到docker容器,如下所示:

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

这样,ssh将调用proxy命令,该命令将打开与主机的ssh会话并调用netcat以建立与容器的连接。这样,您实际上并不需要将您的Container ssh端口暴露给外界。


0

最新的OpenSSH版本具有ProxyJump指令和-J标志:

ssh -J proxyuser@jumphost user@target
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.