1

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

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$ 

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

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

我在 Arch 上使用 OpenSSH 7.5p1。

4

2 回答 2

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
于 2017-07-12T17:37:42.013 回答
0

这是我现在想出的解决方案。我对第二个键有点不满意,因为它的公共部分将在container's中可见,~/.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,你甚至可以做scp等等ssh-copy-id

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

于 2017-07-13T12:23:03.190 回答