如何从容器访问主机端口(与ssh -R绑定)?

时间:2016-09-27 08:57:11

标签: linux docker ssh

使用Docker 1.12.1,我试图访问使用ssh -R创建的主机端口时遇到一种奇怪的行为。

基本上我尝试从服务器上运行的docker容器访问本地计算机上端口12345上运行的服务。

我打开了与ssh -R *:12345:localhost:12345 user@server的ssh连接,在12345上打开了一个端口server,该端口转发到我本地计算机上的端口12345

现在,当我在容器内尝试curl https://172.17.42.1:12345时,172.17.42.1是从Docker容器访问docker主机的IP,我得到:

root@f6873fe1109b:/# curl https://172.17.42.1:12345
curl: (7) Failed to connect to 172.17.42.1 port 12345: Connection refused

但在server上,curl http://localhost:12345 命令成功(例如,没有连接被拒绝

server$ curl http://localhost:12345
curl: (52) Empty reply from server

我真的不明白用ssh做的端口绑定与服务器上的nc的测试有什么不同(它有效):

# on server
nc -l -p 12345
# inside a container
root@f6873fe1109b:/# curl http://172.17.42.1:12345
curl: (52) Empty reply from server

注意:容器是以docker run -it --rm maven:3-jdk-8 bash启动的。

如何允许我的容器访问与ssh绑定相对应的主机端口?

1 个答案:

答案 0 :(得分:1)

来自$lookup

  

-R [...]

     

...如果启用了服务器的GatewayPorts选项,则仅指定远程bind_address

man ssh

  

<强> GatewayPorts

     

指定是否允许远程主机连接到为客户端转发的端口。默认情况下,sshd(8)将远程端口转发绑定到环回地址。这可以防止其他远程主机连接到转发端口。 GatewayPorts可用于指定sshd应允许远程端口转发绑定到非环回地址,从而允许其他主机连接。该参数可能为“no”以强制远程端口转发仅对本地主机可用,“yes”强制远程端口转发绑定到通配符地址,或“clientspecified”允许客户端选择其中的地址转发是绑定的。 默认为“否”。

这意味着默认的sshd服务器安装仅允许创建绑定到本地接口的转发。如果您想允许转发到其他接口然后回送,您需要在GatewayPorts

中将yes选项设置为clientspecified/etc/ssh/sshd_config