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

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

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

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

- 再接着到
output链,raw、mangle为空,直接查看nat和filter表中的output链
从上可以看到 nat 表中的output链将所有目的地址为非环回地址的本地地址数据匹配到Docker链,然后重复DNAT;
再到filter表中的output链没有做任何规则
- 最后到
postrouting链,mangle为空
nat表中POSTROUTING将目标容器地址的返回数据通过MASQUERADE(自动化SNAT)做动态转发出去,而目标地址为对应容器ip的,则转发到对应容器映射的外部端口上

文章详细阐述了Docker数据如何经过iptables的处理,主要涉及NAT表的PREROUTING链进行DNAT转换,将数据转发到对应容器,接着在OUTPUT链中对本地地址的数据进行DNAT,并在POSTROUTING链中通过MASQUERADE进行SNAT动态转发,确保容器返回数据能正确发送出去。
3432

被折叠的 条评论
为什么被折叠?



