该环境安装了docker ,并启动了一个容器做了端口映射
docker数据如何经过iptables
1 2 |
接着来梳理,数据经过iptables 是如何处理的。首先需要了解iptables 的组成: iptables 有4表(raw、mangle、nat、filter)5链(prerouting、input、forward、output、postrouting) |
查看各个表命令
1 2 3 4 5 6 7 8 9 10 |
#表功能解析 Filter表:过滤数据包 NAT表:用于网络地址转换(IP、端口) Mangle表:修改数据包的服务类型、TTL、并且可以配置路由实现QOS Raw表:决定数据包是否被状态跟踪机制处理 iptables -t raw -nL iptables -t mangle -nL iptables -t nat -nL iptables -t filter -nL |
5链解析
1 2 3 4 5 |
INPUT链——进来的数据包应用此规则链中的规则[过滤所有目标地址是本机地址的数据包(过滤进入主机的数据包)] OUTPUT链——外出的数据包应用此规则链中的规则[处理所有源地址是本机地址的数据包(从本机发出去的数据包)] FORWARD链——转发数据包时应用此规则链中的规则[负责转发流经主机的数据包,起转发的作用] PREROUTING链——对数据包作路由选择前应用此链中的规则 POSTROUTING链——对数据包作路由选择后应用此链中的规则 |
综上,Linux将用户规则依据功能和规则所处链路位置进行分组,“四表”存放着功能一致的规则,“五链”存放着数据包所处链路一致的规则。
这四个表分别存放什么功能的规则?如下归类:

进入本篇正题:
docker数据经过iptables 需要按顺序经过5链进行处理。看下图:

1.首先数据经过prerouting表,由于 raw、mangle表都为空,所以可以直接看nat表的prerouting 链:
nat 表
1 |
iptables -t nat -nL |
1 2 |
从下图顺序可以看到通过nat表中的prerouting链,将所有访问本地地址的数据都匹配到Docker 链; 而Docker 这里有DNAT 规则,将访问宿主机的这些端口的数据转发到了对应的容器当中172.20.x.x:port |

2. 再到input链,其中mangle表为空,直接看nat、filter表中的input链:
结合从上图(nat表)中可以看到nat 中input链以及下图(filter表)中的input链都没做任何规则
1 |
iptables -t filter -nL |

3、再接着到output链,raw、mangle为空,直接查看nat和filter表中的output 链
1 2 3 |
从上可以看到 nat 表中的output链将所有目的地址为非环回地址的本地地址数据匹配到Docker链,然后重复DNAT; 再到filter表中的output链没有做任何规则 |
4.最后到postrouting 链,mangle 为空
1 |
nat表中POSTROUTING将目标容器地址的返回数据通过MASQUERADE(自动化SNAT)做动态转发出去,而目标地址为对应容器ip的,则转发到对应容器映射的外部端口上 |
- 本文固定链接: https://www.yoyoask.com/?p=7052
- 转载请注明: shooter 于 SHOOTER 发表