我可以使用limit_req速率限制对我的服务器的所有请求。
但是,我想取消对某些 IP 地址(即白名单)的速率限制,并对某些其他地址(即我希望低至 1r/s 的某些 IP)使用不同的速率限制。
我尝试使用条件(例如if ( $remote_addr = "1.2.3.4" ) {}),但这似乎只适用于重写规则,不适用于速率限制规则。
我之所以要这样做,是因为用户使用 JavaScript 针对我们的 API 进行开发,并且一些开发人员搞砸了并导致访问者使用 AJAX 请求猛烈抨击服务器。发生这种情况时,我希望能够将 API 请求限制为每分钟 50 个请求,或者类似的效果。
注意:(特别是数据库密集型资源,所以可能在路径级别,而不是服务器范围内(例如,节流“/json_api/”,但不是“/static/”)。
UFW 的手册页提到它可以为我设置 iptables 速率限制:
ufw 支持连接速率限制,这对于防止暴力登录攻击很有用。如果 IP 地址在过去 30 秒内尝试启动 6 个或更多连接,则 ufw 将拒绝连接。有关 详细信息,请参阅 http://www.debian-administration.org/articles/187。典型用法是:
Run Code Online (Sandbox Code Playgroud)ufw limit ssh/tcp
不幸的是,这是我能找到的所有文档。我想坚持使用 UFW,而不是使用更复杂的 iptables 命令(以保持“简单”)。
我将如何使用 ufw 将端口 80 上的所有传入(因此不是传出)流量限制为每 30 秒 20 个连接?如何禁用端口 30000 到 30005 的速率限制?是否默认为所有端口启用速率限制?
我正在研究使用 nginx 的HttpLimitReqModule 进行速率限制。但是,请求都来自同一个 IP(负载均衡器),在标头中有真实的 IP 地址。
有没有办法根据X-Forwarded-For标头中的 ip 而不是源的 ip来设置 nginx 速率限制?
在 Nginx 配置中,当你想通过使用limit_req_zone/来限制请求处理速率时limit_req instructions,我不太明白该nodelay选项的用途。
在我的理解中,它会在不延迟它们的情况下终止超过定义速率的请求。所以它似乎相当于burst=0. 这就是为什么我不理解以下示例的原因:
limit_req zone=one burst=5 nodelay;
Run Code Online (Sandbox Code Playgroud)
burst定义了可以延迟的请求数量,那么定义burst是否有nodelay选项是什么意思?
为了避免 rsync 使我们ionice在启动 rsync 和设置--bwlimit参数时使用的系统和网络饿死。例如:
ionice -c2 -n7 rsync -aH --bwlimit=30000 /foo root@dest.com:/
Run Code Online (Sandbox Code Playgroud)
这确实有助于确保源服务器保持响应。但是,由于磁盘 io 为 100%(如atop实用程序所见),目标服务器变得非常慢。
是否也可以ionice在目标服务器上以某种方式使用?也许通过 rsync-e选项?如果可能,我不想运行 rsync 守护进程。
我需要 Postfix 以一定的速率发送外发消息(来自本地 PHP)。比如说,120 秒内发送一条消息。任何超过此速率的消息都应排队(延迟)并稍后传送。
Policyd不是我要找的。我不需要限制发送的消息总数。我需要在发送的任何两条消息之间暂停(120 秒)。
试过这个配置,但它不起作用:
initial_destination_concurrency = 1
default_destination_concurrency_limit = 1
default_destination_rate_delay = 120
default_destination_recipient_limit = 1
default_process_limit = 1
Run Code Online (Sandbox Code Playgroud)
有什么建议?
使用 nginx HttpLimitReq模块可以通过 IP 限制请求。但是,我不明白“nodelay”选项的作用。
如果不需要限制突发延迟内的超额请求,则应使用 nodelay
limit_req zone=one burst=5 nodelay;
Run Code Online (Sandbox Code Playgroud) 根据涓流的手册页,http://linux.die.net/man/1/trickle我可以限制一个进程的下载速度,例如
trickle -u 10 -d 20 ncftp
启动 ncftp(1) 将其上传容量限制为 10 KB/s,下载容量为 20 KB/s。
我将如何限制google-chrome或firefox使用trickle?
编辑:对于那些问我为什么问这么明显的问题的人,我试过了
trickle -u 10 -d 20 firefox
我收到一个错误
trickle: Could not reach trickled, working independently: No such file or directory
Firefox 随即打开,但绝对不受速率限制...
我在 Ubuntu 服务器上使用 iptables。它是 VPS 上的 Web 服务器。
我想知道我是否应该对数据包进行速率限制。如果是这样,我应该限制什么?我应该在全球范围内还是按 IP 地址这样做?
参考
我看到有人提出这个建议:
# Limit packet traffic on a TCP or UDP port:
iptables -A INPUT -p $proto --destination-port $port --syn -m state --state NEW -m limit --limit $lim/s --limit-burst $lb -j ACCEPT
# Limit established/related packet traffic:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit $lim/s --limit-burst $lb -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
以上,全局速率限制似乎不是很有用,至少对于我可以想象的情况。有没有我应该在全球范围内限制速率的情况?
我相信每个 IP 的速率限制通常更好:
# Add the IP to the list:
iptables -A INPUT -p $proto --destination-port …Run Code Online (Sandbox Code Playgroud) rate-limiting ×10
nginx ×5
firewall ×2
high-load ×1
http ×1
ionice ×1
iptables ×1
linux ×1
networking ×1
postfix ×1
rsync ×1
security ×1
throttling ×1
ufw ×1