实验环境
服务器ip:192.168.0.105
操作系统: CentOS7.9
image.png
启动docker容器前:
# iptables -t filter -nvL --line
Chain INPUT (policy ACCEPT 101 packets, 7368 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 56 packets, 5088 bytes)
num pkts bytes target prot opt in out source destination
# iptables -t nat -nvL --line
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
# iptables -t raw -nvL --line
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
# iptables -t mangle -nvL --line
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
启动docker容器后:
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum -y install docker-ce-18.06.0.ce
# docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --privileged=true rabbitmq:3-management
# iptables -t filter -nvL --line
Chain INPUT (policy ACCEPT 726 packets, 53157 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
4 0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
5 0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
6 0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 310 packets, 34000 bytes)
num pkts bytes target prot opt in out source destination
Chain DOCKER (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:15672
2 0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:5672
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
2 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
2 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-USER (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
# iptables -t nat -nvL --line
Chain PREROUTING (policy ACCEPT 5 packets, 541 bytes)
num pkts bytes target prot opt in out source destination
1 2 120 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 5 packets, 541 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
2 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:15672
3 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:5672
Chain DOCKER (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
2 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15672 to:172.17.0.2:15672
3 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5672 to:172.17.0.2:5672
# iptables -t raw -nvL --line
Chain PREROUTING (policy ACCEPT 401 packets, 29347 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 173 packets, 18392 bytes)
num pkts bytes target prot opt in out source destination
# iptables -t mangle -nvL --line
Chain PREROUTING (policy ACCEPT 352 packets, 25727 bytes)
num pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 352 packets, 25727 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 143 packets, 15776 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 143 packets, 15776 bytes)
num pkts bytes target prot opt in out source destination
你会发现只有 filter 和nat表发生了改变,其中 filter表中的FORWARD链的默认policy由ACCEPT改为了DROP !
根据您提供的iptables规则,我们可以分别解读filter链和nat链的具体规则。
filter链规则解读
-
Chain INPUT: 这个链是用来处理进入本机的数据包。在您的规则中,有一条策略是ACCEPT,表示允许所有进入本机的数据包。另外,还有一些针对DOCKER-USER链的规则,这些规则允许从任何源IP到任何目的IP的数据包,这可能是为了满足某些特定的容器网络需求。
-
Chain FORWARD: 这个链处理在本机转发的数据包。您的规则中包含了几条DOCKER相关的规则,这些规则允许从docker0网络接口出去的数据包,并且要求这些数据包的目的地是与docker0网络接口相关联的。同时,还有一些规则允许从docker0接口出去的数据包,并且这些数据包的源和目的地都是docker0接口。这些规则确保了容器之间的网络流量可以正常转发。
-
Chain OUTPUT: 这个链处理从本机出去的数据包。在这里,您的规则允许所有从docker0接口出去的数据包,这可能是为了允许容器向外发送数据。
-
Chain DOCKER: 这个链是专门为Docker容器设置的,它包含了两条规则。第一条规则允许从非docker0接口出去的TCP连接,目标端口是15672(RabbitMQ管理界面端口)和5672(RabbitMQ默认端口)。第二条规则是针对从docker0接口出去的连接,同样允许目标端口是15672和5672的TCP连接。
-
Chain DOCKER-ISOLATION-STAGE-1 和 DOCKER-ISOLATION-STAGE-2: 这些链是为了实现Docker容器的网络隔离。STAGE-1链允许从docker0接口出去的数据包,而STAGE-2链则会丢弃所有从docker0接口出去的数据包,除非这些数据包已经在STAGE-1链中被处理过。
-
Chain DOCKER-USER: 这个链包含了一条规则,允许所有数据包通过。
nat链规则解读
-
Chain PREROUTING: 这个链在路由决定之前处理进入的数据包。您的规则中有一个DOCKER规则,它将所有进入的数据包,除了目的地是本地地址的,都重定向到本地地址。这可能是为了将进入的数据包重定向到Docker容器。
-
Chain INPUT: 这个链处理进入本机的数据包。在这里,有一个规则,它将所有不是来自本地地址的数据包重定向到本地地址。这可能是为了处理那些需要被NAT转换的数据包。
-
Chain OUTPUT: 这个链处理从本机出去的数据包。在这里,有一个规则,它将所有不是发往本地地址的数据包重定向到本地地址。这可能是为了处理那些需要被NAT转换的数据包。
-
Chain POSTROUTING: 这个链在路由决定之后处理出去的数据包。在这里,有一个MASQUERADE规则,它将所有从非docker0接口出去的数据包的源地址伪装成docker0接口的IP地址。这允许容器通过NAT网关访问外部网络。
-
Chain DOCKER: 这个链包含了DNAT(目标网络地址转换)规则,它将所有到达172.17.0.0/16网段的15672和5672端口的TCP连接重定向到172.17.0.2,这是Docker容器的IP地址。这样,外部的连接可以被重定向到正确的容器。
通过这些规则,您的Docker容器(在这个例子中是RabbitMQ)可以接收来自外部网络的连接,并且容器之间也可以相互通信。同时,这些规则也确保了容器的网络隔离,防止了潜在的安全问题。
参考
docker网络初探
https://www.zsythink.net/archives/4409
iptables详解
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables
网友评论