我必须为路由器编写 bash 脚本来控制给定域名上给定用户的带宽限制。
为此,我使用 iptables 标记从受限域传入私有网络中的用户 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 中的表格混乱)例如,用于为 Lan 网络中的用户 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
但是,如果我尝试在路由器的互联网接口上标记来自 slashdot.org 的数据包,则会捕获这些数据包,并且如果局域网中的计算机也查阅 slashdot.org,则相同的规则也会对它们进行标记。
所以我猜测 NAT 翻译存在问题,而且我不知道何时以及以何种顺序应用规则。
第一次,我在 iptables 中设置的 NAT 是否正确或不完整?我是否遗漏了有关规则或 iptables 概念的重要内容?
提前致谢。
答案1
我认为你应该使用路由后mangle 表,因为您在 NAT 引擎之前在 PREROUTING 中标记数据包。
看一下IPTABLE链: