使用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绑定相对应的主机端口?
答案 0 :(得分:1)
来自$lookup
:
-R [...]
...如果启用了服务器的GatewayPorts选项,则仅指定远程bind_address
<强> GatewayPorts 强>
指定是否允许远程主机连接到为客户端转发的端口。默认情况下,sshd(8)将远程端口转发绑定到环回地址。这可以防止其他远程主机连接到转发端口。 GatewayPorts可用于指定sshd应允许远程端口转发绑定到非环回地址,从而允许其他主机连接。该参数可能为“no”以强制远程端口转发仅对本地主机可用,“yes”强制远程端口转发绑定到通配符地址,或“clientspecified”允许客户端选择其中的地址转发是绑定的。 默认为“否”。
这意味着默认的sshd服务器安装仅允许创建绑定到本地接口的转发。如果您想允许转发到其他接口然后回送,您需要在GatewayPorts
yes
选项设置为clientspecified
或/etc/ssh/sshd_config