platinum 发表于 2011-07-14 13:19

回复platinum
我那个泛域名匹配主要是为了跟squid的用法一致,所以采用了squid中的机制。(最前面加"."表示泛域名匹配,不加”."表示精确匹配)。瀚海书香 发表于 2011-07-14 13:00 http://bbs.chinaunix.net/images/common/back.gif


GOOD IDEA!
我可以借鉴一下!:D

Godbach 发表于 2011-07-14 17:35

回复 30# platinum

1、学会使用 -N,配合 -g 使用,缓解多条 iptables 语句时的效率低下问题
对,有时候单一的功能,可以考虑新建个链。
BTW,-g 选项我自己也很少用。白金兄介绍个实例啥的。

2、熟知你的网络数据特征,按照策略碰撞概率优先级调整规则排列顺序
3、慎用 -j LOG 记录数据
对,定位问题时可以用。常态不要用

4、能提前阻断的,在数据进入 conntrack 之前把它“办”掉(放在 raw 表中处理)
5、能不开启 conntrack 功能就不要开启
是的。conntrack 毕竟对系统的性能有影响

chenyx 发表于 2011-07-14 22:14

提醒大家需要注意的一些误区:
1、nat 表只匹配一个连接的前几个包(TCP 和 UDP 的实现略有不同),后续数据无法被 nat 表的规则匹配
2、limit 不能防止本机被 DoS 攻击,只能降低本机 CPU 负载
3、不要认为 iptables -t mangle -F 这样的语句就可以清空 mangle 表规则,它的副作用是载入了 mangle hook(nat、raw、filter 表同理)
学习了

ecjtubaowp 发表于 2011-07-14 23:10

学习了。

platinum 发表于 2011-07-15 00:50

回复platinum
BTW,-g 选项我自己也很少用。白金兄介绍个实例啥的。
Godbach 发表于 2011-07-14 17:35 http://bbs.chinaunix.net/images/common/back.gif

比如这样一种逻辑,大家一起讨论一下:
1、如果是 TCP/81 需要打 MARK 999
2、如果是 UDP/80 需要打 MARK 999
3、如果是 NEW 状态却非 SYN 包的 TCP 需要打 MARK 999
4、规则中还有其他策略若干(不考虑 mport 模块的使用)

一般的做法有几种:
第一种,傻瓜式:一个一个平铺直述,虽然不怎么巧妙但可以实现需求
iptables -A INPUT -p tcp --dport 81 -j MARK --set-mark 999
iptables -A INPUT -p udp --dport 80 -j MARK --set-mark 999
iptables -A INPUT --state NEW ! --syn -j MARK --set-mark 999
iptables -A INPUT -p tcp --dport 21 -j DROP
iptables -A INPUT -p udp --dport 53 -j DROP
iptables -A INPUT -p tcp --dport 8080 -j DROP
iptables -A INPUT -p tcp --dport 3128 -j DROP
第二种,函数调用式:将所有同类操作引向一个自定义链,类似一个函数调用
iptables -N SETMARK
iptables A SETMARK -j MARK --set-mark 999
iptables -A INPUT -p tcp --dport 81 -j SETMARK
iptables -A INPUT -p udp --dport 80 -j SETMARK
iptables -A INPUT --state NEW ! --syn -j SETMARK
iptables -A INPUT -p tcp --dport 21 -j DROP
iptables -A INPUT -p udp --dport 53 -j DROP
iptables -A INPUT -p tcp --dport 8080 -j DROP
iptables -A INPUT -p tcp --dport 3128 -j DROP
但是大家有没有发现一个问题:
一和二中对特殊数据 MARK 后,数据包没有终止匹配,仍然继续向下做无用功
第二种情况虽然跳到自定义链里了,但最终没有明确是 ACCEPT 还是 DROP,还会跳回来
因此,我们再使用一种新的思路,在第二种函数式上改动一下

第三种,敢死队式:去了就再也不回来了
iptables -N SETMARK
iptables A SETMARK -j MARK --set-mark 999
iptables -A INPUT -p tcp --dport 81 -g SETMARK
iptables -A INPUT -p udp --dport 80 -g SETMARK
iptables -A INPUT --state NEW ! --syn -g SETMARK
iptables -A INPUT -p tcp --dport 21 -j DROP
iptables -A INPUT -p udp --dport 53 -j DROP
iptables -A INPUT -p tcp --dport 8080 -j DROP
iptables -A INPUT -p tcp --dport 3128 -j DROP

chenyx 发表于 2011-07-15 08:48

还真没用过-g,原来是这个意思,匹配之后就不向下走了.这个应该类似于-j RETURN吧,只不过return要在每一个不需要向下匹配的规则都添加一次

haha_yong 发表于 2011-07-15 09:12

好帖子!

瀚海书香 发表于 2011-07-15 09:26

回复 35# platinum
还真没用过这个-g参数,有空也测试一下。。。

platinum 发表于 2011-07-15 09:53

还真没用过-g,原来是这个意思,匹配之后就不向下走了.这个应该类似于-j RETURN吧,只不过return要在每一个不需 ...
chenyx 发表于 2011-07-15 08:48 http://bbs.chinaunix.net/images/common/back.gif

不是类似 -j RETURN,恰好说反了

默认 -j 到自定义链的话,最后结束后会自动 RETURN 回来
-g 结束就结束了

Godbach 发表于 2011-07-15 10:02

回复 35# platinum

白金兄,你这里的描述,并没有明确提出,打过 mark 的就不需要往下匹配了啊
比如这样一种逻辑,大家一起讨论一下:
1、如果是 TCP/81 需要打 MARK 999
2、如果是 UDP/80 需要打 MARK 999
3、如果是 NEW 状态却非 SYN 包的 TCP 需要打 MARK 999
4、规则中还有其他策略若干(不考虑 mport 模块的使用)
我刚才看了 xt_mark 的实现,打完标记就是 XT_CONTINUE,也就是人家继续往下匹配是正确的,除非你不希望打完标记的数据包,继续匹配其他规则,

不知道我的理解是否正确
页: 1 2 3 [4] 5 6 7 8 9 10 11 12
查看完整版本: CU线上连载讨论一 Linux iptables使用问题和内核Netfilter流程