linux - 源 IP 地址过滤应该在应用层本身实现还是由应用层委托(delegate)给防火墙

标签 linux sockets network-programming firewall denial-of-service

假设我的应用程序监听 UDP 套接字,它知道可以从哪些 IP 地址接收 UDP 数据报。来自其他 IP 地址的任何内容都将被视为恶意数据报,应尽早丢弃以防止 DoS 攻击。困难的部分是这些合法 IP 地址的集合可以在应用程序的生命周期内动态变化(即通过控制 channel 动态接收它们)。

在上述情况下,您将如何实现基于源 IP 地址的过滤?

我看到两个解决方案,将此源 IP 过滤逻辑放在哪里:

  1. 在 recvfrom() 调用之后在应用程序本身中实现它。
  2. 在防火墙中安装默认丢弃策略,然后让应用程序安装防火墙规则,这些规则将动态地将合法 IP 地址列入白名单。

每种解决方案都各有利弊。我想到的一些:

  1. iptables 的过滤复杂度可能为 O(n)(iptables 的限制)
  2. iptables 在数据包到达套接字缓冲区之前就丢弃它们(iptables 的专业版)
  3. iptables 可能不是很便携(iptables 的缺点)
  4. 我的应用程序中的 iptables 可能会干扰其他可能也会安装 iptables 规则的应用程序(iptables 的缺点)
  5. 如果我的应用程序安装了 iptables 规则,那么它本身就有可能成为攻击媒介(对 iptables 来说是骗局)

您将在哪里实现源 IP 过滤,为什么?

您能否命名任何遵循约定 #2 的应用程序(管理员手动安装静态防火墙规则不算)?

最佳答案

我的建议(绝对没有任何权威支持)是使用 iptables 进行速率限制以抑制任何 DoS 攻击并在您的应用程序内部进行实际过滤。这将为您提供两全其美的方法,让您可以使用 iptables 的性能来限制 DoS 吞吐量,并能够在不引入潜在安全漏洞的情况下更改允许的地址。

如果您决定单独使用 iptables,我会创建一个新链来执行特定于应用程序的过滤,从而降低干扰的可能性。

希望这对您有所帮助。

关于linux - 源 IP 地址过滤应该在应用层本身实现还是由应用层委托(delegate)给防火墙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33381581/

相关文章:

java - 需要澄清LAN应用概念

c - 什么是套接字类型?

javascript - 我如何防止玩家发送垃圾邮件移动消息 (Node.js)?

java - Java 中的无限带宽

linux - sed + 如何使用缩进附加行

linux - 如何从 Linux ls 或 find 命令的文件列表中获取内容

具有不完整列的 Linux 文件排序

go - 在golang中缓存网络流?

c - c中定义的const SOMAXCONN在哪里?

python - 无法在我的 Raspberry Pi 上使用 pip 安装 Flask