通过另一个端口重定向一个用户的 ssh 流量

通过另一个端口重定向一个用户的 ssh 流量

是否可以有这样的配置:

  • 一个像往常一样在端口 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

相关内容