如何在HAProxy后端ACL中解析域名并授权对应IP访问?
解决方案:HAProxy授权动态域名IP访问后端服务
方案1:使用HAProxy内置nslookup函数(推荐,HAProxy 2.0+支持)
HAProxy 2.0及以上版本支持在ACL中通过nslookup函数实时解析域名,并匹配客户端IP是否为解析结果。步骤如下:
- 配置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更新频率调整
- 修改后端配置,添加动态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规则:
- 编写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)
- 修改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为秒数)
验证方法
- 用
haproxy -c -f /etc/haproxy/haproxy.cfg检查配置语法正确性 - 查看HAProxy日志,确认域名解析和ACL更新是否正常
- 用动态域名对应的IP发起请求,验证是否能正常访问后端服务
内容的提问来源于stack exchange,提问作者execcr
相关产品推荐
相关产品推荐

