Help us learn about your current experience with the documentation. Take the survey.

用户和 IP 速率限制

  • 版本:Free, Premium, Ultimate
  • 产品:GitLab 私有化部署

速率限制是一种用于提升 Web 应用安全性和稳定性的常用技术。更多详情,请参阅 速率限制

以下限制默认处于禁用状态:

默认情况下,所有 Git 操作首先会尝试未经身份验证的方式。因此,HTTP Git 操作 可能会触发为未经身份验证的请求配置的速率限制。

API 请求的速率限制不会影响前端发出的请求,因为这些请求始终 被计为 Web 流量。

启用未经身份验证的 API 请求速率限制

要启用未经身份验证的 API 请求速率限制:

  1. 在左侧边栏底部,选择 管理员

  2. 选择 设置 > 网络

  3. 展开 用户和 IP 速率限制

  4. 选择 启用未经身份验证的 API 请求速率限制

    • (可选)。更新 每个速率限制周期内每个 IP 的最大未经身份验证 API 请求数 的值。 默认值为 3600
    • (可选)。更新 未经身份验证的速率限制周期(秒) 的值。 默认值为 3600

启用未经身份验证的 Web 请求速率限制

要启用未经身份验证的请求速率限制:

  1. 在左侧边栏底部,选择 管理员

  2. 选择 设置 > 网络

  3. 展开 用户和 IP 速率限制

  4. 选择 启用未经身份验证的 Web 请求速率限制

    • (可选)。更新 每个速率限制周期内每个 IP 的最大未经身份验证 Web 请求数 的值。 默认值为 3600
    • (可选)。更新 未经身份验证的速率限制周期(秒) 的值。 默认值为 3600

启用经过身份验证的 API 请求速率限制

要启用经过身份验证的 API 请求速率限制:

  1. 在左侧边栏底部,选择 管理员

  2. 选择 设置 > 网络

  3. 展开 用户和 IP 速率限制

  4. 选择 启用经过身份验证的 API 请求速率限制

    • (可选)。更新 每个速率限制周期内每个用户的最大经过身份验证 API 请求数 的值。 默认值为 7200
    • (可选)。更新 经过身份验证的 API 速率限制周期(秒) 的值。 默认值为 3600

启用经过身份验证的 Web 请求速率限制

要启用经过身份验证的请求速率限制:

  1. 在左侧边栏底部,选择 管理员

  2. 选择 设置 > 网络

  3. 展开 用户和 IP 速率限制

  4. 选择 启用经过身份验证的 Web 请求速率限制

    • (可选)。更新 每个速率限制周期内每个用户的最大经过身份验证 Web 请求数 的值。 默认值为 7200
    • (可选)。更新 经过身份验证的 Web 速率限制周期(秒) 的值。 默认值为 3600

使用自定义速率限制响应

超出速率限制的请求会返回 429 响应码和一个纯文本正文,默认内容为 Retry later(稍后重试)。

要使用自定义响应:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 发送给达到速率限制的客户端的纯文本响应 文本框中, 添加纯文本响应消息。

每分钟对 project/:id/jobs 的最大已认证请求数

为减少超时,project/:id/jobs 端点的默认速率限制为每个经过身份验证的用户每分钟 600 次调用。

要修改最大请求数:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 网络
  3. 展开 用户和 IP 速率限制
  4. 更新 每分钟对 project/:id/jobs 的最大已认证请求数 的值。

响应标头

当客户端超出其关联的速率限制时,后续请求将被阻止。服务器可能会响应包含速率限制信息的标头,允许请求者在特定时间后重试。这些信息会附加到响应标头中。

标头 示例 描述
RateLimit-Limit 60 客户端每分钟的请求配额。如果在 管理员 区域中设置的速率限制周期不是 1 分钟,则此标头的值会调整为最接近的 60 分钟周期。
RateLimit-Name throttle_authenticated_web 阻止请求的节流器名称。
RateLimit-Observed 67 时间窗口内与客户端关联的请求数。
RateLimit-Remaining 0 时间窗口内的剩余配额。即 RateLimit-Limit - RateLimit-Observed 的结果。
RateLimit-Reset 1609844400 请求配额重置的 Unix 时间 格式时间。
RateLimit-ResetTime Tue, 05 Jan 2021 11:00:00 GMT 请求配额重置的 RFC2616 格式日期和时间。
Retry-After 30 配额重置前的剩余持续时间(秒)。这是一个标准 HTTP 标头

使用 HTTP 标头绕过速率限制

根据您组织的需求,您可能希望启用速率限制, 但让某些请求绕过速率限制器。

您可以通过使用自定义标头来标记应绕过速率限制器的请求来实现此目的。 您必须在 GitLab 前面的负载均衡器或反向代理中的某个位置执行此操作。例如:

  1. 为您的绕过标头选择一个名称。例如,Gitlab-Bypass-Rate-Limiting
  2. 配置您的负载均衡器,在需要绕过 GitLab 速率限制的请求上设置 Gitlab-Bypass-Rate-Limiting: 1
  3. 配置您的负载均衡器执行以下操作之一:
    • 擦除 Gitlab-Bypass-Rate-Limiting
    • 在所有应受速率限制影响的请求上,将 Gitlab-Bypass-Rate-Limiting 设置为 1 以外的值。
  4. 设置环境变量 GITLAB_THROTTLE_BYPASS_HEADER
    • 对于 Linux 软件包安装, 在 gitlab_rails['env'] 中设置 'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'
    • 对于自编译安装,在 /etc/default/gitlab 中设置 export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting

重要的是,您的负载均衡器必须在所有传入流量上擦除或覆盖绕过 标头。否则,您必须信任您的 用户不会设置该标头从而绕过 GitLab 速率限制器。

只有当标头设置为 1 时,绕过才有效。

因绕过标头而绕过速率限制器的请求 会在 production_json.log 中标记为 "throttle_safelist":"throttle_bypass_header"

要禁用绕过机制,请确保环境变量 GITLAB_THROTTLE_BYPASS_HEADER 未设置或为空。

允许特定用户绕过已认证请求速率限制

与上文描述的绕过标头类似,可以允许 特定用户集绕过速率限制器。这仅适用于 已认证请求:对于未经身份验证的请求,根据定义, GitLab 不知道用户是谁。

允许列表在 GITLAB_THROTTLE_USER_ALLOWLIST 环境变量中配置为以逗号分隔的用户 ID 列表。如果您希望 用户 1、53 和 217 绕过已认证请求速率限制器, 则允许列表配置应为 1,53,217

  • 对于 Linux 软件包安装, 在 gitlab_rails['env'] 中设置 'GITLAB_THROTTLE_USER_ALLOWLIST' => '1,53,217'
  • 对于自编译安装,在 /etc/default/gitlab 中设置 export GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217

因用户允许列表而绕过速率限制器的请求 会在 production_json.log 中标记为 "throttle_safelist":"throttle_user_allowlist"

在应用启动时,允许列表会记录在 auth.log 中。

在强制执行节流设置前进行试运行

您可以通过将 GITLAB_THROTTLE_DRY_RUN 环境变量设置为 以逗号分隔的节流器名称列表来试运行节流设置。

可能的名称有:

  • throttle_unauthenticated
    • 已在 GitLab 14.3 中弃用。请改用 throttle_unauthenticated_apithrottle_unauthenticated_webthrottle_unauthenticated 仍受支持,并同时选择这两者。
  • throttle_unauthenticated_api
  • throttle_unauthenticated_web
  • throttle_authenticated_api
  • throttle_authenticated_web
  • throttle_unauthenticated_protected_paths
  • throttle_authenticated_protected_paths_api
  • throttle_authenticated_protected_paths_web
  • throttle_unauthenticated_packages_api
  • throttle_authenticated_packages_api
  • throttle_authenticated_git_lfs
  • throttle_unauthenticated_files_api
  • throttle_authenticated_files_api
  • throttle_unauthenticated_deprecated_api
  • throttle_authenticated_deprecated_api

例如,要为所有对非受保护路径的已认证请求试运行节流器,可以设置 GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'

要为所有节流器启用试运行模式,可以将该变量设置为 *

将节流器设置为试运行模式后,在达到限制时会向 auth.log 记录一条消息,同时允许请求继续。该日志消息包含一个设置为 trackenv 字段。matched 字段包含被触发的节流器名称。

重要的是,在设置中启用速率限制之前设置环境变量。管理员区域中的设置会立即生效,而设置环境变量需要重启所有 Puma 进程。

故障排查

在意外锁定管理员后禁用节流

如果许多用户通过同一个代理或网络网关连接到 GitLab, 那么如果速率限制设置得过低,该限制也可能将管理员锁定在外, 因为 GitLab 会认为他们使用了与触发节流的请求相同的 IP。

管理员可以使用 Rails 控制台 来禁用与 GITLAB_THROTTLE_DRY_RUN 变量所列相同的限制。 例如:

Gitlab::CurrentSettings.update!(throttle_authenticated_web_enabled: false)

在此示例中,throttle_authenticated_web 参数的名称后缀为 _enabled

要为限制设置数值,请将 _enabled 名称后缀替换为 _period_in_seconds_requests_per_period 后缀。