动态转发实践

更新时间:
复制 MD 格式

ALB扩展版的动态转发能力可从请求中实时提取目标地址并直接转发,无需预先注册后端,适用于AI Agent Sanbox沙箱调度、海量动态后端入口网关等后端地址动态变化的场景;并通过IP地址段类型服务器组约束目标范围,防止流量转发至未授权后端。

适用场景

动态转发适用于后端地址随请求动态变化、后端实例数量庞大的场景,典型如下:

  • AI Agent沙箱流量调度:AI Agent推理、代码执行等场景运行在大量按需拉起的沙箱实例(如各种Sandbox产品的Pod)上,上层调度器将目标沙箱实例的IP和端口写入请求头,ALB提取后直接转发,无需预先注册频繁变化的沙箱后端。

  • 小程序与H5游戏单域名转发:小程序等平台通常仅允许配置一个合法域名,可在单一域名下通过URL参数(如?ip=1.1.X.X&port=1111)将请求路由到不同的游戏服务器实例,替代自建Nginx方案。

  • 海量动态后端:当后端实例数量庞大时,动态转发按请求实时寻址,无需逐一注册后端,仅需配置允许转发的IP地址段和端口范围,单个实例即可承载海量动态后端,避免因服务器组配额限制而拆分为多个实例。

方案架构

客户端请求到达扩展版ALB实例后,转发规则将流量交给IP地址段类型服务器组所关联的动态转发组件。组件依次经过端点提取、目标范围校验、动态转发三个阶段,确定真实的目标IP和端口,命中允许的目标范围则直接转发到该地址,未命中则返回403。

  • 扩展版ALB实例:提供负载均衡和流量转发能力。

  • IP地址段类型服务器组:以IP地址段和端口范围声明动态转发允许命中的目标范围,必须关联包含动态转发组件的服务扩展。

  • 服务扩展:承载动态转发组件,绑定到IP地址段类型服务器组生效。

  • 动态转发组件:从请求的查询参数或请求头中提取目标主机和端口,完成目标范围校验后将请求转发给后端。

image

适用范围

  • 用户已获取ALB扩展版公测资格

  • 用户已在华东2(上海)地域创建一个专有网络VPC1,分别在可用区B和可用区F创建交换机VSW1VSW2

操作步骤

1. 创建扩展版 ALB 实例

  1. 登录ALB控制台,选择华东2(上海)地域,单击创建应用型负载均衡

  2. 在购买页完成以下配置,单击立即创建

    • 地域:选择华东2(上海)

    • 实例网络类型:选择公网

    • VPC可用区:选择VPC1,勾选上海 可用区B上海 可用区F后选择VSW1VSW2,并自动分配公网IP

    • 协议版本:选择IPv4

    • 功能版本(实例费):选择扩展版

  3. 确认订单页面确认实例配置详情,单击立即开通

2. 创建服务扩展并添加动态转发组件

  1. 服务扩展控制台,单击创建服务扩展。在服务扩展配置区域,输入服务扩展名称ext-dyn-fwd-plugin

  2. 扩展类型默认选择插件组件名称下拉选择动态转发。在快捷配置(点击自动填充当前规则参数)下方单击常用Header使用系统预置模板,然后单击创建

    • 提取来源:默认值Header,即从HTTP请求头中提取目标IP和端口。

    • 提取模式:默认值分离模式,目标IP和端口位于两个不同字段,需分别指定。

    • 目标Host来源:默认值X-Target-Host,动态转发组件从该请求头读取目标IP。

    • 目标Port来源:默认值X-Target-Port,动态转发组件从该请求头读取目标端口。

    • 默认端口:默认值80,未从请求中提取到端口时的兜底端口。

动态转发组件不支持与其他组件添加到同一个服务扩展。

3. 准备后端服务

  1. 参考以下配置,创建一台ECS。ECS所在安全组需放通VPC1的网段IP。

    • 地域:选择华东2(上海)

    • 网络及可用区:选择VPC1VSW1,并勾选指定主网卡主私网IP地址。本文中VSW1对应IP地址段172.16.10.0/24,指定主网卡主私网IP地址为172.16.10.100

    • 镜像:选择Alibaba Cloud Linux 3.2104 LTS 64

  2. ECS控制台找到该实例,依次单击操作列的选择 > 网络和安全组 > 管理辅助私网 IP。单击增加,填入172.16.10.101后单击确定。参考操作系统识别辅助私网IP地址配置使ECS识别该IP。连接ECS并输入ip a,可看到ECS已识别辅助私网地址。

      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000                                                                                     
          link/ether 00:16:3e:xx:xx:xx brd ff:ff:ff:ff:ff:ff                                                                                                                                  
          altname enp3s0                                                                                                                                                                      
          inet 172.16.10.100/24 brd 172.16.10.255 scope global noprefixroute eth0                                                                                                              
             valid_lft forever preferred_lft forever                                                                                                                                          
          inet 172.16.10.101/24 brd 172.16.10.255 scope global secondary noprefixroute eth0                                                                                                  
             valid_lft forever preferred_lft forever                                                                                                                                          
          inet6 fe80::xxxx:xxff:fexx:xxxx/64 scope link                                                                                                                                     
             valid_lft forever preferred_lft forever   
  3. 在后端ECS上安装nginx并部署echo回显服务,监听8081端口,对任意请求返回其实际到达的目标IP:Port,用于验证动态转发的落点。

    # 1. 安装 nginx
    sudo dnf install -y nginx
    
    # 2. 写入 echo 回显配置
    sudo tee /etc/nginx/conf.d/echo.conf >/dev/null <<'EOF'
    server {
        listen 80 default_server;
        listen 81 default_server;
        server_name _;
        location / {
            default_type text/plain;
            return 200 "served: $server_addr:$server_port\n";
        }
    }
    EOF
    
    # 3. 去掉自带默认站点的 default_server 标记,避免冲突
    sudo sed -i 's/ default_server//g' /etc/nginx/nginx.conf
    
    # 4. 校验配置、设置开机自启并启动
    sudo nginx -t
    sudo systemctl enable nginx
    sudo systemctl restart nginx
    
    # 5. 本机自测
    curl 172.16.10.100:80
    curl 172.16.10.100:81
    curl 172.16.10.101:80
    curl 172.16.10.101:81

4. 创建 IP 地址段类型服务器组

动态转发根据请求内容决定转发目标,若不加约束可能被构造请求诱导转发到非预期地址,形成SSRF风险。配置IP地址段服务器组作为强制安全边界:仅当目标IP与端口命中放行条目才转发,未命中一律返回403。

  1. 服务器组控制台,单击创建服务器组

  2. 完成以下配置,单击创建

    • 服务器组类型:选择IP地址段。

    • 服务器组名称:输入自定义名称如sgp-dyn-fwd

    • 后端协议:默认选择HTTP

    • 使用已有服务扩展并勾选步骤1中创建的服务扩展ext-dyn-fwd-plugin

  3. 服务器组创建成功,单击添加后端服务器。在添加IP地址段窗口,输入IP地址段172.16.10.0/24端口范围80-81,单击确定

5. 创建监听

  1. ALB控制台,单击目标实例ID进入实例详情页。在监听页签单击创建监听

  2. 配置监听步骤,选择监听协议HTTPS监听端口填写443,完成后单击下一步

  3. 配置SSL证书步骤,选择与自定义域名匹配的服务器证书,单击下一步

  4. 选择服务器组步骤,依次选择IP地址段类型和服务器组sgp-dyn-fwd,完成后单击下一步

    此处使用默认转发规则将流量转发至IP地址段服务器组。如需叠加身份鉴权、限速等能力,可在监听下另建转发规则并关联对应服务扩展。
  5. 配置审核步骤,确认配置并单击提交

6. 设置域名解析

将自有域名通过CNAME解析指向ALB实例的DNS名称,客户端通过自有域名访问ALB。

本文以阿里云云解析DNS为例,对于非阿里云注册域名,需先将域名添加到云解析控制台

  1. ALB控制台,复制目标实例的DNS 名称

  2. 登录域名解析控制台,在目标域名的操作列单击解析设置。在解析设置页面单击添加记录

  3. 参考以下信息添加CNAME记录,完成后单击确定

    • 记录类型:选择CNAME

    • 主机记录:输入域名前缀如test。假设用户自有根域名为example.com,则访问ALB的域名为test.example.com

    • 解析请求来源TTL时间:保持默认。

    • 记录值:输入ALB实例的DNS名称。

  4. 在弹出的解析变更确认对话框确认解析信息,单击确定

7. 验证测试

请求需满足以下条件才能被正常响应:

  • 动态转发组件能够从请求中提取出目标IP和端口(未显式携带端口时以默认端口兜底)。

  • IP和端口的组合落在IP地址段服务器组的放行范围内。

  • 后端服务在上述IP和端口监听并返回响应。

请求携带合法目标地址

转发到主IP地址
curl -v \
  -H "X-Target-Host: 172.16.10.100" \
  -H "X-Target-Port: 80" \
  https://test.example.com/echo

预期响应HTTP 200,回显served: 172.16.10.100:80

转发到辅助IP(验证不同IP)
curl -v \
  -H "X-Target-Host: 172.16.10.101" \
  -H "X-Target-Port: 80" \
  https://test.example.com/echo

预期响应HTTP 200,回显served: 172.16.10.101:80。证明目标IP随请求动态变化。

转发到不同端口(验证不同端口)
curl -v \
  -H "X-Target-Host: 172.16.10.100" \
  -H "X-Target-Port: 81" \
  https://test.example.com/echo

预期响应HTTP 200,回显served: 172.16.10.100:81。证明目标端口同样随请求动态变化。

不携带端口(验证默认端口兜底)
curl -v \
  -H "X-Target-Host: 172.16.10.101" \
  https://test.example.com/echo

预期响应HTTP 200,回显served: 172.16.10.101:80。请求未携带端口,动态转发组件以默认端口80兜底。

请求未携带目标地址

curl -v \
  https://test.example.com/echo

预期响应HTTP 403,回显endpoint not provided。动态转发组件无法从请求中提取目标IP地址。

目标地址或端口未在允许范围内

curl -v \
  -H "X-Target-Host: 10.99.99.99" \
  -H "X-Target-Port: 80" \
  https://test.example.com/echo
curl -v \
  -H "X-Target-Host: 172.16.10.100" \
  -H "X-Target-Port: 12345" \
  https://test.example.com/echo

预期响应HTTP 403,回显endpoint not allowed。提取到的IP地址或端口因未落在服务器组允许范围内被拒绝。

更多信息

计费说明

  • ALB扩展版:目前处于公测阶段,用户可免费体验。扩展版ALB实例绑定的 EIP 有独立的计费规则,费用由EIP收取。

  • ECS实例:详见ECS计费概述。若出于测试目的创建ECS,建议创建低规格的按量付费实例并及时释放。

  • 域名和公网DNS解析费用:除了需要支付域名供应商的域名费用外,在阿里云配置公网DNS解析需要支付公网权威解析费用

  • 证书费用:从阿里云购买证书或将证书上传至阿里云,需要支付服务器证书费用

使用限制

  • 动态转发后端协议当前仅支持HTTP。

  • IP地址段类型服务器组不支持添加22.0.0.0/833.0.0.0/8100.0.0.0/8127.0.0.0/8等地址段。

  • 单个IP地址段类型服务器组默认支持最多200IP段条目(每条为一个IP段与端口范围的组合)。

ALB扩展版支持的地域

区域

地域

可用区

中国

华北6(乌兰察布)

可用区A、可用区B、可用区C

华东1(杭州)

可用区J、可用区K

华北2(北京)

可用区I、可用区K、可用区L

华东2(上海)

可用区B、可用区F

中国香港

可用区B、可用区C、可用区D

亚太

新加坡

可用区A、可用区B、可用区C

日本(东京)

可用区B、可用区C、可用区E

马来西亚(吉隆坡)

可用区A、可用区B、可用区C

欧洲与美洲

德国(法兰克福)

可用区A、可用区B

美国(硅谷)

可用区A、可用区B

中东

阿联酋(迪拜)

可用区A、可用区B

使用建议

  • 合理排序多条目标地址提取配置:配置多条目标地址提取配置时,系统按配置序号从小到大依次匹配,首条命中即生效。建议将命中率最高、最严格的配置排在前面。

  • 收敛允许的目标范围:在保障业务可用的前提下,尽量收敛IP地址段与端口范围,仅放行业务实际需要的后端,避免配置过宽的范围。

  • 配合转发规则灵活使用:IP地址段类型服务器组可作为转发规则的转发目标,与转发条件、服务扩展、转发动作灵活组合,满足复杂流量编排需求。

常见问题

请求全部403,响应endpoint not allowed

确认IP地址段服务器组已正确配置IP和端口范围,且请求携带的目标IP和端口落在该范围中。

请求全部403,响应体endpoint not provided

检查请求是否包含X-Target-HostX-Target-Port等字段,可查看ALB访问日志确认。