免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ok_lin
打印 上一主题 下一主题

[网络管理] iptables match顺序问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-01-19 09:26 |只看该作者

回复 #10 zhoutao0712 的帖子

能靠前就靠前,需建链就建链。
其他不敢乱说。

论坛徽章:
0
12 [报告]
发表于 2010-01-19 10:42 |只看该作者
和 module 前后顺序有关
iptables 匹配时会根据 modules 的链表逐一使用模块匹配
如果 m1 m2 m3 所耗 CPU 不同,建议把最耗 CPU 的放在最后面,把最可能过滤掉数据的放在最前面

例如有 3 个模块,time、layer7、tos
需要把 BT 协议,在周日使用时、TOS 值是 128 的数据包阻断(仅是一个例子,未必有实用价值)
那么合理的顺序是 -m tos -m time -m layer7

因为 tos 检测最简单,time 可以滤掉 1/7 的数据(因为一周内只有一个“周日”),最后都符合的采取检查是否是 BT 协议

论坛徽章:
0
13 [报告]
发表于 2010-01-19 10:45 |只看该作者
原帖由 wendaozhe 于 2010-1-19 09:26 发表
能靠前就靠前,需建链就建链。


受教了。

找到一个 源自<<Linux Firewalls, Third Edition>>有关于iptables优化的建议:



http://blog.chinaunix.net/u1/47765/showart_374120.html

论坛徽章:
0
14 [报告]
发表于 2010-01-19 10:58 |只看该作者

回复 #12 platinum 的帖子

这样理解:

把最简单,最容易分辨数据包是否匹配的match  放在一条规则的前面。

而把使用最频繁的 而且 -j ACCEPT或DROP的规则放在 一个 链的前面。

建立自定义链 使得一个数据包“遍历”整个iptables的规则数最少。

论坛徽章:
0
15 [报告]
发表于 2010-01-20 10:36 |只看该作者
原帖由 platinum 于 2010-1-19 10:42 发表
和 module 前后顺序有关
iptables 匹配时会根据 modules 的链表逐一使用模块匹配
如果 m1 m2 m3 所耗 CPU 不同,建议把最耗 CPU 的放在最后面,把最可能过滤掉数据的放在最前面

例如有 3 个模块,time、la ...



iptables 匹配时会根据 modules 的链表逐一使用模块匹配,应该是没有错的,但不一定是m1 m2 m3, 因为m2可能在m1之前先加载了,那么匹配时的顺序应该是
m2 m1 m3。
另外我在2.4内核,iptables-1.2.*中测试,具体的匹配顺序跟iptables中一个叫initext.c的文件相关。各位大侠能帮我说明一下吗。(我的iptables在编译时不生成共享库)

后查找发现:
...
#ifdef NO_SHARED_LIBS
        init_extensions();
#endif
以上代码为没有定义共享库的话,要执行init_extensions()。这里我们假设不使用共享库,所以调用该函数。该函数实在执行make的时候extensions/自动生成的initext.c中的函数。在该函数里调用了所有扩展模块的init函数。
注册所有的match,以及标准和扩展的target。
所有的match和target都加入到iptables.c中对应的全局链表之中。以后find_match和find_target是就是搜索的这两个链表。
/* Keeping track of external matches and targets: linked lists.  */
struct iptables_match *iptables_matches = NULL;
struct iptables_target *iptables_targets = NULL;
这样在不使用共享库的情况下,每次下命令之前都要初始化一下全局的链表,当然已经存在的话,就不会再次register的。
....

[ 本帖最后由 ok_lin 于 2010-1-20 11:21 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2010-01-20 11:21 |只看该作者
原帖由 ok_lin 于 2010-1-20 10:36 发表
iptables 匹配时会根据 modules 的链表逐一使用模块匹配,应该是没有错的,但不一定是m1 m2 m3, 因为m2可能在m1之前先加载了

不知道你这里指的 “加载” 是什么意思?

论坛徽章:
0
17 [报告]
发表于 2010-01-20 11:24 |只看该作者
原帖由 platinum 于 2010-1-20 11:21 发表

不知道你这里指的 “加载” 是什么意思?



insmod  m2  

先insmod m2

后写规则,那m1在系统中链表的位置在m2后,那先进行的是m2匹配,再进行m1.

论坛徽章:
0
18 [报告]
发表于 2010-01-20 11:39 |只看该作者
和这个没有关系吧,iptables 是靠 match 链表工作的,这和 insmod 哪个先哪个后也有关?
你的意思是如果系统启动后 insmod m1 m2 m3 的顺序,策略使用 m3 m2 m1 的顺序,结果是按照加载的顺序来的?

如果可能,你可以做一个实验,自己写 m1 m2 m3 三个匹配模块,分别在处理时设置 skb->mark 为固定数值,看之后 mark 到底是多少

[ 本帖最后由 platinum 于 2010-1-20 11:40 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2010-01-20 11:47 |只看该作者
原帖由 platinum 于 2010-1-20 11:39 发表
和这个没有关系吧,iptables 是靠 match 链表工作的,这和 insmod 哪个先哪个后也有关?
你的意思是如果系统启动后 insmod m1 m2 m3 的顺序,策略使用 m3 m2 m1 的顺序,结果是按照加载的顺序来的?

如果可 ...



系统启动后 insmod m1 m2 m3
策略使用 m3 m2 m1 的顺序测试

发现既不是按照m1 m2 m3  也不是按照m3 m2 m1

是按照当你输入iptables -vnL查看时打印出来的顺序来匹配的。

我后来研究发现,iptables打印出来的顺序是文件iptables/extensions/initext.c中的顺序一样。

initext.c文件内容如下:

extern void ipt_ah_init(void);
extern void ipt_connlimit_init(void);
。。。
extern void ipt_string_init(void);

void init_extensions(void) {
        ipt_ah_init();
        ipt_connlimit_init();
        。。。
        ipt_string_init();
}

搞得我莫名其妙啊。
说明一下我的iptables是不生成动态库的啊。

论坛徽章:
0
20 [报告]
发表于 2010-01-20 11:50 |只看该作者

回复 #18 platinum 的帖子

我做了类似的实验,结果和我说的一样啊。 版主说的按match链表顺序匹配应该没错,但这个链表好像不是按照策略使用 m3 m2 m1 的顺序来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP