尽管有 iptables,我仍可以访问 Google 云上的端口 80 - 为什么?

Despite iptables, I can access port 80 on Google Cloud - why?

我 运行ning google 云容器实例 (cos-beta-70-11021-29-0) 我 运行 nginx:

docker run --name xx -d -p 80:80 nginx

尽管 iptables 中的端口 80 未打开,但我可以访问 nginx 欢迎页面:

$ sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 23 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

为什么会这样?

为了暴露一个端口,你必须将内部 docker 网络与外部网络通信,所以 Docker 添加它自己的 DOCKER 链到 iptables,由它自己管理.当您在容器上公开端口时,使用 -p 80:80 选项,Docker 会向该链添加一条规则。

在您的规则列表中,您可以找到:

-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

如果你不想 Docker 到 fiddle 与 iptables,你可以添加参数 --iptables=false 到你的 Docker 守护进程,但可能 'expose' 部分 docker 命令可能不会自动运行,您可能需要添加一些额外的 iptables 规则。我还没有测试过。

您可能会发现选项 /etc/default/docker/etc/systemd/system/docker.service.d 取决于您使用的是 systemd、upstart 还是其他...

您可能需要查看以下任一链接:

https://docs.docker.com/config/daemon/systemd/

https://docs.docker.com/engine/reference/commandline/dockerd//#daemon-configuration-file