1. netfilter
指的是内核中的netfilter框架,这个框架在协议栈中增加了5个hook,并维护内核模块在这些hook的地方注册的callback函数。
1.1. iptables和netfilter的关系
iptables是用户空间的一个程序,通过一定机制和内核的netfilter打交道,负责往hook上配置callback函数。
2. netfilter的5个hook
2.1. 数据包常见的三种hook路径
● 本机收到的,目的IP是本机的package:NF_IP_PRE_ROUTING -> NF_IP_LOCAL_IN
● 本机收到的,目的IP不是本机的package:NF_IP_PRE_ROUTING -> NF_IP_FORWARD -> NF_IP_POST_ROUTING
● 本机发出去的package:NF_IP_LOCAL_OUT -> NF_IP_POST_ROUTING
3. hook回调函数:rule
向hook注册的回调函数就是rule,rule = match target
示例:
#允许ftp服务的21端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT
3.1. match
● -p tcp:--protocol tcp协议
● --dport 21:--destination-port,目的port是21
3.2. target
● -j ACCEPT :接收此package
常见的target有:
● DROP丢弃
● RETURN跳出当前chain
● ACCEPT通过
● QUEUE放入用户空间队列
● custom-chain:跳转到用户自定义的chain
4. table:对rule进行分类
rule具备不同的能力,根据rule的能力分为5类,如:
● FIlter表:rule用于过滤
● NAT表:rule用于地址转换
● Mangle表:rule用来修改IP数据包头,如修改TTL
● Raw表:rule给package打标记
● Security表:rule和SELinux有关
5. hook如何调rule:hook调chain,chain将rule组织成链
rule有很多很多,hook只有5个点位,hook如何调这么多的rule呢?
答:将rule组织成5条链,每条链对应一个hook
table-chain-rule关系:
6. 自定义chain
创建自定义chain时需要指定,在哪个table里创建,默认是在filter表。
在nat表里创建自定义chain
iptables -t nat -N CUSTOM_NAT
hook无法直接调用自定义chain,hook调用5大chain,5大chain里的rule通过jump到自定义的chain。
7. 总结
netfilter包的处理流程汇总如下:
● 包按netfilter框架分别经过5个hook点
● 每个hook点调用自己对应的官方chain
● 官方chain串联的rule按类别分散在5张表里
● 官方chain按照预先定义的表的顺序来执行rule
● 表里的rule可以jump到表里自定义的chain