使用带有 NAT 的 iptables 标记数据包

Mul*_*lot 4 linux nat routing iptables qos

我必须为路由器编写 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
Run Code Online (Sandbox Code Playgroud)

我在 nat 表中的 NAT 设置(eth0 是我的互联网接口,我使用 tap0 作为 LAN 接口)是

$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

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

示例:(PREROUTING CHAIN 中的 table mangle)这例如用于为 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         
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在路由器的 Internet 接口上标记来自 slashdot.org 的数据包,则数据包会被捕获,如果局域网中的计算机也查询 slashdot.org,同样的规则也会对其进行标记。

所以我猜是因为 NAT 转换存在问题,我不知道确切的时间和顺序应用规则。

第一次,我在 iptables 中的 NAT 设置是好的还是不完整的?我是否错过了有关规则或 iptables 概念的重要内容?

提前致谢。

Nat*_*tim 8

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

看看 IPTABLE 链:

IPTABLES 链图