HAProxy 配置 ACL 规则限制特定 IP 访问的方法是什么

文章导读
先说结论:HAProxy 限制特定 IP 访问的核心是在 frontend 中定义 src 条件的 ACL,然后用 deny 动作拒绝匹配流量。配置后需语法检查并平滑重载服务,最后测试验证。
📋 目录
  1. 配置实施
  2. 语法检查与平滑重载
  3. 验证方法
  4. 常见风险与排查
A A

先说结论:HAProxy 限制特定 IP 访问的核心是在 frontend 中定义 src 条件的 ACL,然后用 deny 动作拒绝匹配流量。配置后需语法检查并平滑重载服务,最后测试验证。

  • 适合:需要在负载均衡层做 IP 黑白名单、临时封禁恶意来源、发版期间限制外网访问等场景
  • 优先做:先定义 ACL 条件,再配置拒绝动作,最后设置错误页面提升用户体验
  • 再验证:重载配置后从被禁 IP 发起请求,确认返回 403 状态码且正常 IP 不受影响

配置实施

编辑 HAProxy 配置文件,通常位于 /etc/haproxy/haproxy.cfg/etc/haproxy/conf.d/ 目录下。建议在修改前备份原文件。

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
vim /etc/haproxy/haproxy.cfg

frontend 段落中添加 ACL 定义及拒绝规则。注意必须确保 mode http 已启用,否则 http-request 指令无效。

frontend webcluster
    bind *:80
    mode http
    # 定义单个 IP
    acl deny_ip src 221.234.129.154
    # 定义多个 IP 或网段
    acl deny_ips src 222.73.17.24 222.73.17.25 192.168.1.0/24
    # 执行拒绝动作
    http-request deny if deny_ip or deny_ips
    # 可选:自定义 403 错误页面
    errorfile 403 /etc/haproxy/errfile/403.http

若需在四层 TCP 模式下限制 IP,请使用 tcp-request content reject if deny_ip,但此时无法基于 URL 路径进行过滤。

HAProxy 配置 ACL 规则限制特定 IP 访问的方法是什么

语法检查与平滑重载

生产环境严禁直接使用 restart,会导致现有连接中断。务必先检查语法,再使用 reload 平滑重载。

步骤一:检查配置语法

haproxy -c -f /etc/haproxy/haproxy.cfg

输出 Configuration file is valid 表示无误。

步骤二:平滑重载服务

HAProxy 配置 ACL 规则限制特定 IP 访问的方法是什么
systemctl reload haproxy.service

重载过程中 HAProxy 会启动新进程接管流量,旧进程处理完现有连接后退出,实现零 downtime 更新。

验证方法

方法一:curl 测试状态码

在被禁 IP 机器上执行:

HAProxy 配置 ACL 规则限制特定 IP 访问的方法是什么
curl -I http://your-domain.com

预期返回 HTTP/1.1 403 Forbidden。在允许 IP 机器上执行应返回 200 OK

方法二:查看日志

检查 /var/log/haproxy.log 或系统日志,确认被拒绝的请求有记录。若未看到日志,需确认 global 段落中已配置 logging 且 syslog 服务正常。

常见风险与排查

  • 模式不匹配:http-request 只能在 mode http 下使用。TCP 模式下需改用 tcp-request content reject
  • 源 IP 获取错误: 若 HAProxy 前有其它代理(如 CDN、Nginx),src 匹配的是上一跳代理 IP。需配置 option forwardfor 并基于 hdr(X-Forwarded-For) 做 ACL 匹配。
  • 规则顺序问题: ACL 动作按配置顺序执行。若有 allow 规则,确保 deny 规则优先级正确,避免被覆盖。
  • IP 格式错误: 单个 IP 直接写,网段用 CIDR 格式(如 192.168.1.0/24),多个 IP 用空格分隔,严禁使用逗号。
  • 误封风险: 生产环境生效前,建议在测试环境验证或在低峰期操作,避免误封管理 IP 导致无法维护。