使用 PF 防火墙进行合理的速率限制设置

使用 PF 防火墙进行合理的速率限制设置

我在 pf.conf 中进行了以下设置,以阻止滥用的客户端(我每天都会遇到几个明显不加区别地抓取内容并减慢一切速度的客户端):

pass in on $ext_if proto tcp to { $loadbalancer1_int } port $web_ports flags S/SA keep state (max-src-conn 80, max-src-conn-rate 200/5, overload <web_flood> flush)
pass in on $ext_if proto tcp to { $loadbalancer2_int } port $web_ports flags S/SA keep state (max-src-conn 80, max-src-conn-rate 200/5, overload <web_flood> flush)

不幸的是,我的一些客户被屏蔽了。我不知道这些客户做了什么才会触发这样的网络 IO。我不断提高这些值,但他们还是被屏蔽了。这些值(80 个连接和 5 秒内 200 个连接)难道不是在通常被认为是“滥用”的范围内吗?

答案1

“滥用”完全是相对的,但就网络访问而言,设置每秒连接数的速率限制几乎肯定会捕获合法用户。

记住你访问网页时会发生什么

  1. index.html打开 HTTP 连接并下载主页(假设)。
  2. 您的浏览器会解析index.html并找出所需的其他资源:
    • CSS
    • JavaScript
    • 图片
    • 或(更多“主页”)中的内容
    • 我可能忘记了更多东西
  3. 您的浏览器会抓取所有这些项目。
    它可以通过以下两种方式之一实现这一点”
    • 串行:按顺序下载每个项目(一次一个连接)
    • 并行:一次下载多个项目(多个打开的连接)。

HTTP keepalive 理论上可以减少 connect() 周期的次数,但有些浏览器可能不支持 HTTP keepalive(或者由于某种原因决定不使用它),在这种情况下,每个下载的项目都意味着会打开与服务器的另一个连接。

因此,一个网页就可能有大量的连接——很容易触发防火墙,特别是当您的 IP 上有多个用户或您的用户主动浏览时。


除了全面封锁之外,你还有以下几种选择:

  1. 标记匹配的数据包pf并用 限制其带宽altq
    这其实并不理想 - 你仍然会捕获合法用户 - 但至少他们受到限制(缓慢),而不是被阻止(中断)。

  2. 使用mod_evasivemod_security或类似
    这些模块对 Apache 来说工作量更大,但可配置性更强,并能帮助您避免捕获合法用户。

相关内容