![如何在 iptables MASQUERADE 之后过滤数据包?](https://linux22.com/image/201281/%E5%A6%82%E4%BD%95%E5%9C%A8%20iptables%20MASQUERADE%20%E4%B9%8B%E5%90%8E%E8%BF%87%E6%BB%A4%E6%95%B0%E6%8D%AE%E5%8C%85%EF%BC%9F.png)
我正在尝试构建一个基于 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]}
}