You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HAProxy后端ACL中解析域名并授权对应IP访问?

解决方案:HAProxy授权动态域名IP访问后端服务

方案1:使用HAProxy内置nslookup函数(推荐,HAProxy 2.0+支持)

HAProxy 2.0及以上版本支持在ACL中通过nslookup函数实时解析域名,并匹配客户端IP是否为解析结果。步骤如下:

  1. 配置DNS解析器(resolvers)
    首先在配置中添加一个resolvers块,用于解析动态域名:
resolvers dev_resolvers
    nameserver dns1 8.8.8.8:53  # 替换为可用的DNS服务器
    nameserver dns2 8.8.4.4:53
    resolve_retries 3
    timeout resolve 5s
    timeout retry 2s
    hold valid 300s  # 缓存解析结果5分钟,可根据域名IP更新频率调整
  1. 修改后端配置,添加动态IP授权ACL
    更新你的backend srv-web-http-dev_ipvANY配置,新增匹配动态域名解析IP的ACL,并调整允许规则:
backend srv-web-http-dev_ipvANY
    mode            http
    id          105
    log         global
    timeout connect     30000
    timeout server      30000
    retries         3
    acl         INTERNAL_LANS   src 172.1.0.0/16
    acl         INTERNAL_LANS   src 172.2.0.0/16
    acl         INTERNAL_LANS   src 172.3.0.0/16
    # 新增ACL:匹配客户端IP等于动态域名解析后的IP(支持多A记录)
    acl         DEV_ALLOWED_IP  src nslookup(mynameisdev.devdomain.com, dev_resolvers)
    # 允许内网IP或开发者动态IP访问
    http-response allow  if  INTERNAL_LANS or DEV_ALLOWED_IP
    http-response deny 
    server          srv-web-01 172.1.2.3:888 id 117 check inter 1000 resolvers dev_resolvers

关键说明:

  • nslookup函数会自动使用指定的resolvers解析域名,匹配客户端IP是否在解析出的IP列表中
  • hold valid参数控制解析结果的缓存时间,若动态域名IP更新频繁,可适当缩短该值
  • 若动态域名有多个A记录,所有解析出的IP都会被纳入允许范围

方案2:Lua脚本定期更新ACL(兼容低版本HAProxy)

如果你的HAProxy版本低于2.0,不支持nslookup函数,可以通过Lua脚本定期解析域名并更新ACL规则:

  1. 编写Lua脚本(update_dev_ip.lua)
local function update_dev_acl()
    -- 获取配置的resolvers实例
    local resolver = core.resolvers.get("dev_resolvers")
    if not resolver then
        core.log(core.LOG_ERR, "Failed to get resolver dev_resolvers")
        return
    end

    -- 解析动态域名
    local ips, err = resolver:lookup("mynameisdev.devdomain.com")
    if not ips then
        core.log(core.LOG_ERR, "DNS lookup failed: " .. err)
        return
    end

    -- 构建ACL规则字符串(匹配所有解析出的IP)
    local acl_rules = {}
    for _, ip in ipairs(ips) do
        table.insert(acl_rules, "src " .. ip)
    end
    local rule_str = table.concat(acl_rules, " or ")

    -- 更新ACL
    local ok, err = core.acl.set("DEV_ALLOWED_IP", rule_str)
    if not ok then
        core.log(core.LOG_ERR, "Failed to update ACL: " .. err)
    else
        core.log(core.LOG_INFO, "Updated DEV_ALLOWED_IP ACL with rules: " .. rule_str)
    end
end

-- 每5分钟执行一次更新(单位:秒)
core.timer.create(300, update_dev_acl, true)
  1. 修改HAProxy配置
global
    lua-load /path/to/update_dev_ip.lua  # 替换为脚本实际路径
    # ... 其他全局配置 ...

resolvers dev_resolvers
    nameserver dns1 8.8.8.8:53
    nameserver dns2 8.8.4.4:53
    resolve_retries 3
    timeout resolve 5s
    timeout retry 2s

backend srv-web-http-dev_ipvANY
    mode            http
    id          105
    log         global
    timeout connect     30000
    timeout server      30000
    retries         3
    acl         INTERNAL_LANS   src 172.1.0.0/16
    acl         INTERNAL_LANS   src 172.2.0.0/16
    acl         INTERNAL_LANS   src 172.3.0.0/16
    # 初始化空ACL,由Lua脚本动态更新
    acl         DEV_ALLOWED_IP  src -m ip 0.0.0.0/0
    http-response allow  if  INTERNAL_LANS or DEV_ALLOWED_IP
    http-response deny 
    server          srv-web-01 172.1.2.3:888 id 117 check inter 1000 resolvers dev_resolvers

关键说明:

  • 需确保HAProxy编译时启用了Lua支持(通常发行版的HAProxy包已包含)
  • 脚本会定期更新ACL,无需重启HAProxy即可生效
  • 可根据需求调整定时更新的间隔(脚本中的300为秒数)

验证方法

  1. 用haproxy -c -f /etc/haproxy/haproxy.cfg检查配置语法正确性
  2. 查看HAProxy日志,确认域名解析和ACL更新是否正常
  3. 用动态域名对应的IP发起请求,验证是否能正常访问后端服务

内容的提问来源于stack exchange,提问作者execcr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:13:11