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

问题描述:

使用Docker 1.12.1,我遇到了一个奇怪的行为,试图访问使用ssh -R创建的主机端口。如何从容器访问主机端口(用ssh -R绑定)?

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

我打开了一个与ssh -R *:12345:localhost:12345 [email protected]的ssh连接,在server上打开一个端口12345,该端口转发到本地机器上的端口12345

现在,当我尝试curl https://172.17.42.1:12345容器内(172.17.42.1是IP从泊坞窗容器访问泊坞窗主机),我得到:

[email protected]:/# 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 

我真的不明白端口绑定怎么做机智^ h SSH从nc测试服务器上(它的工作原理)的区别:

# on server 
nc -l -p 12345 
# inside a container 
[email protected]:/# curl http://172.17.42.1:12345 
curl: (52) Empty reply from server 

注:该容器开始docker run -it --rm maven:3-jdk-8 bash

我能做些什么来允许我的容器访问对应于ssh绑定的主机端口?

+1

通过SSH打开默认端口-R绑定仅本地主机设置 - 你需要使用'-R '*:11443:server1:443''为了让它绑定在其他接口上 – Petesh

+0

感谢您的建议,但它似乎并没有使它的工作。我仍然看到'卷曲:(7)无法连接到172.17.42.1端口11443:连接被拒绝' –

+0

我对你的问题中的事物布局有点困惑。这听起来像你正在尝试[从容器内访问主机端口](http://*.com/questions/31324981/how-to-access-host-port-from-docker-container),所以在这种情况下,答案可能会有所帮助,但我不是100%确定的。 – Petesh

man ssh

-R [...]

...指定远程bind_address如果服务器的GatewayPorts选项启用才会成功

而且man sshd_config

网关端口

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

这意味着默认的sshd服务器安装只允许创建绑定到本地接口的转发。如果你要允许转发到其他接口则回送,你需要将GatewayPorts选项yesclientspecified/etc/ssh/sshd_config

+0

非常感谢! NB ssh服务必须在'/ etc/ssh/sshd_config'中更改''sudo service ssh restart'后重新启动。 –

+0

另一个注释:'clientspecified'可能是更好的选择,然后是'yes',因为它只会导致转发明确要求它绑定到通配符地址。 Whit'yes'所有未指定绑定地址的转发都绑定到通配符地址。 – mata