假设我的应用程序监听 UDP 套接字,它知道可以从哪些 IP 地址接收 UDP 数据报。来自其他 IP 地址的任何内容都将被视为恶意数据报,应尽早丢弃以防止 DoS 攻击。困难的部分是这些合法 IP 地址的集合可以在应用程序的生命周期内动态变化(即通过控制 channel 动态接收它们)。
在上述情况下,您将如何实现基于源 IP 地址的过滤?
我看到两个解决方案,将此源 IP 过滤逻辑放在哪里:
- 在 recvfrom() 调用之后在应用程序本身中实现它。
- 在防火墙中安装默认丢弃策略,然后让应用程序安装防火墙规则,这些规则将动态地将合法 IP 地址列入白名单。
每种解决方案都各有利弊。我想到的一些:
- iptables 的过滤复杂度可能为 O(n)(iptables 的限制)
- iptables 在数据包到达套接字缓冲区之前就丢弃它们(iptables 的专业版)
- iptables 可能不是很便携(iptables 的缺点)
- 我的应用程序中的 iptables 可能会干扰其他可能也会安装 iptables 规则的应用程序(iptables 的缺点)
- 如果我的应用程序安装了 iptables 规则,那么它本身就有可能成为攻击媒介(对 iptables 来说是骗局)
您将在哪里实现源 IP 过滤,为什么?
您能否命名任何遵循约定 #2 的应用程序(管理员手动安装静态防火墙规则不算)?
最佳答案
我的建议(绝对没有任何权威支持)是使用 iptables 进行速率限制以抑制任何 DoS 攻击并在您的应用程序内部进行实际过滤。这将为您提供两全其美的方法,让您可以使用 iptables 的性能来限制 DoS 吞吐量,并能够在不引入潜在安全漏洞的情况下更改允许的地址。
如果您决定单独使用 iptables,我会创建一个新链来执行特定于应用程序的过滤,从而降低干扰的可能性。
希望这对您有所帮助。
关于linux - 源 IP 地址过滤应该在应用层本身实现还是由应用层委托(delegate)给防火墙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33381581/