![Linux Wi-FI 接入点上的流量整形(模拟数据包延迟和丢失)](https://linux22.com/image/1560708/Linux%20Wi-FI%20%E6%8E%A5%E5%85%A5%E7%82%B9%E4%B8%8A%E7%9A%84%E6%B5%81%E9%87%8F%E6%95%B4%E5%BD%A2%EF%BC%88%E6%A8%A1%E6%8B%9F%E6%95%B0%E6%8D%AE%E5%8C%85%E5%BB%B6%E8%BF%9F%E5%92%8C%E4%B8%A2%E5%A4%B1%EF%BC%89.png)
我有一个 Pi 3 B+ 设置为 Wi-Fi 接入点,我想模拟通过 AP 通信的连接设备的数据包延迟和数据包丢失。我认为我可以使用 tc 和 iptables 来实现这一点,从而导致通过 AP 通信的连接设备的数据包抖动和丢失,但这些数据包不受影响。唯一受影响的数据包是来自目标 IP 为 AP 的连接设备的数据包,或目标 IP 为连接设备的 AP 数据包。任何关于如何影响通过 AP 通信的连接设备的见解都将不胜感激。此外,我无法修改连接到 AP 的设备上的软件或配置。我尝试在 AP 上执行类似于下面的命令,但没有成功。
tc qdisc 更改 dev wlan0 root netem 延迟 100ms 10ms
tc qdisc 更改 dev wlan0 root netem 丢失 0.1
iptables -D INPUT -m 统计 --模式随机 --概率 0.2 -j DROP
iptables -D OUTPUT -m 统计 --模式随机 --概率 0.2 -j DROP
iptables -D FORWARD -m 统计 --模式随机 --概率 0.2 -j DROP
答案1
您应该能够使用 netem 来实现此目的,而无需 iptables。您可以将所需的延迟和丢失组合到一个 netem 实例中。
但是,每个 qdisc 默认只处理其接口上的传出流量。传入流量涉及不同的路径,您必须在该路径上放置单独的 qdisc 来影响它们。您可以将第二个 netem 实例附加到以太网接口,或者引导 Wifi 入口流量通过虚拟中间设备。后者需要:
ifconfig ifb0 up
tc qdisc add dev wlan0 handle ffff: ingress
tc filter add dev wlan0 parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0
tc qdisc add dev ifb0 root netem ...
iptables 可能不适合您的原因之一是,默认情况下,出于效率原因,桥接流量不会通过它,只有路由流量才会通过它。有一个编译时内核配置选项也可以通过 iptables 发送桥接流量,但我认为您的情况没有必要。