iptables 和CONNMARK的疑问?
iptables 的CONNMARK,可以配合策略路由使用,一般iptables的规则配置如下:1.iptables -A POSTROUTING -t mangle -j CONNMARK --restore-mark
2.iptables -A POSTROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
3.iptables -A POSTROUTING -m mark --mark 0 -p tcp --dport 21 -t mangle -j MARK --set-mark 1
4.iptables -A POSTROUTING -m mark --mark 0 -p tcp --dport 80 -t mangle -j MARK --set-mark 2
5.iptables -A POSTROUTING -m mark --mark 0 -t mangle -p tcp -j MARK --set-mark 3
6.iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
1)第1条规则就是完成了将链接跟踪上的标记记录到该连接上的每一个数据包中;
2)第2条规则判断数据包的标记,如果不为0,则直接ACCEPT。如果数据包上没有被打标记,则交由后面的规则进行匹配并打标记。这里为什么会出现经过了CONNMARK模块,数据包仍未被打标记呢?可以想到,如果一条链接的第1个数据包经过第1条规则处理之后,由于ct->mark为0,所以其数据包的标记skb->nfmark应该仍旧为0,就需要进行后面规则的匹配。
3)第3~5条规则,则按照匹配选项对符合规则的数据包打上不同的标记
4)第6条规则,则是把之前打的标记信息保存到ct
问题是,规则都是在POSTROUTING的位置的,都是已经路由后了,对数据包打mark还会重新去进行路由吗?
简单看了一下xt_connmark.c的代码,好像是没有进行重新路由的
了解的童鞋分享一下 没人回复,自己回复一下,改变iptables规则的位置,放在prerouting的位置就可以结合策略路由使用了 xt_connmark没有route的逻辑
改变mark后重新route的逻辑是存在的(但不是postrouting),参考mangle表的local_out_hook
http://lxr.free-electrons.com/source/net/ipv4/netfilter/iptable_mangle.c#L40
注意第68行。
页:
[1]