该环境安装了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
的,则转发到对应容器映射的外部端口上