限制策略

由于 mirrors 属于IO、网络密集型服务,在部分的负载场景下极易出现IO或网络过载。限制策略主要是为了减弱以下几类请求对mirrors整体服务质量的影响:

  1. 突发性的高并发请求
  2. 爬虫类流量
  3. 不合理的请求(如:极少数用户的大量请求)

白名单

一般而言,科大校内的地址位于限制规则的白名单中,不受到限制策略的影响。如果没有特殊说明,科大地址默认不受限制。

白名单位于:

  • /usr/local/network_config/ipset.list
  • /etc/nginx/conf.d/geo-ustcnet.conf

防火墙级别限制

防火墙(iptables)目前只负责限制单IP的并发链接数。这是为了防止同时涌入大量并发连接,导致后端应用耗费大量CPU、IO资源处理这些不合常理的请求。

端口 服务 最大连接数 IPv4 CIDR IPv6 CIDR
1 80,443 HTTP/HTTPS 11 29 64
2 20,21,50100:50200 FTP 2 32 128
3 873 Rsync 2 32 64
4 9418 Git 6 32 128

请注意,同组内的连接共享连接数配额。如:

  1. 10.0.0.1与10.0.0.2共享HTTP限额
  2. 1.1.1.1 发起的 HTTP与HTTPS连接共享11个连接数限额

超过配额的连接会返回tcp reset。

应用级别限制

此类限制规则位于应用程序内。由于在用户态程序中实现,因此更加灵活。

Nginx LUA组件

代码位于 /etc/nginx/lua/access.lua

目前使用了Nginx的lua语言扩展实现对请求的限制。主要有以下三类限制方式:

  1. 按连接数限制(即:并发请求数)
  2. 按请求速率限制
  3. 按累计请求数限制(周期性重置计数器)

目前,镜像站配置了以下几种功能的限制器:

  1. 全局请求速率限制器:对所有请求,限制单IP的请求速率。
  2. 全局请求数限制器:对于所有请求,检测单IP在一天内的累计请求数。超过阈值后,降低该IP的全局请求速率限制器的阈值。
  3. HEAD请求数限制器:对于HTTP Method == HEAD类型的请求,检测单IP在一天内的累计请求数。超过阈值后,开启HEAD请求速率限制器
  4. HEAD请求速率限制器:对于HTTP Method == HEAD类型的请求,限制单IP的请求速率。该限制器默认关闭。
  5. 断点续传请求速率限制器:对于断点续传类型的请求,限制单IP的请求速率。
  6. 断点续传连接数限制器:对于断点续传类型的请求,限制单IP单URI的连接数。
  7. 目录请求速率限制器:对于列目录类型的请求,限制单IP请求速率。
  8. 文件请求速率限制器:对于非目录类型的请求,限制单文件请求速率。即:所有用户之间共享同一个配额。
    • 例外:apt/yum仓库的索引文件不受限制。
    • 案例:曾遇到过攻击者分布式请求同一个大文件,导致IO、网络同时过载。 基于IP地址的限制措施对于源地址池很大的攻击往往没有效果,限制单文件的请求速率能够有效缓解这类攻击。

具体参数参考下表:

限制器名称 阈值单位 阈值 突发量 计数器重置周期 动作
全局请求速率限制器 次/秒 40 100 / 返回429错误
全局请求数限制器 15000 / 1天 设置全局请求速率限制器阈值为 0.2
HEAD请求数限制器 300 / 1天 开启HEAD请求速率限制器
HEAD请求速率限制器 次/秒 0.05 5 / 返回429错误
断点续传请求速率限制器 次/秒 1 10 / 返回429错误
断点续传连接数限制器 1 0 / 返回429错误
目录请求速率限制器 次/秒 0.5 10 / 返回429错误
文件请求速率限制器 次/秒 5 50 / 返回429错误

到达阈值后会发生什么?

  • 当请求速率超过阈值,但未超过突发量时,限制器会计算出一个满足阈值条件的最小等待时间。连接会被丢入等待池,到达等待时间后再被处理。
  • 当请求速率超过阈值,且超过突发请求量时,将会在等待5秒后返回 HTTP 429 错误。

限制器之间相互独立,当被触发的所有限制器产生不一致的等待时间时,应用最长的等待时间。

NGINX JS 挑战

代码位于/etc/nginx/sites-available/iso.mirrors.ustc.edu.cn

为了抵抗“迅雷攻击”。对于特定类型的文件,开启了JS挑战。 如果客户端User-Agent为Mozilla(即浏览器),则发送一段包含JS脚本的页面,检验运行的结果。如果挑战失败,则返回错误。

被保护的文件类型有:

  • iso
  • exe
  • dmg
  • run
  • zip
  • tar

爬虫限制

代码位于/etc/nginx/snippets/robots

如果客户端User-Agent包含Spider、Robot关键字, 则禁止其访问仓库内容。避免由于频繁列目录带来大量IO负载。

Rsync 总连接数限制

Rsync服务设置了总连接数限制。即:当建立的连接数到达某个阈值后,拒绝之后收到的连接。

由于白天HTTP访问压力较大,夜晚HTTP访问量较小,为了实现错峰同步,因此针对不同时段设置了不同的阈值,具体如下:

  • 23:00 ~ 8:00 :最多60个连接
  • 8:00 ~ 23:00:最多30个连接

特别的,科大IP地址受到rsync连接数限制。