1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | struct ipt_table { struct list_head list; /* 表链 */ char name[IPT_TABLE_MAXNAMELEN]; /* 表名,如"filter"、"nat"等,为了满足自动模块加载的设计, /* 包含该表的模块应命名为iptable_'name'.o */ struct ipt_replace *table; /* 表模子,初始为initial_table.repl */ unsigned int valid_hooks; /* 位向量,标示本表所影响的HOOK */ rwlock_t lock; /* 读写锁,初始为打开状态 */ struct ipt_table_info *private; /* iptable的数据区,见下 */ struct module *me; /* 是否在模块中定义 */ }; struct ipt_table_info是实际描述表的数据结构(net/ipv4/netfilter/ip_tables.c): struct ipt_table_info { unsigned int size; /* 表大小 */ unsigned int number; /* 表中的规则数 */ unsigned int initial_entries; /* 初始的规则数,用于模块计数 */ unsigned int hook_entry[NF_IP_NUMHOOKS]; /* 记录所影响的HOOK的规则入口相对于下面的entries变量的偏移量 */ unsigned int underflow[NF_IP_NUMHOOKS]; /* 与hook_entry相对应的规则表上限偏移量,当无规则录入时, /* 相应的hook_entry和underflow均为0 */ char entries[0] ____cacheline_aligned; /* 规则表入口 */ }; |
1 2 3 4 5 6 7 8 9 10 11 | static struct ipt_table packet_filter = { { NULL, NULL }, // 链表 "filter", // 表名 &initial_table.repl, // 初始的表模板 FILTER_VALID_HOOKS,// 定义为((1 << NF_IP6_LOCAL_IN) | (1 << NF_IP6_FORWARD) | (1 << NF_IP6_LOCAL_OUT)), 即关心INPUT、FORWARD、OUTPUT三点 RW_LOCK_UNLOCKED,// 锁 NULL, // 初始的表数据为空 THIS_MODULE // 模块标示 }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | struct ipt_entry { struct ipt_ip ip; /* 所要匹配的报文的IP头信息 */ unsigned int nfcache; /* 位向量,标示本规则关心报文的什么部分,暂未使用 */ u_int16_t target_offset; /* target区的偏移,通常target区位于match区之后,而match区则在ipt_entry的末尾; 初始化为sizeof(struct ipt_entry),即假定没有match */ u_int16_t next_offset; /* 下一条规则相对于本规则的偏移,也即本规则所用空间的总和, 初始化为sizeof(struct ipt_entry)+sizeof(struct ipt_target),即没有match */ unsigned int comefrom; /* 位向量,标记调用本规则的HOOK号,可用于检查规则的有效性 */ struct ipt_counters counters; /* 记录该规则处理过的报文数和报文总字节数 */ unsigned char elems[0]; /*target或者是match的起始位置 */ } |
1 | iptables -A FORWARD -j DROP; |
1 2 3 4 5 6 7 8 | setsockopt( sockfd, //通过socket(TC_AF, SOCK_RAW, IPPROTO_RAW)创建的套接字, //其中TC_AF即AF_INET TC_IPPROTO, //即IPPROTO_IP SO_SET_REPLACE, //即IPT_SO_SET_REPLACE repl, //struct ipt_replace结构 sizeof(*repl) + (*handle)->entries.size) //ipt_replace加上后面的ipt_entry |
1 2 3 4 5 6 | NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, dev2, ip_forward_finish) NF_HOOK是这样一个宏(include/linux/netfilter.h): #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \ (list_empty(&nf_hooks[(pf)][(hook)]) \ ? (okfn)(skb) \ : nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn))) |
1 | struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]; |
1 2 3 4 5 6 7 8 9 10 11 12 13 | struct nf_hook_ops { struct list_head list; //链表 nf_hookfn *hook; //处理函数指针 int pf; //协议号 int hooknum; //HOOK号 int priority; //优先级,在nf_hooks链表中各处理函数按优先级排序 }; |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |