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

Ubuntu 16.04配置Nginx UDP DSR时tc filter命令报错咨询

问题分析与解决

1. tc filter命令的错误原因

你遇到的Illegal "match"错误,核心问题是错误地使用了ip sport匹配规则——IP协议层并没有源端口(sport)字段,源端口是UDP/TCP等传输层协议的属性。因为你配置的是UDP负载均衡(53端口是DNS的UDP端口),所以需要明确指定UDP协议来匹配端口。

另外,Ubuntu 16.04使用的iproute2版本较旧,部分tc语法需要更严谨的格式,比如端口匹配需要加上掩码(虽然默认全匹配,但旧版本可能要求显式指定),同时nat动作的语法也需要调整。

修正后的命令

tc filter add dev eth0 parent 10: protocol ip prio 10 u32 \
  match ip src 172.16.0.11/32 \
  match udp sport 53 0xffff \
  action nat egress ip src 172.16.0.11 to 192.168.99.10

关键修正点:

  • 将match ip sport 53改为match udp sport 53 0xffff:明确匹配UDP协议的源端口,0xffff是端口的全匹配掩码
  • 调整nat动作的语法:旧版本tc的nat egress需要明确指定ip src和to来定义地址转换规则
  • 给源IP加上/32掩码:显式指定匹配单个IP,避免模糊匹配

2. 使用IPVS是否更简单?

绝对是的!IPVS(IP Virtual Server)是Linux内核专门为负载均衡设计的模块,相比手动编写tc规则,它的配置更直观、更简洁,且原生支持DSR、NAT、TUN等多种负载均衡模式,尤其适合UDP/TCP的负载均衡场景。

比如配置UDP DSR负载均衡,你只需要几步:

  1. 加载IPVS模块:
modprobe ip_vs
modprobe ip_vs_udp
  1. 添加虚拟服务:
ipvsadm -A -u <虚拟IP>:53 -s rr  # rr是轮询调度算法,可按需替换
  1. 添加后端服务器(DSR模式下指定-g参数):
ipvsadm -a -u <虚拟IP>:53 -r <后端IP>:53 -g
  1. 配置后端服务器的ARP抑制(DSR模式必需,避免后端响应直接返回给客户端):
# 在每台后端服务器上执行
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

IPVS会自动处理底层的数据包转发和地址转换逻辑,不需要你手动编写复杂的tc规则,出错概率低,维护也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:45:50