快速创建UDP虚拟服务
简介
UDP 虚拟服务是四层负载均衡的另一种形态,工作在传输层,面向无连接的 UDP 协议。与 TCP 不同,UDP 不建立连接、不保证可靠传输,因此负载均衡的行为也有所不同——每个 UDP 数据包独立转发,没有"连接"的概念。
如果您熟悉 NGINX,UDP 虚拟服务对应 stream {} 块中配置了 udp 参数的 server 指令。
典型场景:
- DNS 服务器负载均衡(DNS 查询基于 UDP)
- 视频流、VoIP、实时通信
- Syslog / SNMP 等网络管理协议
- 在线游戏的 UDP 协议转发
- QUIC / HTTP/3(新一代 Web 协议)
与 TCP 虚拟服务的区别
| 维度 | TCP | UDP |
|---|---|---|
| 连接模型 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠传输(ACK 确认、重传) | 不保证可靠,业务层自行处理 |
| 处理方式 | TCP 代理 | UDP 代理 |
| 策略 | TCP 策略 | UDP 策略 |
| 会话保持 | 源地址 | 源地址 |
| 健康检查 | TCP / ICMP 等 | UDP / ICMP |
| 并发控制 | 连接数 | 请求数(基于数据包) |
操作步骤概览
第一步:创建转发引擎 → 与 TCP 一致
第二步:创建健康检查策略 → UDP 协议或 ICMP
第三步:创建服务器池 → 后端节点 + 负载均衡算法
第四步:创建四层 UDP 策略 → 白名单、最大并发请求等
第五步:创建虚拟服务 → 选择 UDP 类型
第六步:变更执行并验证 → 验证 UDP 数据包转发下面以将 10.1.9.117:53 的 UDP DNS 流量分发到后端两台 DNS 服务器为例。
第一步:创建转发引擎
与 TCP 虚拟服务完全一致。参见 快速创建TCP虚拟服务 - 创建转发引擎。
第二步:创建健康检查策略
UDP 协议的探测方式与 TCP 不同——UDP 没有握手,因此不能简单通过"端口是否响应 SYN-ACK"来判断。推荐:
| 协议 | 原理 | 适用场景 |
|---|---|---|
| UDP | 发送探测报文,如果超时未收到报错(如 ICMP Port Unreachable),则判定健康 | DNS、一般 UDP 服务 |
| ICMP | Ping 主机 | 仅需确认主机存活 |
入口:【SLB 本地负载 → 健康检查】,协议选择 UDP:
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 策略名称 | dns-udp-check | |
| 协议 | UDP | |
| 端口 | 复用监听端口(使用节点在服务器池中配置的端口) | |
| 内容验证 | 可选开启 | 发送查询字符串并验证响应 |
| 高级配置 | 推荐开启 | 下线快、上线慢 |
对于 DNS 服务,也可使用专门的 DNS 协议健康检查,能验证 DNS 查询返回的正确性。
参见 健康检查配置指南。
第三步:创建服务器池
入口:【SLB 本地负载 → 服务器池】,点击"新增":
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 服务器池名称 | dns-backend-pool | |
| 负载均衡算法 | 轮询算法 | DNS 请求通常短小且均匀,轮询即可 |
| 健康检查 | dns-udp-check | 绑定第二步创建的策略 |
| 转发引擎 | engine117 | |
| 目标节点 | 10.1.9.114:5310.1.9.117:53 | DNS 服务默认端口 |
负载均衡算法选择参见 快速创建TCP虚拟服务 - 算法建议。
第四步:创建四层 UDP 策略
入口:【SLB 本地负载 → 策略配置 → 四层策略 → 虚拟服务UDP策略】,点击"新增":

| 配置项 | 作用 | 建议 |
|---|---|---|
| 白名单 IP | 只允许指定 IP 访问 | 按需 |
| 黑名单 IP | 禁止指定 IP 访问 | 按需 |
| 会话保持策略 | TCP/UDP 场景仅支持源地址方式 | DNS 通常不需要会话保持 |
| 最大并发请求 | 全局最大并发 UDP 请求数 | 不限制或按流量估算 |
| 每秒最大处理请求数 | 限速保护 | 防止 UDP 洪水攻击 |
| 窗口时间内最大并发请求 | 滑动窗口限流 | 配合窗口时间大小使用 |
| 客户端最大并发请求数 | 单客户端 IP 的最大并发请求 | 防止单个客户端耗尽资源 |
与 TCP 策略的关键差异:
- UDP 没有"连接",因此策略中控制的是请求数(数据包),而非"连接数"
- UDP 不支持 SNAT(源地址转换)和 Proxy Protocol 溯源
- 会话保持仅支持源地址方式(通过客户端 IP 识别同一"会话")
完整字段说明参见 四层策略用户手册。
第五步:创建虚拟服务
入口:【SLB 本地负载 → 虚拟服务】,点击"新增"。
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 名称 | dns-proxy | |
| 对象类型 | 转发引擎 或 流量组 | |
| 协议 | UDP | 关键区别 |
| 监听地址 | 10.1.9.117 | |
| 端口 | 53 | DNS 默认端口 |
默认分发规则
| 配置项 | 示例值 |
|---|---|
| 处理方式 | UDP 代理 |
| 服务器池 | dns-backend-pool |
| UDP 策略 | 选择第四步创建的 UDP 策略(或系统内置的 UDP 策略模板) |
配置完成后点击"确认"保存。
第六步:变更执行并验证
变更执行
点击"变更执行"使配置生效。
验证
UDP 不能用 curl(那是 HTTP/TCP 工具),使用以下方式验证:
bash
# DNS 查询验证(dig 命令)
dig @10.1.9.117 www.example.com
# nslookup 验证
nslookup www.example.com 10.1.9.117
# 通用 UDP 发包测试(nc)
echo "test" | nc -u 10.1.9.117 53
# 使用 Python 发送 UDP 包测试
python3 -c "
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'test', ('10.1.9.117', 53))
s.settimeout(2)
try:
data, addr = s.recvfrom(1024)
print(f'Received response from {addr}: {data}')
except socket.timeout:
print('No response (this may be normal for some UDP services)')
"如果 dig/nslookup 返回了正确的 DNS 解析结果,表示 UDP 虚拟服务工作正常。
排障提示
| 现象 | 可能原因 |
|---|---|
| 发送数据包后无响应 | UDP 是无连接协议,不返回响应是正常的(取决于后端服务) |
| 响应超时 | 后端服务未监听目标端口、防火墙拦截 UDP、MTU 过大导致分片丢失 |
| 间歇性丢包 | UDP 不保证可靠传输,需业务层重试;也可能是后端负载过高 |
| 无法通过健康检查 | 确认后端 UDP 端口是否正常监听(nc -u 测试) |
UDP 虚拟服务详细配置参见 虚拟服务用户手册。四层分发规则参见 四层分发规则用户手册。
