最近对netfilter进行了研究,已经搞明白了其框架结构、运行流程、以及与iptables的交互流程包括规则设置,慢慢总结一下理解的知识,记录下来,加深理解,以防忘记。
另外,虽然我只是记录我的学习过程,以免忘记,而且不成体系,但是字段说明增加了结构体的重要字段在程序里的关键点的使用时机,这个是网上资料所没有的,网上资料只说明字段含义,从不说什么时候用,什么时候赋值,在哪里赋值,而这些信息是理解功能和源码必须要明白的。
1. netfilter规则组成
netfilter的每一条规则由结构体struct ipt_entry定义,规则包含三部分:
ip头信息及控制信息 struct ipt_ip,属于标准匹配信息
match匹配相关信息 struct xt_entry_match,属于扩展match信息,可以没有
target匹配成功时执行的动作相关信息 struct xt_entry_target,为扩展target信息可以没有,但是netfilter初始化时会设置默认策略,包含了标准target,即target必须只少有一个,以决定默认数据包走向。默认策略的设置代码还需要再看看。
2. 规则匹配结构体
头文件 linux/netfilter_ipv4/ip_tables.h
struct ipt_entry 定义如下:
/* This structure defines each of the firewall rules. Consists of 3
parts which are 1) general IP header stuff 2) match specific
stuff 3) the target to perform if the rule matches */
struct ipt_entry {
struct ipt_ip ip; //标准匹配:ip头信息,源目的IP地址,掩码,网络接口等
//在匹配规则时先进行次标准匹配,作为参数传递到ip_packet_match
//函数进行匹配
/* Mark with fields that we care about. */
unsigned int nfcache; //自己理解:匹配的字段,每一位表示一个字段
//查看iptables源码时,发现设置规则时会把命令行的字段也就是规则需
//要的字段,将其宏定义值安照位或运算设置到该变量
/* Size of ipt_entry + matches */
u_int16_t target_offset; //target的偏移位置,获取和遍历target都根据该变量进行
/* Size of ipt_entry + matches + target */
u_int16_t next_offset; //一个完整的规则包含ipt_entry + matches + target三部分
//所以这三部分后就属于下一条规则ipt_entry的开始位置
//也就是说该变量表示下一个规则的偏移
/* Back pointer */
unsigned int comefrom; //也是在遍历规则时用,没仔细看细节
/* Packet and byte counters. */
struct xt_counters counters; //计数器统计字节与包数,后续再细看
/* The matches (if any), then the target. */
unsigned char el