【问题标题】:Transparent ssh connection forwarding to a docker container透明 ssh 连接转发到 docker 容器
【发布时间】:2025-12-02 06:50:02
【问题描述】:

我希望有一个服务器透明地将传入的 ssh 连接从客户端转发到 docker 容器。这应该包括 scp、git 传输等。这必须与密钥一起使用,密码已停用。用户不应该看到服务器。 更新:是的,这确实意味着用户不知道有服务器。配置必须完全在服务器上进行!

client -----> server -----> container  (actual connection)
client -------------------> container  (what the user should see)

所以,给出的是这样的:

user@client$ ssh user@server
user@server$ ssh -p 42 user@localhost
user@container$ 

但我想要的是这样的:

user@client$ ssh user@server
user@container$ 

我尝试在authorized_keys 文件中使用command="ssh -p 42 user@localhost" 语法,这有点工作,只是在第二个ssh 连接中,用户必须输入他们的密码,因为身份验证没有通过(server 没有有user的私钥)。 此外,即使输入密码,这种方法也不适用于scp

我也听说过tunnel= 命令,但我不知道如何设置它(并且联机帮助页帮助不大)。

我在 Arch 上使用 OpenSSH 7.5p1。

【问题讨论】:

    标签: docker ssh forwarding authorized-keys


    【解决方案1】:

    把它放在你的~/.ssh/config 文件中:

    Host server-container
      ProxyCommand ssh server -W localhost:42
    

    然后简单地做:

    ssh server-container
    

    只要您的用户名一致。如果没有,您可以这样指定它们:

    Host server-container
      ProxyCommand ssh server-user@server -W localhost:42
    

    然后简单地做:

    ssh container-user@server-container
    

    作为奖励,您可以避免使用 ssh 使用 docker exec 进入容器。像这样:

    ssh -t server docker exec -it <container-id> bash
    

    【讨论】:

    • 如我所说,必须在服务器端配置。客户没有恶意,但是……怎么说呢……能力不够。
    • Iptables?还是 ssh 代理?
    【解决方案2】:

    这是我现在想出的解决方案。我对第二个键有点不满意,因为它的公共部分将在container~/.ssh/authorized_keys 中可见,这略微破坏了透明度,但除此之外,所有其他事情似乎都有效。

    user@server$ cat .ssh/authorized_keys
    command="ssh  -q -p 42 user@localhost -- \"$SSH_ORIGINAL_COMMAND\"",no-X11-forwarding ssh-rsa <KEYSTRING_1>
    user@server$ cat .ssh/id_rsa.pub
    <KEYSTRING_2>
    user@container$ cat .ssh/authorized_keys
    ssh-rsa <KEYSTRING_2>
    

    client 使用其私钥对server 进行授权。然后服务器跳转到container,并使用一个专用密钥,该密钥仅用于该特定身份验证。我有点担心你可以通过注入一些命令来突破command=,但到目前为止我没有发现允许突破的排列。
    由于通过$SSH_ORIGINAL_COMMAND,你甚至可以做scpssh-copy-id等等。

    注意:要禁止 ssh-copy-id(我出于其他原因想要这样做),只需将 authorized_keys 设置为容器内的 user 不可写即可。

    【讨论】:

      最近更新 更多