无法从公共 IP 访问 docker 绑定端口

无法从公共 IP 访问 docker 绑定端口

我已经使用以下方法运行了 portainer 图像:

docker run -d -P -p 9000:9000 portainer/portainer

但只能使用 lynx 在本地通过端口 9000 访问网络。我允许防火墙在端口 9000 上传入和传出,所以这应该不是问题。

$sudo iptables -t filter -L -n -v | grep 9000 0 0 接受 tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:9000

但是我很难解释NAT表,这可能是可疑的。

$ sudo iptables -t nat -L -n -v Chain PREROUTING (policy ACCEPT 7 packets, 420 bytes) pkts bytes target prot opt in out
source destination 415 24676 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

链输入(策略接受 1 个数据包,60 字节)数据包字节目标
协议选择加入退出源目标

链输出(策略接受 0 个数据包,0 个字节)pkts 字节目标
协议选择加入退出源目标
0 0 DOCKER 全部 -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE 匹配目标类型 LOCAL

链 POSTROUTING(策略接受 0 个数据包,0 字节)pkts 字节目标 prot 选择加入退出源目标

0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:9000

链 DOCKER(2 个引用)pkts 字节目标 prot 选择加入退出源目标
0 0 返回全部 -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 to:172.17.0.2:9000

有人可以帮我从这里出去吗?

更新1:

我在另一台使用相同 docker 版本的 Ubuntu 服务器上尝试了相同的命令,但它有效。运行并绑定容器后,NAT 表中的唯一区别是 POSTROUTING 记录,其中显示:

pkts 字节目标协议选择加入退出源目标
0 0 MASQUERADE 全部 -- * eth0 10.0.0.0/8 0.0.0.0/0

但我认为这可能不相关,或者是相关的?

Ubuntu 16.04 Docker 版本 17.05.0-ce,内部版本 89658be

答案1

感谢大家在评论中提供帮助,

事实证明,我刚刚用来nmap <host>检查打开的端口,发现 9000 没有打开,尽管内部防火墙/iptables 另有说明。

然后我记得我使用的 VPS 还有另一个外部防火墙层,我也必须配置它。我真笨,但我学会了基本的跟踪过程/命令。谢谢大家!

相关内容