如何使用iptables从源文件中删除第一个udp数据包?

为了防止分布式udp泛滥,我需要从源中删除第一个udp数据包,并接受第一个数据包以外的其他数据包。 iptables是否有能力做到这一点? 如果是的话,怎么样?

我不知道iptables是否有像你要求的function,但我可以解释为什么这样的function不会帮助你。

如果您收到大量不需要的UDP数据包,则可以将其定位在一个封闭的或开放的端口上。 如果它们针对的是封闭的端口,则内核将发送适当的ICMP错误响应。 这种错误响应非常重要,因为如果没有debuggingnetworking问题变得困难,并且在某些情况下,这种错误响应也是别人可以学习正在进行的攻击并减轻攻击的唯一方法。

在封闭端口发送的大量UDP数据包可能会导致大量的ICMP错误消息。 但一个体面的堆栈会自动限制错误信息,所以不应该担心。 UDP数据包所占用的带宽被浪费了,而且在已经浪费了带宽之后,通过丢弃数据包就不会改变这种情况。

如果UDP数据包是在一个开放的端口注定会变得有点复杂。 由于UDP的无状态特性,数据包被传送到应用程序,而内核或应用程序没有机会知道源IP是真实的还是被欺骗的。 如果有必要的话,上层协议有责任validation源IP。 DNS和NTP是在这方面失败的协议的例子,可以被滥用于reflection/放大攻击。

许多基于UDP的服务可以处理大量的UDP数据包,因为它们是无状态的。 如果他们不存储状态,它只是包内数据包而忘记。 服务并不关心源IP是否合法,而且由于服务的无状态性质,大量的伪造源数据包不会导致内存浪费状态。

但是,如果要部署一个防火墙,将来自源的第一个UDP数据包丢弃并让后续数据包通过,则防火墙需要维护状态。 没有状态,它不知道一个数据包是否是第一个。

所以现在你已经把一个有状态的防火墙放在与无状态协议通信的无状态服务之前。 此时,一大堆冒充源的数据包仍然不会降低服务,但会降低防火墙的性能。 防火墙必须记住它收到的每一个数据包的来源。 因此,防火墙将耗尽内存,并且将不得不忘记一些先前收到的数据包。 这意味着,即使对于合法来源,第二,第三等数据包也将被丢弃,因为防火墙根本不记得它已经看到来自该数据源的较早数据包。

所以你所要求的function会把相对无害的DoS尝试变成对你的防火墙更强大的攻击。

这种情况并不是什么新鲜事。 数十年前,TCP协议栈很容易受到SYN洪水的攻击,因为上面提到的原因完全相同。 这就是为什么SYN cookie被发明的原因。

如果您正在devise在UDP之上运行的任何新协议(或者在任何其他无状态协议之上运行),则必须牢记这一点,并采用适当的devise标准使协议抵制欺骗尝试。 如果你没有devise一个协议,那么你所能做的只是要求正在devise协议的人正确地做到这一点。