【iptables】服务器上启动docker容器后iptable

2024-03-31  本文已影响0人  Bogon

实验环境

服务器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链规则解读

  1. Chain INPUT: 这个链是用来处理进入本机的数据包。在您的规则中,有一条策略是ACCEPT,表示允许所有进入本机的数据包。另外,还有一些针对DOCKER-USER链的规则,这些规则允许从任何源IP到任何目的IP的数据包,这可能是为了满足某些特定的容器网络需求。

  2. Chain FORWARD: 这个链处理在本机转发的数据包。您的规则中包含了几条DOCKER相关的规则,这些规则允许从docker0网络接口出去的数据包,并且要求这些数据包的目的地是与docker0网络接口相关联的。同时,还有一些规则允许从docker0接口出去的数据包,并且这些数据包的源和目的地都是docker0接口。这些规则确保了容器之间的网络流量可以正常转发。

  3. Chain OUTPUT: 这个链处理从本机出去的数据包。在这里,您的规则允许所有从docker0接口出去的数据包,这可能是为了允许容器向外发送数据。

  4. Chain DOCKER: 这个链是专门为Docker容器设置的,它包含了两条规则。第一条规则允许从非docker0接口出去的TCP连接,目标端口是15672(RabbitMQ管理界面端口)和5672(RabbitMQ默认端口)。第二条规则是针对从docker0接口出去的连接,同样允许目标端口是15672和5672的TCP连接。

  5. Chain DOCKER-ISOLATION-STAGE-1 和 DOCKER-ISOLATION-STAGE-2: 这些链是为了实现Docker容器的网络隔离。STAGE-1链允许从docker0接口出去的数据包,而STAGE-2链则会丢弃所有从docker0接口出去的数据包,除非这些数据包已经在STAGE-1链中被处理过。

  6. Chain DOCKER-USER: 这个链包含了一条规则,允许所有数据包通过。

nat链规则解读

  1. Chain PREROUTING: 这个链在路由决定之前处理进入的数据包。您的规则中有一个DOCKER规则,它将所有进入的数据包,除了目的地是本地地址的,都重定向到本地地址。这可能是为了将进入的数据包重定向到Docker容器。

  2. Chain INPUT: 这个链处理进入本机的数据包。在这里,有一个规则,它将所有不是来自本地地址的数据包重定向到本地地址。这可能是为了处理那些需要被NAT转换的数据包。

  3. Chain OUTPUT: 这个链处理从本机出去的数据包。在这里,有一个规则,它将所有不是发往本地地址的数据包重定向到本地地址。这可能是为了处理那些需要被NAT转换的数据包。

  4. Chain POSTROUTING: 这个链在路由决定之后处理出去的数据包。在这里,有一个MASQUERADE规则,它将所有从非docker0接口出去的数据包的源地址伪装成docker0接口的IP地址。这允许容器通过NAT网关访问外部网络。

  5. 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

上一篇 下一篇

猜你喜欢

热点阅读