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负载均衡,你只需要几步:
- 加载IPVS模块:
modprobe ip_vs modprobe ip_vs_udp
- 添加虚拟服务:
ipvsadm -A -u <虚拟IP>:53 -s rr # rr是轮询调度算法,可按需替换
- 添加后端服务器(DSR模式下指定
-g参数):
ipvsadm -a -u <虚拟IP>:53 -r <后端IP>:53 -g
- 配置后端服务器的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
相关产品推荐
相关产品推荐

