You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过HAProxy ACL限制仅允许域名访问后端Web服务器,禁止IP直连访问?

如何通过HAProxy ACL限制仅允许域名访问后端Web服务器,禁止IP直连访问?

我完全懂你遇到的困扰——想用HAProxy的ACL实现只能通过指定域名访问后端服务器,不让用户直接用IP地址直连,但之前配的ACL没生效,肯定挺头疼的。别担心,我来给你梳理正确的配置思路和步骤,保证能解决问题。

核心思路

我们的目标是检查每个请求的Host请求头:只有当请求的Host头是我们预先设定的合法域名时,才允许将请求转发到后端Web服务器;如果是IP地址、非法域名或者不带Host头的请求,直接拒绝访问。

具体配置示例

下面是完整的HAProxy配置片段,你可以根据自己的实际域名和后端服务调整:

1. 配置前端监听和ACL规则

frontend http_front
    # 监听80端口的HTTP请求
    bind *:80
    # 定义ACL:匹配合法的域名,-i表示忽略大小写,多个域名用空格分隔
    acl valid_host hdr(host) -i example.com www.example.com
    # 仅当请求匹配valid_host ACL时,转发到后端服务
    use_backend http_back if valid_host
    # 所有不匹配的请求(比如IP直连、非法Host),转发到拒绝访问的后端
    default_backend forbidden_back

2. 配置合法后端服务

backend http_back
    # 这里替换成你的后端Web服务器地址和端口
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check

3. 配置拒绝访问的后端(返回403)

backend forbidden_back
    # 直接返回403禁止访问状态码
    http-request deny deny_status 403

针对HTTPS请求的配置

如果你的服务用HTTPS,配置逻辑和HTTP一致,只是需要加上SSL证书的配置:

frontend https_front
    bind *:443 ssl crt /path/to/your/ssl_cert.pem
    acl valid_host hdr(host) -i example.com www.example.com
    use_backend https_back if valid_host
    default_backend forbidden_back

backend https_back
    server web1 192.168.1.10:443 ssl check

为什么你之前的ACL没生效?可能的原因

  • ACL匹配规则错误:比如没加-i忽略大小写,导致大小写不一致的域名匹配失败;或者域名拼写错误,比如把example.com写成exmaple.com
  • 规则顺序不对:如果default_backend写在了use_backend前面,所有请求都会直接走到拒绝后端,你的valid_host规则根本不会触发,一定要把use_backend放在default_backend之前。
  • 测试方式不对:有些工具或者旧客户端请求时可能不带Host头,这时候也会被拒绝,你可以用curl -H "Host: example.com" http://your-server-ip/来模拟合法请求,用curl http://your-server-ip/测试IP直连的情况。

进阶优化:返回自定义403页面

如果你不想返回默认的403页面,可以自定义一个:

backend forbidden_back
    # 指定自定义错误页面的路径,文件里要包含完整的HTTP响应头和内容
    errorfile 403 /etc/haproxy/errors/custom_403.http

备注:内容来源于stack exchange,提问作者shazi

火山引擎 最新活动