Lighttpd 流量整形:限制每个 IP 的连接数(速率限制)
如果您不控制或限制最终用户,您的服务器可能会耗尽资源。垃圾邮件发送者、滥用者和编写不良的机器人可能会占用您的所有带宽。Web 服务器必须密切关注连接并限制每秒的连接数。这是服务 101。默认值为无限制。Lighttpd 可以限制每个连接(每个 IP)或所有连接的吞吐量。您还需要使用防火墙来限制每秒的连接数。在本文中,我将介绍防火墙和 lighttpd Web 服务器设置以限制最终用户。防火墙设置可以应用于其他 Web 服务器,例如 Apache/Nginx 和基于 PF/netfilter 的防火墙后面的 IIS 服务器。
Lightttpd:限制所有连接
您可以将所有连接的吞吐量限制为给定的限制(以 kbyte/s 为单位)。打开 lighttpd.conf 文件:
# vi lighttpd.conf
将限制设置为 1024 kbyte/s:
server.kbytes-per-second=1024
保存并关闭文件。重新加载 lighttpd 服务器:
# service lighttpd reload
Lighttpd:限制每个单一连接的吞吐量
将每个 IP 的每个单一连接的限制设置为 64 kbyte/s:
connection.kbytes-per-second=64
重新加载 lighttpd 服务器:
# service lighttpd reload
如何仅为虚拟主机设置限制?
您只能为虚拟主机设置限制,如下所示(将到 theos.in 的流量限制为 64 kbyte/s:
$HTTP["host"] == "theos.in" { server.kbytes-per-second = 64 }
如何限制单个 IP 的连接数?
您需要使用防火墙,例如 *BSD PF 或 Linux netfilter 防火墙。
*BSD PF 防火墙示例 – 限制单个 IP 的连接数
将以下规则添加到您的 /etc/pf.conf 文件中。以下规则将保护 Web 服务器免受主机在 10 秒内建立超过 100 个连接的侵害。任何连接速度超过此速率的 IP 都会将其地址添加到表中,并刷新源自该 IP 的所有状态。从同一 IP 到 Web 服务器的任何新数据包都将被丢弃:
webserver_ip="202.54.1.1" table <abusive_ips> persist block quick from <abusive_ips> pass in on $ext_if proto tcp to $webserver_ip port www keep state (max-src-conn-rate 100/10, overload <bad_hosts> flush global)
另一个例子:
webserver_ip="202.54.1.1" table <abusive_ips> persist block in quick from <abusive_ips> pass in on $ext_if proto tcp to $webserver_ip port www flags S/SA keep state (max-src-conn 100, max-src-conn-rate 15/5, overload <abusive_ips> flush)
它的作用如下:
- 将每个源的最大连接数限制为 100(某些浏览器每个 IP 可以打开 30-40 个连接,因此请将其保持为 100)
- 接下来,限制每秒或每秒钟的连接数。例如,将 5 秒内的连接数限制为 15 个。
- 如果有人违反我们的规则,就将他们添加到我们的 abusive_ips 表中,并阻止他们进行任何进一步的连接。
- 最后,flush 关键字将终止由匹配规则创建的所有状态,这些状态源自超出这些限制的主机。
请根据您的设置随意调整设置。
Linux Netfilter(Iptables)限制连接的示例
以下示例将丢弃在 100 秒内 IP 对端口 80 进行超过 10 次连接尝试的传入连接(将规则添加到您的 iptables shell 脚本)
IPT=/sbin/iptables # Max connection in seconds SECONDS=100 # Max connections per IP BLOCKCOUNT=10 # .... # .. # default action can be DROP or REJECT DACTION="DROP" $IPT -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set $IPT -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds ${SECONDS} --hitcount ${BLOCKCOUNT} -j ${DACTION} # .... # ..
再次,请根据您的设置随意调整设置。