实现 iptables,丢弃 ACK 数据包,但为客户端接受该数据包

实现 iptables,丢弃 ACK 数据包,但为客户端接受该数据包

我有一个 IoT 设备(下图中称为设备 A),它通过路由器与我的服务器通信。但是,我的 IoT 设备偶尔会收到 WDT 并重新启动,根据我的调查,这似乎与网络流量以及我在 IoT 设备中处理事物的方式有关。从下面的代码片段中,我们可以看到设备 A 和服务器通信良好,直到我的设备发送一个确认,而我的服务器没有收到该确认,并且在设备 A 发送 Keep-Alive 之前开始多次发送 PSH、ACK。

这很难调试,因为它每隔一天或更短时间才会发生一次。因此,我的问题是,我能否在 iptables 的帮助下以某种方式配置我的计算机(充当具有 DHCP 的路由器并转发到我的其他互联网接口),使其丢弃每 X(30 左右)个 ACK​​ 数据包,但设备 A 将其视为已发送数据包?或者这是 TCP/IP 堆栈问题?

另外,我尝试使用这些 iptables 规则来模拟 iface 的重新启动,它们正确吗,还是我应该以另一种方式进行?

图像

答案1

因此,我的问题是,我是否可以在 iptables 的帮助下以某种方式配置我的计算机(充当具有 DHCP 的路由器并转发到我的其他互联网接口),使其丢弃每个 X(30 左右) ACK 数据包,但设备 A 将其视为已发送数据包?

是的,通过配置 iptables 来丢弃数据包(就像您通常做的那样)。如果您使用判决-j DROP,发送主机将不会收到有关数据包未送达的任何 ICMP 错误。

(IP 不使用任何类型的“数据包已接受”指示,因此发送主机总是一旦数据包离开原始主机,它就会被视为“已发送”。)

要丢弃单个 ACK​​,您可以使用--connbytes匹配、匹配--mode nth --packet X或在“man iptables-extensions”中找到的任何其他合适的匹配。

确保将规则插入 FORWARD 链中多于任何--state ESTABLISHED规则(因为这些规则会隐式接受所有 TCP ACK)。

相关内容