Skip to content

快速创建UDP虚拟服务

简介

UDP 虚拟服务是四层负载均衡的另一种形态,工作在传输层,面向无连接的 UDP 协议。与 TCP 不同,UDP 不建立连接、不保证可靠传输,因此负载均衡的行为也有所不同——每个 UDP 数据包独立转发,没有"连接"的概念。

如果您熟悉 NGINX,UDP 虚拟服务对应 stream {} 块中配置了 udp 参数的 server 指令。

典型场景:

  • DNS 服务器负载均衡(DNS 查询基于 UDP)
  • 视频流、VoIP、实时通信
  • Syslog / SNMP 等网络管理协议
  • 在线游戏的 UDP 协议转发
  • QUIC / HTTP/3(新一代 Web 协议)

与 TCP 虚拟服务的区别

维度TCPUDP
连接模型面向连接(三次握手)无连接
可靠性可靠传输(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 服务
ICMPPing 主机仅需确认主机存活

入口:【SLB 本地负载 → 健康检查】,协议选择 UDP

配置项示例值说明
策略名称dns-udp-check
协议UDP
端口复用监听端口(使用节点在服务器池中配置的端口)
内容验证可选开启发送查询字符串并验证响应
高级配置推荐开启下线快、上线慢

对于 DNS 服务,也可使用专门的 DNS 协议健康检查,能验证 DNS 查询返回的正确性。

参见 健康检查配置指南

第三步:创建服务器池

入口:【SLB 本地负载 → 服务器池】,点击"新增":

配置项示例值说明
服务器池名称dns-backend-pool
负载均衡算法轮询算法DNS 请求通常短小且均匀,轮询即可
健康检查dns-udp-check绑定第二步创建的策略
转发引擎engine117
目标节点10.1.9.114:53
10.1.9.117:53
DNS 服务默认端口

负载均衡算法选择参见 快速创建TCP虚拟服务 - 算法建议

第四步:创建四层 UDP 策略

入口:【SLB 本地负载 → 策略配置 → 四层策略 → 虚拟服务UDP策略】,点击"新增":

四层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
端口53DNS 默认端口

默认分发规则

配置项示例值
处理方式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 虚拟服务详细配置参见 虚拟服务用户手册。四层分发规则参见 四层分发规则用户手册