我需要对 Docker 容器中服务器上出现故障的某些内容进行 xdebug,并且我已经从我的笔记本电脑上运行ssh -R 9000:localhost:9000 server
并验证了隧道telnet localhost 9000
。到目前为止一切顺利,我已建立连接。
现在,我在服务器上
iptables -t nat -I PREROUTING -p tcp -d 172.17.42.1 --dport 9000 -j DNAT --to 127.0.0.1:9000
最后我提交了有问题的docker实例并运行
docker run --net=host -t -i snapshot /bin/bash
容器内部telnet 172.17.42.1 9000
拒绝连接。
答案1
我遇到了同样的问题,只是我有两个容器通过--link连接在一起,所以--net = host 在这种情况下不起作用。
当使用 ssh 端口转发到远程主机时ssh -R 9000:localhost:9000 server
,lsof -P -i -n
可能会显示该端口已绑定到服务器回送设备,如下所示:
sshd 39172 ubuntu 9u IPv4 2941407 0t0 TCP ::1:9000 (LISTEN)
该环回接口不适用于 Docker 容器内的网络。我通过GatewayPorts yes
在服务器上的 sshd_config 文件中添加并重新启动 sshd 来解决这个问题。
然后,转发的端口 9000 绑定到正常接口并可从 docker 容器内部使用。(以及从任何其他主机使用)。
答案2
@barlop 的评论非常有用。我删除了 iptables 规则,然后尝试运行nc -l -p 1234
,nc -l 127.0.0.1 -p 1234
然后在容器中尝试telnet localhost 1234
,它成功了。所以我试了一下telnet localhost 9000
,它也成功了!我认为以前没有,但现在似乎成功了。所以:不需要任何 iptables 规则,它只是与 一起工作--net=host
。但是,lsof -i :9000 仍然没有显示任何内容,可能我以前只用它测试过。
编辑:netstat -anl |grep :9000
容器中显示开放端口为 LISTEN。lsof 没有显示。很奇怪。