《Netfilter实现机制和扩展技术.docx》由会员分享,可在线阅读,更多相关《Netfilter实现机制和扩展技术.docx(23页珍藏版)》请在优知文库上搜索。
1、1.inuxNetfilter实现机制和扩展技术本文从1.inUX网络协议栈中报文的流淌过程分析起先,对1.inUX24.x内核中最流行的防火墙构建平台NetfiItCr进行了深化分析,着重介绍了如何在NCtfiIte1.iPlabIeS机制中进行应用扩展,并在文木给出一个利用扩展Neifille1.iptables实现VPN的方案.2.4.1, 内核相对于2.2.乂在Ip协议栈部分有比较大的改动,Nelmte1.iPlUbleS更是其一大特色,由于它功能强大,并且及内核完备结合,因此快速成为1.inUX平台卜进行网络应用扩展的主要利蹲,这些扩展不仅包括防火墙的实现一这只是NetfiIte1.
2、iPtabIeS的基本功能一还包括各种报文处理工作(如报文加密、报文分类统计等),甚至还可以借助NetfiIte1.iPtableS机制来实现虚拟专用网(VPN。本文将致力于深化剖析NeIfilIer-ipiables的组织结构,并具体介绍如何对其进行扩展。Netfilter目前已在ARP、IPv4和IPv6中实现,考虑到IPv4是目前网络应用的主流,本文仅就IPv4的Notfiker实现进行分析.要想理解NCtfiIter的工作原理,必需从对1.inUXIP报文处理流程的分析起先,NCtfiker正是将自己紧密地构建在这一流程之中的。1. IPPacketFlowingIP协议栈是1.inU
3、X操作系统的主要组成部分,也是1.inUX的特色之一,素以高效桎定著称。Netfilter及IP协议枝是亲密结合在一起的,要想理解Netfilter的工作方式,必需理解IP协议栈是如何对报文进行处理的。下面将通过个经由IPTunnel传输的TCP报文的流淌路径,简要介绍一下IPv4协议栈(IP乂)的结构和报文处理过程。IPTUnnel是2.0.X内核就已经供应f的虚拟局域网技术,它在内核中建立一个虚拟的网络设备,聘正常的报文(其次层)封装在IP报文中,再通过TCP/IP网络进行传送。假如在网关之间建立IPTUnne1.并协作ARP报文的解析,就可以实现虚拟局域网。我们从报文进入IPTunnel
4、设备打算发送起先。1.1 报文发送ipip模块创建tunnel设备(设备名为tunl(tunlx)时,设置报文发送接口(hard_StarjXmit)为ipip_tunn。1.XInit(),流程见下图:图1报文发送流程1. 2报文接收报文接收从网卡驱动程序起先,当网卡收到一个报文时,会产生一个中断,其邪动程序中的中断服务程序将调用确定的接收函数来处理。以下仍以IPTunnel报文为例,网卡驱动程序为de4x50流程分成两个阶段:驶动程序中断股务程序阶段和IP协议栈处理阶段,见下图:图2报文接收流程之驱动程序阶段图3报文接收流程之林议栈阶段假如报文须要转发,则在上图红筋头所指处调用ipforw
5、ard。:图4报文转发流程从上面的潦程可以看出,NetfiIter以NFHooK。的形式出现在报文处理的过程之中。2. NetfilterFrameNetfilter是2.4.x内核引入的,尽管它供应了对2.0.x内核中的ipfw以及2. 2.X内核中的ipchains的兼容,但事实上它的工作和意义远不止于此。从上而对IP报文的流程分析中可以看出NetfiIter和IP报文的处理是完全结合在一起的,同时由下其结构相时独立,又是可以完全剥离的.这种机制也是Netfi1ter-iptabIes既高效又敏捷的保证之一。在剖析NeIfiIIer机制之前,我们还是由浅入深的从NeIfiller的运用起先
6、。2. 1编译在NeIWOrkingOptions中选定NetWOrkpacketfiltering项,并将其下的IP:NetfilterConfiRUiations小节的全部选项设为MOdUIe模式。编译并安装新内核,然后重启,系统的核内NetfiIter就配置好了。以下对相关的内核配置选项稍作说明,也可以参阅编译系统自带的Help:Kcrne1/1.sernet1inksocket建立,一类PF_NET1.INK套接字族,用于核心及用户进程通信.当Netfilter须要运用用户队列来管理某些报文时就要运用这一机制:Networkpacketfiltering(replacesipchain
7、s)1NeIfiIIer主选项,供应Netfilter框架:(Networkpacketfilteringdebugging】NeIfiner主选项的分支,支持更具体的NetfiIter报告:IP:NetfilterConfiguration)此节F是netfilter的各种选项的集合:Connectiontracking(requiredformsqNT)连接跟踪,用于基于连接的报文处理,比如NAT:IPIablessupport(requiredforilleringmsqNT)这是NemIler的框架,NAT等应用的容版:ipchains(2.2-style)Suppoitlipchai
8、ns机制的兼容代码,在新的Netfilter结构上实现了ipchains接口:ipfwadm(2.O-style)SUPPOrt】2.0内核防火墙ipfwadm我容代码,基于新的NetfiIter实现。2.2 总体结构Netfilter是嵌入内核IP协议栈的一系列调用入口,设置在报文处理的路径上.网络报文依据来源和去向,可以分为三类:潦入的、流经的和流出的,其中流入和流经的报文须要经过路由才能区分,而流经和流出的报文则须要经过投递,此外,流经的报文还有个FORWARD的过程,即从个NIC转到另个NIC。Netfilter就是依据网络报文的潦向,在以下几个点插入处理过程:NFJPPRE.ROUT
9、ING,在报文作路由以前执行:NFJP_FORWARD,在报文转向另一个NIC以前执行:NFJPPOSTROUTING,在报文流出以前执行;NFIP1.OCA1.IN,在流入本地的报文作路由以后执行;NIIP1.OCA1.OVT,在本地报文做流出路由前执行。如图所示:图5NetfilterHOoK位置Netfilter框架为多种协议供应了一套类似的钩子(HOOK),用一个SlrUClIiStjIeadnf_hooksNPROTONFJ!AXHooKS二维数组结构存储,一维为协议族,二维为上而提到的各个调用,口。每个希望嵌入Netfilter中的模块都可以为多个协议族的多个调用点注册多个钩子函数
10、(HK),这些钩子函数将形成一条函数指针链,每次协议栈代码执行到NFHoOKo函数时(有多个时机),都会依次启动全部这些函数,处理参数所指定的协议枝内容。每个注册的钩子函数经过处理后都将返回下列值之一,告知NelfilIer核心代码处理结果,以便对报文实行相应的动作:NFACCEPT:接着正常的报文处理;NFDROP:将报文丢弃:NISTO1.EN:由钩子函数处理了该报文,不要再接着传送:NF_QUEUE:将报文入队,通常交由用户程序处理:NEREPEAT:再次谢用该钩了函数。2.3 IPTablesNCtfilt。1.iPtab1。S由两部分组成,一部分是NetfiIter的钩子,另一部分则
11、是知道这些钩子函数如何工作的一套规则一这些规则存储在被称为iptables的数据结构之中。钩子函数通过访问iptables来推断应当返回什么值给Netfilter框架。在现有(kernel)中已内建了三个iptables:filter-natflmangle.绝大部分报文处理功能都可以通过在这些内建(built-in)的表格中填入规则完成:filter,该模块的功能是过注报文,不作任何修改,或者接受,或者拒绝。它在NFP_1.OCA1.lN、NFIP_FORWARD和NF/P_1.OCA1._OUT三处注册了钩子函数,也就是说,全部报文都将经过filler模块的处理。nat,网络地址转换(Ne
12、tworkAddressTranslation),该模块以COnneCtionTraCking模块为基础,仅对每个连接的第一个报文进行匹置和处理,然后交由ConnectionTraCking模块将处理结果应用到该连接之后的全部报文。nat在NEIP_PRE.ROUTING、NFP_POST_RoUTING注册了钧了函数,假如须要,还可以左NFIP_1.OCA1.jN和NFlP1.OCAM)UT两处注册钩子,供应对本地报文(出/入)的地址转换。nal仅对报头的地址信息进行修改,而不修改报文内容,按所修改的部分,nat可分为源NAT(SNAT)和目的MT(DNAT)两类,前者修改第个报文的源地址部
13、分,而后者则修改第个报文的目的地址部分。SNAT可用来实现IP伪装,而DNAT则是透亮代理的实现基础.mangle,属于可以进行报文内容修改的IPTables,可供修改的报文内容包括MARK、ToS、TT1.等,mangle表的操作函数嵌入在NetfiIter的NFJPPKERO1.TING和NFlP1.OCA1.OUT两处。内核编程人员还可以通过注入模块,调用NeIfilIer的接口函数创史新的iptables。在卜面的Netfi1ter-iptables应用中我们将进一步接触NetfiIter的结构和运用方式“2.4 Netfilter配置工具iptables是特地针对2.4.X内核的Ne
14、tfiltCr制作的核外配置工具,通过socket接口对Netfilter进行操作,创建socket的方式如下:socketCrjAF,SOCK_RAW,IPPR0T0RAW)其中TjAF就是AFNET0核外程序可以通过创建个原始IP套接字”获得访问Netfilter的句柄,然后通过getsockopt()和SetSoCkoPt()系统调用来读取、更改NelfilIer设置,详情见下。iptables功能强大,可以对核内的表进行操作,这些操作主要指对其中规则链的添加、修改、清除,它的吩咐行参数主要可分为四类:指定所操作的IPTabIeS(-t):指定对该表所进行的操作(-A、-D等):规则描述
15、和也配:对iptables吩咐本身的指令1.n等)。在下面的例子中,我们通过iptables将访问.1的53端口(DNS)的TCP连接引导到192.168.0.1地址上。iptables-tnat-APREROUTING-pTCP-ieth-d.1-dport53-jDNAT-to-destination192.168.0.1由于iptables是操作核内Netfilter的用户界面,有时也把Netfilteriplables简称为iplables,以便及ipchains、ipfwadm等老版本的防火墙并列。2. 5iptables核心数据结构在1.inUX内核里,iptables用StrUCtipt_table表示,定义如下(include/1inux/netfilter_ipv4/ip_tables.h):structipttablestructlist_headlist:*囊链*/charnameIPTTAB1.EXNME1.EN;*表名,如filter、nat”等,为了满意自动模块加载的设计,包含该表的模块应命名为iptable.name.o*/structiptreplace*table:/*表模子,初始为initialtable,repl*/unsignedintvalidhooks;/*位向量,标示本表所影响的HOO