WEB开发网
开发学院网络安全防火墙 linux防火墙实现技术比较 阅读

linux防火墙实现技术比较

 2006-04-03 12:36:40 来源:WEB开发网   
核心提示: > I believe it does exactly what I want: Installing a temporary> "backward"-rule to let packets in as a response to an> outgoi

> I believe it does exactly what I want: Installing a temporary

> "backward"-rule to let packets in as a response to an

> outgoing request.

7.2 iptables

在2.4内核中,基于状态的检测已经实现,利用的是connection track模块。此模块检查所有到来的数据包,将得到的状态(enum ip_conntrack_status)保留在sk_buff结构中(即skb->nfct,可通过ip_conntrack_get()得到)。

在规则中要指明状态信息(作为一个ipt_match),既实际上仍是比较每一条规则。从效率上,这种处理方式感觉不如下面FW1采用的方式好。

7.3 FW1

这段的代码没有做分析,但有一些文章通过黑箱操作的办法“猜测“出了它的实现原理,如【1】。除规则表以外,FW1另外维护一份状态表。当一个新的连接发生的时候,FW1与规则表配备,如果允许通过的话,则在状态表中建立相应表项。以后的数据过来的时候首先匹配状态表,如果它属于一个连接,便允许通过,而不再检查规则表。

草草看了一下BSD下的防火墙ipfilter的howto,感觉它的实现与FW1基本相同。

八 函数指针的问题

许多初读内核的人对函数指针的应用很不适应,在netfilter中更是用的非常广泛。大量register函数的应用,使得netfilter非常的模块化,但是给初学者带来的问题也不小。

这里是linuxforum上的一份帖子,如果看代码时对函数指针的指向总是糊里糊涂的话,可借鉴一下这个思路(当然关键还是要找到指针初始化的地方):

>Linux内核技术

>herze (stranger ) 01/15/01 02:54 PM

>高手指点:PPP的发送函数在那里?

>在Linux内核2.4.0中对于PPP数据包已经打好的包,内核中的ppp_generic.c文件中发送的流程好像如下

>ppp_file_write()->ppp_xmit_process()->ppp_push()(可能也由其它的发送流程,但是最后都是

>用到了ppp_push())这个函数,而这个函数调用了一个struct channel中struct ppp_channel中的

>struct ppp_channel_ops 中的一个函数指针

>int (*start_xmit)(struct ppp_channel *, struct sk_buff *)来进行发送的,但是下面我就不明白了。

>虽然在drivers/char/cyclades.c和drivers/char/serial167.c中找到了

>start_xmit( struct cyclades_port *info )但是函数说明都不相同。

>请教:

>int (*start_xmit)(struct ppp_channel *, struct sk_buff *)

>到底这个函数指针是指到了什么地方?

>是不是和具体的硬件有关,但是我怎么在内核中找不到对应的函数?

>Linux内核技术

>yawl (stranger ) 01/15/01 11:31 PM

>思路这样 [re: herze]

>内核中常有这样的类似处理,查找这种函数指针的一个好办法,就是找那种结构的实例,对于你的问题,就是找

>ppp_channel_ops,最终会找到async_ops(ppp_async.c)和sync_ops(ppp_synctty.c),没看过这块的

>具体代码,不敢多说,但思路如此。

九 后记

尽管此文中是在【12】的基础之上完成的,但是在内容上并未完全包括前者,感兴趣的朋友在那篇文章上可能能找到一些有趣的原始信息。由于时间关系,本文在此主题上的探讨仍显粗浅,对此只能说抱歉了。

上一页  5 6 7 8 9 10 

Tags:linux 防火墙 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接