没有合适的资源?快使用搜索试试~ 我知道了~
首页linux netfilter iptables 源码分析
资源详情
资源评论
资源推荐

Linux netlter 源码分析
内容基本上来自两篇文章
《 源码分析》—(独孤九贱 )
《 实现机制和扩展技术》——(杨沙洲 国防科技大学计算机学院)
一、 IP 报文的接收到 hook 函数的调用
1.1 ip_input.c ip_rcv()函数
以接收到的报文为例,类似的还有 和
!" #"#"#
"
$
%%%"&%%定义一个 报文的数据报头
%%%'(&
%%% )*++,-./01213043251
%%%%%%&数据包不是发给我们的
%%%6,6.51-15736,51-15867640.06905&收到数据包统计量加 :
%%% + #;<,-1286.++=
%%$
"如果数据报是共享的,则复制一个出来,此时复制而出的已经和 脱离了关系 "
%%%%%6,6.51-15736,51-158676>65.-4>5&
%%%%%&
%%?
%%@ A #B
%%%%&对数据报的头长度进行检查,
%
%%+ )*&取得数据报的头部位置
%)*CDEE)*@+F版本号或者头长度不对,
%%%&头长度是以 F 字节为单位的,所以 D 表示的是 (G 字节
%@ A #)*"F
%%%&
%
%AH"#)*
%%%%&检查报文的检验和字段
%+)*&
% )*CEEC)*"F
%%%&整个报文长度不可能比报头长度小
% AA #
%$对数据报进行裁减,这样可以分片发送过来的数据报不会有重复数据
%%6,6.51-15736,51-158676>65.-4>5&
%%&
%?

%%<322/,<601#<6,,4042=16;# ##=#
%%%%%%%%&通过回调函数调用
%6,6.51-15736,51-1586763>4044245&
%%%%%%% &丢掉数据报
%%%%%%%014I>42,&
?
1.2 include/linux/netlter.h NF_HOOK 宏
J.2<6;01<6104>07=;
J<322/## ### K
## ####6186
J<322/134053
J
J<322/## ### K
ALMNMN K
O K
## ####6186
J<322/134053## #### K
ALMNMN K
O K
## ####
J
"如果 M,<601NM<6,<24P-4>N所指向的链表为空(即该钩子上没有
挂处理函数),则直接调用 ;否则,则调用
转入 的处理。 "
1.3 net/core/netlter.c nf_kook_slow()函数
## !"" #
%%%%%%%%%%"#
%%%%%%%%%%"#
%%%%%%%%%%" !"#
%%%%%%%%%%
$
%%%%"A&

%%%%&
%%%%+G&
%%%%&
%%%%"取得对应的链表首部"
%%%%A+LMNMN&
%%%%"调用对应的钩子函数"
%%%%+LMNMN# ###
%%%%%%%%%%%%%%%%#LA##&
%%%%"判断返回值,做相应的处理"
++<-..0,1EE++<512,$
%%%%%+:&%"前面提到过,返回 :,则表示装继续调用 函数指针"
%%%%%&
%%?++<>42,$
%%%% " &%%%%%%%%"删除数据包,需要释放 "
%%%%%+)0,048&
%%?++<Q=0=0$
%%%%%<>07=;R9+Q=0=0KR&
%%%%%@S" #A#####
%%%%%%%%&
%%%?
%%%%&
%%%%&
?
1.4 net/core/netlter.c nf_iterate()函数
"#
!"" #
#
"#
"#
""#
" !"#
$
"
"1A
" AA
"

"依次调用指定 点下的所有 )*"函数,这些 里
有 表注册的,有 A 表注册的,等等。
函数是一个 循环的宏,当调用结点中的 函数后,
根据返回值进行相应处理。如果 函数的返回值是
<Q=0=0#<5120#<>42, 时,函数返回该值;如果返回值是 <40,0-1 时,
则跳到前一个结点继续处理;如果是其他值,由下一个结点继续处理。如果整条链表处理
完毕,返回值不是上面四个值,则返回 <-..0,1。"
"#$
"A+""&
*A)*
&
A)*# ###$
<Q=0=0
<Q=0=0&
<5120
<5120&
<>42,
<>42,&
<40,0-1
"+")*&
&
?
?
<-..0,1&
?
二、ipt_table 数据结构和表的初始化
2.1 include/linux/netlter_ipv4/ip_tables.h struct ipt_table 表结构
$
&
"表链 "
AM6,11-708-I-800N&
"表名,如RR、RR等,为了满足自动模块加载的设计,包含该表的模块应命名为
TAT"

" &
"表模子,初始为 "
&
"位向量,标示本表所影响的 322/"
&
"读写锁,初始为打开状态 "
"&
" 的数据区,见下 "
A"A&
"是否在模块中定义 "
?&
2.2 struct ipt_table_info 是实际描述表的数据结构 ip_tables.c
$
B&
"表大小 "
A &
"表中的规则数 "
&
"初始的规则数,用于模块计数 "
M<6,=8322/5N&
"记录所影响的 322/ 的规则入口相对于下面的 变量的偏移量 "
UM<6,=8322/5N&
"与 相对应的规则表上限偏移量,当无规则录入时,相应的 和
U 均为 G"
MGN&
"规则表入口 "
?&
2.3 include/linux/netlter_ipv4 规则用 struct ipt_entry 结构表示,包含匹
配用的 IP 头部分、一个 Target 和 0 个或多个 Match。由于 Match 数不定,所以一条
规则实际的占用空间是可变的。结构定义如下
$
&
"所要匹配的报文的 6, 头信息 "
&
剩余38页未读,继续阅读














安全验证
文档复制为VIP权益,开通VIP直接复制

评论2