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

时间:2018-10-02 22:31:03

标签: docker google-cloud-platform google-compute-engine iptables

我正在运行Google云容器实例(cos-beta-70-11021-29-0),并且正在运行nginx:

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

尽管端口80没有在iptables中打开,我仍然可以访问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

为什么会这样?

1 个答案:

答案 0 :(得分:1)

为了公开端口,您必须与内部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摆弄iptables,则可以将参数--iptables=false添加到Docker守护程序执行器中,但是可能您的docker命令的'expose'部分可能无法自动运行,您可能需要添加一些其他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