250 likes | 541 Views
ANN/Li Yu Netfilter. Linux网络协议栈概况 Netfilter Iptable 连接跟踪 NAT. Linux networking protocol stack overview. ANN/Li Yu Netfilter. ANN/Li Yu Netfilter. ANN/Li Yu Netfilter. Netfilter 什么是netfilter? Netfilter如何工作? Iptable, netfilter, 连接跟踪及NAT. Play source code. 什么是netfilter?
E N D
ANN/Li YuNetfilter • Linux网络协议栈概况 • Netfilter • Iptable • 连接跟踪 • NAT
Linux networking protocol stack overview ANN/Li YuNetfilter
ANN/Li YuNetfilter • Netfilter • 什么是netfilter? • Netfilter如何工作? • Iptable, netfilter, 连接跟踪及NAT. • Play source code.
什么是netfilter? 只是在Linux协议栈上的各层接合点上的一个hook注入机制。举个例子,当内核检测到接收到的数据包是到达本机的,就会调用内核函数ip_local_deliver(),这个函数不会直接处理相应的事务,而是主动给Netfilter一次执行hook的机会。 这个机制简单,但提供了足够的灵活性,我们可以利用它过滤、修改、抛弃、统计数据包,甚至凭空注入新的数据包。事实上,我们甚至几乎可以在Netfilter上实现另一套Linux协议栈。 ANN/Li YuNetfilter
Netfilter如何工作? Netfilter的工作方式非常简单,它的主要功能入口是通过NF_HOOK宏,以下是一个例子: int ip_local_deliver(struct sk_buff *skb) { /* 这里省略若干代码 */ return NF_HOOK(PF_INET, NF_INET_LOCAL_IN, skb, skb->dev, NULL, ip_local_deliver_finish); } ANN/Li YuNetfilter
Iptable, netfilter,连接跟踪以及NAT Iptable, 连接跟踪,NAT都在用netfitler框架提供的hook功能实现的扩展。 内核中的Iptable的功能是根据数据包在协议栈上出现的位置,方向和所管理员指定的配置完成对数据包的匹配和目标操作。防火墙一般在filter表内完成,网络地址转换的准备工作在NAT表内完成,此外,还有mangle表和security表。 Linux的防火墙功能之所以强大,就是因为它不仅仅是一个包过滤系统,而且网络连接的状态对数据包判定也有所影响,这势必需要在内核里维护网络连接的状态信息,这个功能就是由“连接跟踪”子系统完成的。注:这里的连接并不是局限于TCP/SCTP这样的有状态协议。 iptable中的nat表完成的只是NAT中的准备工作,即计算出了转换后的地址,具体转换是在iptable之外完成的。而且,NAT功能不仅依赖于iptable,也依赖于“连接跟踪”。 ANN/Li YuNetfilter
It‘s time to play source code! ANN/Li YuNetfilter
ANN/Li YuNetfilter • Iptable • 基本术语及其数据结构 • 数据结构的组织 • Play source code: (1)初始化过程 • Play source code: (2)核心处理过程
ANN/Li YuNetfilter • 基本术语及其数据结构 • 规则 → ipt_entry,”包模式”保存于ipt_entry的ip成员内; • 匹配 → ipt_match • 目标 → ipt_target • 表 → xt_table和xt_table_info • 其他: ipt_replace
数据结构的组织 Ipt_replace和xt_table_info的entries成员保存的是一个ipt_entry数组 ”匹配要求”和“目标处理”保存于ipt_entry的elems成员内,这又是一个结构数组。这个数组以ipt_match序列开始,之后是ipt_target序列。Ipt_target序列以字节ipt_entry->target_offset开始。 Ipt_replace和xt_table_info的成员hook_entry[NF_INET_NUMHOOKS]保存的是一系列entries的偏移。例如,hook_entry[NF_INET_LOCAL_IN]保存着LOCAL_IN链上需要处理的第一个iptable规则的偏移。Iptables的核心函数ipt_do_table()会从这个偏移上找到的iptable规则开始处理。请注意,默认hooks表中有许多hook其实只是ipt_do_table()的包装函数,它们使用不同的iptable table调用它。 Ipt_replace和xt_table_info的成员underflow[NF_INET_NUMHOOKS]保存的是也一系列entries的偏移。有些iptable target可能返回IPT_RETURN,这表明这要求内核返回到上一个处理的规则上,这个回溯关系事实上是一条“链栈”。而每个chain都可以有这样一个链栈,underflow[]记录的就是这个栈的栈底偏移。 ANN/Li YuNetfilter
ANN/Li YuNetfilter 数据结构的组织 图1 整 “Linux netfilter机制分析”PDF。 图2 整补充图,现场手工绘制,不到场的看不着喽!
ANN/Li YuNetfilter • Source code is our good friend, huh? So do not let it live alone!
ANN/Li YuNetfilter • 连接跟踪 • 抽象网络连接状态 • 重要数据结构 • Play source code: tracking and confirm
ANN/Li YuNetfilter • 抽象连接状态 • NF_CT_ESTABLISHED:数据报属于已经完全建立的连接 • NF_CT_RELATED: 数据报属于一个新的连接,但此连接与一个现有连接相关(预期连接),或者是ICMP错误 • NF_CT_NEW:数据报属于一个新的连接 • NF_CT_IS_REPLY:数据报属于一个连接的回复,不单独使用,两种用法:ESTABLISHED+IS_REPLY,RELATED+IS_REPLY • 这里的状态与TCP无一一对应关系
ANN/Li YuNetfilter • 抽象连接状态
ANN/Li YuNetfilter • 重要的数据结构
ANN/Li YuNetfilter • 重要的数据结构 实际上,连接跟踪中涉及到的数据结构很多,画图太累了,还是用代码说明数据结构最直接,再说我也挺LAN的~
ANN/Li YuNetfilter • Play source code • Defragment IP datagram first if need. • Tracking a connection operation. • Confirm a connection if need.
ANN/Li YuNetfilter • NAT • NAT的概念过程 • Linux如何实现NAT • 重要数据结构 • Play source code
ANN/Li YuNetfilter • NAT的概念过程 • SNAT中的S,和DNAT中的D是什么意思,地球人都知道。 • 可是实现SNAT还需要转换D地址,同理,DNAT的实现也得转换S地址,为什么呢? • 实现NAT功能需要完整的IP数据报。 • 实现NAT功能需要连接跟踪功能。 • SNAT,DNAT典型场景。
ANN/Li YuNetfilter • Linux如何实现NAT • 连接跟踪即已经要求IP分片重组了。 • Iptable的Nat表内保存了NAT规则。 • 使用连接跟踪状态表保存地址转换关系。
ANN/Li YuNetfilter • 重要数据结构 • 前面都已经提到过了。 • 懒惰,是一种美德,所以,请参考之前的图片。
ANN/Li YuNetfilter • Source code is alive, they need your understanding.
ANN/Li YuNetfilter • Switch to next guy, or • Go to FB directly now!