以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 操作系统原理 』 (http://bbs.xml.org.cn/list.asp?boardid=63) ---- [转帖]linux防火墙实现技术比较 (http://bbs.xml.org.cn/dispbbs.asp?boardid=63&rootid=&id=41798) |
-- 作者:longshentailang -- 发布时间:12/30/2006 5:15:00 PM -- [转帖]linux防火墙实现技术比较 一 前言 此文是在aka(www.aka.org.cn)的一次讲座稿【12】基础之上修改而成(催稿,没办法),着重阐述linux下 的防火墙的不同实现之间的区别,以ipchains, iptables, checkpoint FW1为例。 2.0 2.1 包过滤: 2.2 代理: 2.3 状态检测: 2.4 DMZ非军事化区: 2.5 3.0 综述 3.1 ipchains ---------------------------------------------------------------- 总体来说,分为输入检测,输出检测和转发检测。但具体到代码的时候,输出检测实际分散到了几处(不同的上层协议走IP层的不同的流程): 正如ipchains项目的负责人Rusty Russell所说,在开始ipchians不久,便发现选择的检测点位置错了,最终只能暂时将错就错。一个明显的问题是转发的包在此结构中必须经过三条链的匹配。地址伪装功能与防火墙模块牵扯过于紧密,如果不详细了解其原理的话,配置规则很容易出错。 此部分详细的分析可参见我早期的一份文章【9】。 3.2 iptables A Packet Traversing the Netfilter System: --->PRE------>[ROUTE]--->FWD---------->POST------> 在每个检测点上登记了需要处理的函数(通过nf_register_hook()保存在全局变量nf_hooks中),当到达此检测点的时候,实现登记的函数按照一定的优先级来执行。严格的从概念上将,netfilter便是这么一个框架,你可以在适当的位置上登记一些你需要的处理函数,正式代码中已经登记了许多处理函数(在代码中搜nf_register_hook的调用),如在NF_IP_FORWARD点上登记了装发的包过滤功能。你也可以登记自己的处理函数,具体例子可参看【8】与【10】。 3.3 FW1 packet_type *fw_type_list=NULL; static struct packet_type fw_ip_packet_type = fwinstallin(int isinstall ) /*安装*/ for(temp = fw_type_list; temp; temp=temp->temp) for(temp = fw_ip_packet_type; temp; temp=temp->next) |
-- 作者:longshentailang -- 发布时间:12/30/2006 5:16:00 PM -- 不难看出,FW1把ip_packet_type歇载掉了,然后自己在自己的处理函数(fw_filterin)中调ip_recv。 输出的挂载和lkm的手法一样,更改dev->hard_start_xmit。dev结构在2.2版本的发展过程中变了一次,为了兼容FW1对这点也做了处理(通过检查版本号来取偏移)。 还有一款linux下的防火墙产品WebGuard(http://www.gennet.com.tw/b5/csub_webguard.html)采用的手法与FW1其非常类似。有兴趣的人可以自行研究一下。 4.0 综述 4.1 ipchains man ipfw可以看到这一段的详细解释。关键数据结构如下: 规则链用ip_chain结构来表示,缺省有input,ouptput,forward三条链。在配置规则的时候,也可以添加新的链。每条链事实上就是一组相关的规则,以链表的形式存储。 每条规则用一个ip_fwkernel结构表示: ip_fwkernel中的一个重要部分就是ip_fw,用来表示待匹配的数据包消息: 2.2内核中网络包与规则的实际匹配在ip_fw_check中进行。 4.2 iptables 一条规则分为三部分: man iptable: 2.4内核中网络包与规则的实际匹配在ip_do_table中进行。这段代码的流程在 简化代码如下: table_base = (void *)table->private->entries ... ... ... ... ... 流程: 在2.4内核中,规则本身也是可扩展的,体现可自己定义并添加新的ip_match和ip_target上。 4.2 FW1 |
-- 作者:longshentailang -- 发布时间:12/30/2006 5:17:00 PM -- 五 与应用层的交互 5.0 综述 防火墙除了内核里的功能以外,还需要在应用层有相应的的配置工具,如添加修改规则等,这就涉及如何与内核通信的问题。 5.1 ipchains man ipfw可以获得这方面的细节。 ipchains应用程序首先要需要建立一个raw socket(libipfwc.c),然后在之上调用setsockopt。 调用顺序: 5.2 iptables 5.3 FW1 static unsigned int fw_major=0; static struct file_operations fw_fops= int init_module() void cleanup_module() } fw_ioctl()用来做配置工作。 6.0 综述 6.1 ipchains 6.2 iptables 6.3 FW1 7.0 综述 7.1 ipchains 7.2 iptables 7.3 FW1 |
-- 作者:longshentailang -- 发布时间:12/30/2006 5:19:00 PM -- 八 函数指针的问题 许多初读内核的人对函数指针的应用很不适应,在netfilter中更是用的非常广泛。大量register函数的应用,使得netfilter非常的模块化,但是给初学者带来的问题也不小。 这里是linuxforum上的一份帖子,如果看代码时对函数指针的指向总是糊里糊涂的话,可借鉴一下这个思路(当然关键还是要找到指针初始化的地方): >Linux内核技术 >Linux内核技术 九 后记 十 参考文献 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
78.125ms |