http://netfilter.org/ 读后感


netfilter、iptables是什么?
     netfilter是一个linux2.4及以后内核“packet filtering Framework”的一个组件,基于并改进整合了linux2.2的ipchain和linux2.0的ipfwadm模块。netfilter是一组callback函数,在linux内核TCPIP协议栈的各个位置注册的callback函数,具体位置见后面分析。
     iptables是一个包含多条rule的set,每条rule包含iptables match和iptables actions。
     通过netfilter、iptables、connection tracking、NAT组合,组成了“packet filtering Framework”系统。
     linux内核提供了netfilter的代码,注意iptables是使用了netfilter的钩子函数、运行于用户空间的service进程,注意与netfilter区别开。
     注意旧的ipchain或者ipfwd会影响iptables的使用,估计与注册于netfilter中的优先级有关系。

“packet filtering Framework”系统功能?
     可以实现stateless、statefull的IPv4、IPv6报文过滤。
     L3网络地址转换或者出端口的重新assign。
     这个系统很容易扩展,也方便实现第三方功能。

“packet filtering Framework”系统中的netfilter和iptables可以做什么?
     Firewalls、NAT、辅助TC做policy QoS、ToS或者DSCP remark。

iptables与ipchains关系?
ipchains是kernel中比较老的模块,iptables比较新,所以功能也改善了一些。他们都使用上面图中所示的INPUT、OUTPUT、FORWARD这些chain,但是实现的功能有些区别( https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s1-iptables-differences.html)。


netfilter代码?
netfilter有四个part:
在IPv4协议栈中定义了一系列hook点;kernel中的netfilter部分代码注册了这些hook点并监听,如果有报文通过hook点,这部分代码检查是否有人(user space进程,例如iptables)注册了这个hook点,如果有则比较报文与注册的match,并执行注册的action(NF_DROP NF_ACCEPT NF_STOLEN??? NF_QUEUE);第三部分也是kernel中netfilter的代码,是将QUEUE的报文发送到用户空间;第四部分是experiment部分。

netfilter架构?
http://staff.ustc.edu.cn/~james/linux/netfilter-4.html中讲述了netfilter中结构体的具体含义。
netfilter是协议栈中的hook点,这个协议栈包括IPv4、IPv6、DECnet。典型的IPv4中的netfilter如下图。1:NF_IP_PRE_ROUTING;2:NF_IP_LOCAL_IN;3:NF_IP_FORWARD;4:NF_IP_POST_ROUTING;5:NF_IP_LOCAL_OUT。这1~5就是nf_hook_ops结构体中的hooknum。
如何使用netfilter框架:kernel中的代码会注册上面这些hook点,注册过程:nf_register_hook注册,当报文到达时候以优先级调用注册的函数;这个kernel module可以告诉netfilter框架做这些事情(  NF_ACCEPT等),如何告诉的还不知道。这里只介绍了如何使用netfilter中的hook点,其他的QUEUE、comment等部分(参考上面4个部分)见代码。

iptable系统?
packet selection system就是iptables,构建于netfilter之上。iptable代码在iptable_XXX中,包含的表与表在netfilter中的位置可以看下图、或者看下一节的图。
各个表的代码位置与解释见 http://staff.ustc.edu.cn/~james/linux/netfilter-2.html
filter表:在iptable_filter.c中,只能用于drop或者pass数据包,不能修改,注意filter所在的位置。
NAT表:见 http://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-3.html中NAT部分。NAT表与filter表的区别在于,NAT表用于第一个报文,相同connection(如何定义相同的connection,在connection tracking模块,也被称为state module)后续的报文都按照之前的方式处理。NAT分为src NAT与dst NAT,src NAT用于src ip伪装(称为  Masquerading );dst NAT用于proxy中。
mangle表:
其他人的解释如下:
注意其中mangle、nat、filter三张表,以及其位置FORWARD、INPUT、OUTPUT、PREROUTING、POSTROUTING。而且注意OUTPUT之后直接到 POSTROUTING了。这些挂载点是在linuxkernel的TCPIP协议栈中给出的。
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#TRAVERSINGGENERAL这里给出了数据包经过上面那张图的具体过程。

kernel中的iptables?
iptables只是一个table,代码在iptable.c/iptable.h。 不包含向netfilter注册的代码,这部分代码貌似在iptable_XXX.c中。iptables只是为上层用户提供一个机制,使得上层用户通过getsocket、setsocket能够修改table中的内容从而操作到数据包。

用户层的iptables?
上述的原子操作主要通过libiptc(iptables/libiptc)实现,这个库提供了add/delete/replace的原子操作,注意IPT_ALIGN(  libiptc.h)。

如何对iptables做二次开发?
基本分两部分:kernel部分与userspace部分。kernel部分的文件在iptables_XXX.c中,例如iptables_filter.c是filter表、iptables_mangle.c是mangle表、iptables_raw.c是raw表、iptables_security.c是security表、
kernel部分的开发要注意re-entrant问题。具体开发方法见( http://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO-4.html The Kernel部分)。
代码注释见 https://github.com/batmancn/linux.git中相关注释。
user space部分的开发可以参考git://git.netfilter.org/iptables中的libiptc。

connection tracking?
这个是NAT模块需要的,用于依据报文中的key识别connection。(  high-priority NF_IP_LOCAL_OUT and NF_IP_PRE_ROUTING hooks, in order to see packets before they enter the system.)。
代码在XXX_conntrack_XXX中,例如libxt_conntrack.c,因为connection tracking是可以替换的,所以放到了extension模块中。
看到,如果想开启connection tracking,付出的代价是需要将skb送到user space,但是不知道是第一笔包还是所有的,不过看代码好像是第一笔包送上来。 http://www.ibm.com/developerworks/cn/linux/l-ntflt/的2.3节讲述了NAT使用connection traffic模块的方式。

如何拓展NAT与connection tracking?


如何使用netfilter做tunnel?









猜你喜欢

转载自blog.csdn.net/batmancn/article/details/51180419