用iptables用NAT标记数据包

我必须为路由器编写bash脚本来控制给定用户在给定域名上的带宽限制。

为此,我使用iptables将从受限域传入的数据包标记为专用networking中的用户IP地址。 与每对夫妇user_ip / domain_ip我有一个关键,我可以标记数据包。

我将这些规则添加到mangle表中,如下所示:

$iptables -t mangle -A PREROUTING -p tcp -d $userIp -s $restrictedDom -j MARK --set-mark $id $iptables -t mangle -A PREROUTING -p tcp -d $userIp -s $restrictedDom -j RETURN 

我的NAT设置在NAT表(eth0是我的互联网接口,我使用Tap0的Lan接口)是

 $iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

我的Lan用户的数据包应该与mangle表中的规则相匹配,但是没有被捕获。

例如:( PREROUTING CHAIN中的table mangle)例如,用于在Lannetworking中为用户192.168.0.2标记来自slashdot.org的数据包。

 Chain PREROUTING (policy ACCEPT 14858 packets, 7215129 bytes) pkts bytes target prot opt in out source destination 0 0 MARK tcp -- * * 216.34.181.45 192.168.0.2 MARK xset 0x9/0xffffffff 0 0 RETURN tcp -- * * 216.34.181.45 192.168.0.2 

但是,如果我尝试在路由器的Internet接口上标记来自slashdot.org的数据包,则数据包会被捕获,如果LAN中的计算机也访问slashdot.org,同样的规则也会标记它们。

所以我猜这是因为NAT转换引起的一个问题,我不知道什么时候以及以何种顺序适用这些规则。

在第一次,我的NAT设置好或不完整的iptables? 我错过了关于规则或iptables概念的重要事情吗?

提前致谢。

我认为你应该使用POSTROUTING mangle表,因为你在NAT引擎之前将数据包标记在PREROUTING中。

看看IPTABLE链:

IPTABLES链绘图