是否可以有这样的配置:
- 一个像往常一样在端口 22 上监听 ssh 连接的服务器
- 对于一个用户(比如说 git),将所有流量重定向到另一个端口(例如 2222)
因此,该命令ssh git@host
将产生与 相同的结果ssh -p 2222 git@host
。
基本上,我尝试在 ssh 上使用某种反向代理,但我知道我们不能使用子域来区分 ssh 传入连接,我想知道我们是否可以使用用户方法来完成这种事情。
编辑:
原因是我在 Docker 容器中设置了一个 gitolite 服务器,所以最后我有一个 ssh 守护进程,它监听端口 2222 以用于 git 目的。此外,我还有一个“常规”ssh 守护进程,它监听端口 22(我想保留它)。
当然,我可以通过端口 2222 访问 git 服务器(如果我从外部打开它),但我想知道我是否可以从远程使用“常规” ssh 服务器,然后在本地将其重定向到用户的“git” ssh git
。
因此对于用户 git 来说,流量将是这样的:
client <==> 22:server:2222:git_container
答案1
简单的 TCP 端口转发无法实现这一点:用户名仅在 SSH 协议中进一步提及,因此如果您坚持以 开头ssh git@host
,则必须进行两次完整的 SSH 身份验证握手。我不知道有哪个通用 SSH 代理可以透明地做到这一点。您可以自动化第二跳服务器端,例如通过将 shell 脚本ssh -p 2222 localhost
作为外部主机上的用户 shell。但这与 SSH 的许多优点不兼容,例如端口转发、sftp、scp 等......
更好的方法是自定义客户端。例如在 ~/.ssh/config 中
Host git_host
Hostname host
Port 2222
Username git
然后ssh git_host
(而不是ssh git@host
)。
如果你必须先穿过外部主机(例如因为你无法直接看到端口 2222),那么你可以使用这些技巧例如
Host git_host
Hostname host
Username git
ProxyCommand ssh -q git@host nc -q0 localhost 2222
(可能不是 100% 正确,请尝试不同的选项)
答案2
配置常规 SSH 服务器以监听非标准端口。然后,您可以配置 gitolite 以使用现在可用的端口 22。
这为您的用户带来了便利,并且您似乎有能力在不同的端口上使用 ssh。
答案3
您可以在主机(:22 所在的主机)上设置 git 用户,并使用该用户的authorized_keys
文件强制转发到其他 ssh 服务器。该authorized_keys
文件如下所示:
command="ssh -p 2222 git@localhost",restrict ecdsa-sha2-nistp521 AAAAE....
您必须将 git@:2222 用户的私钥存储在 git@:22 用户的.ssh/
目录中。另一种方法是在客户端上使用 ssh 代理,并在客户端连接上启用代理转发。
Match
强制命令也可以在 的块中设置/etc/ssh/sshd_config
。