如何在 iptables MASQUERADE 之后过滤数据包?

如何在 iptables MASQUERADE 之后过滤数据包?

我正在尝试构建一个基于 Debian Buster(内核版本 4.19)的多 WAN 路由器。它有多个“LAN 侧”网络接口(例如局域网0,局域网1, ...局域网中号),以及多个“WAN 侧”接口(例如旺0,湾1, ...)。我将每个 WAN 端接口配置为伪装传出流量,如下所示:

iptables -t nat -I POSTROUTING -o wan0 -j MASQUERADE
iptables -t nat -I POSTROUTING -o wan1 -j MASQUERADE
...

现在我的问题是我发现(使用“tshark”数据包捕获)一些传出数据包“逃脱”伪装,并通过 WAN 侧接口传出源IP那是不同的来自该 WAN 接口的 IP。我能够抓住并放下一些这些数据包的规则

iptables -t filter -I FORWARD -m state --state INVALID -j DROP

...但不幸的是没有全部这样的数据包。 (我什至发现数据包的源 IP 等于旺0试图通过湾1.)

我的问题:有没有办法检查和丢弃数据包他们已经通过了MASQUERADE操作吗?我知道“nat”表的 POSTROUTING 链是我可以用“iptables”做的最后一件事,但是我可以做些什么,例如,nftables, 或者电子BPF

答案1

我已经找到了一种方法来做到这一点,它涉及TC

以下是我们如何将接口配置${ifc}为在出口处丢弃任何不包含${ip}在其内部的数据包源地址场地。

h_ip=$(ip_to_hex ${ip})

tc qdisc add dev ${ifc} root handle 1: htb
tc filter add dev ${ifc} parent 1: prio 1 protocol ip basic match 'not u32( u32 '${h_ip}' 0xFFFFFFFF at 12 )' action drop

在哪里:

function ip_to_hex {
        IFS='.'; read -ra AD <<< "$1"; unset IFS
        printf '0x%02x%02x%02x%02x' ${AD[0]} ${AD[1]} ${AD[2]} ${AD[3]}
}

相关内容