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

如何通过HAProxy与DNS实现指定域名请求的IP替换及转发

解决方案:HAProxy + DNS 实现指定域名的代理转发(多域名支持)

刚好我之前处理过类似的需求,HAProxy完全能解决你遇到的多域名问题,咱们一步步拆解实现:

一、先搞定DNS的条件转发逻辑

首先你的DNS服务器得做「针对性解析」:

  • 当客户端请求ABC.com或者def.com的DNS记录时,直接返回你HAProxy服务器的公网IP;
  • 其他所有域名的请求,正常转发到公共DNS(比如谷歌的8.8.8.8或者Cloudflare的1.1.1.1),这样客户端访问其他网站不会经过你的HAProxy。

举个例子,如果你用Bind做DNS,只需要在配置文件里给这两个域名单独加zone规则,指定它们的A记录指向HAProxy的IP就行,其他域名用forwarders字段转发到公共DNS。

二、HAProxy多域名代理配置

HAProxy对基于域名的路由支持非常友好,下面是核心的配置示例,直接就能用:

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend proxy_frontend
    bind *:80
    # 如果要支持HTTPS,这里绑定443端口并配置多域名证书(覆盖abc.com和def.com)
    bind *:443 ssl crt /etc/haproxy/certs/
    # 用ACL规则匹配目标域名(-i 是忽略大小写)
    acl match_abc hdr(host) -i abc.com www.abc.com
    acl match_def hdr(host) -i def.com www.def.com
    # 只有匹配到这两个域名的请求才转发到后端,其他请求可以直接返回403或者拒绝
    use_backend target_sites if match_abc or match_def

backend target_sites
    # 这里HAProxy默认会用自身IP访问目标服务器,完美符合你的需求
    # 如果不需要传递客户端IP,完全不用加forwardfor相关配置
    # 配置目标域名的服务器,HTTP和HTTPS分开配置
    server abc_http abc.com:80 check
    server abc_https abc.com:443 ssl check verify none
    server def_http def.com:80 check
    server def_https def.com:443 ssl check verify none
    # 负载均衡策略用默认的轮询就行,也可以根据需求调整
    balance roundrobin

关键配置说明:

  1. ACL规则:通过hdr(host)匹配请求头里的域名,支持带www的子域名,用or逻辑同时匹配两个域名;
  2. HTTPS支持:如果客户端访问HTTPS,一定要在frontend绑定443端口,并且配置包含两个域名的SSL证书(可以申请免费的Let's Encrypt多域名证书);
  3. 源IP控制:HAProxy默认就会用自身的IP作为源IP去访问目标服务器,目标网站的日志里只会看到HAProxy的IP,完全满足你“以自身IP访问目标域名”的要求;
  4. 其他请求处理:如果客户端访问非指定域名,HAProxy默认会返回503,你也可以在frontend里加个default_backend返回自定义页面或者403。

三、关于“修改客户端请求IP转发”的补充说明

你提到的这个需求,其实就是上面配置的核心逻辑:

  1. DNS把指定域名解析到HAProxy,客户端的请求全发到HAProxy上;
  2. HAProxy作为反向代理,用自己的IP去请求目标网站的真实服务器;
  3. 目标网站收到的请求源IP是HAProxy的IP,客户端的真实IP被隐藏;
  4. HAProxy把目标网站的响应原封不动返回给客户端,客户端全程不知道真实的目标服务器IP。

如果某些场景下你需要让目标网站知道客户端的真实IP,只需要在backend里加一行option forwardfor header X-Forwarded-For,这样HAProxy会在请求头里带上客户端的真实IP,但源IP还是HAProxy的IP,不影响你的核心需求。

四、测试验证步骤

  1. 把客户端的DNS服务器改成你的域名服务器;
  2. 访问abc.com或者def.com,然后去目标网站的日志里查,确认请求源IP是HAProxy的IP;
  3. 访问其他网站(比如baidu.com),确认请求直接走公共DNS,不会经过你的HAProxy。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:40