我想让服务器透明地将传入的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$
我尝试在command="ssh -p 42 user@localhost"
文件中使用authorized_keys
语法,这种方式有效,只是在第二个ssh连接中,用户必须输入密码,因为身份验证未通过({{ 1}}没有server
的私钥。
此外,即使输入密码,此方法也不适用于user
。
我也听说过scp
命令,但我不知道如何设置它(并且联机帮助页不太有用)。
我在Arch上使用OpenSSH 7.5p1。
答案 0 :(得分: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
答案 1 :(得分:0)
这是我现在提出的解决方案。我对第二个键有点不满意,因为它的公共部分会在container
的{{1}}中显示,这会略微破坏透明度,但除此之外其他所有东西似乎都有效。< / p>
~/.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
不可写。