OpenWrt中GRE接口配置TC qdisc后Ping不通问题求助
排查OpenWrt GRE接口添加TC Qdisc后Ping失败的问题
你遇到的核心问题其实很明确——在未创建对应TC类的情况下,指定了不存在的默认类,导致所有数据包被直接丢弃。我来一步步帮你分析和解决:
问题根源拆解
你执行的这条命令:
tc qdisc add dev gre1 root handle 1: default 2
其中default 2表示所有未匹配到过滤器的数据包,都会被转发到类1:2处理。但此时你还没创建这个类,TC的根qdisc找不到对应的处理路径,就会直接丢弃所有进入gre1接口的数据包——这就是Ping失败、抓包看不到任何数据的原因。
修复与正确配置步骤
1. 先恢复接口连通性
首先移除当前有问题的根qdisc,让gre1回到正常工作状态:
tc qdisc del dev gre1 root
这时候再Ping隧道接口,应该能恢复正常连通。
2. 标准TC流量控制配置(以HTB为例)
HTB是OpenWrt中最常用的流量调度器,我们按照规范流程来配置:
- 第一步:添加根HTB qdisc
先创建根qdisc,暂时不指定默认类(避免提前依赖未创建的类):tc qdisc add dev gre1 root handle 1: htb - 第二步:创建默认处理类
创建根类1:1作为默认流量的处理类,带宽值根据你的实际网络调整:tc class add dev gre1 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit - 第三步:绑定默认类到根qdisc
把根qdisc的默认流量指向刚创建的1:1类:tc qdisc change dev gre1 root handle 1: htb default 1 - 第四步:按需创建限流子类(可选)
如果需要对特定流量做限流,可以继续创建子类,比如限制某类流量到10Mbit:
后续可以通过tc class add dev gre1 parent 1: classid 1:2 htb rate 10mbit ceil 20mbittc filter规则把目标流量导向这个子类。
配置验证
完成配置后,执行以下命令查看TC统计信息,确认数据包被正常处理:
# 查看qdisc的流量统计 tc -p -s -d qdisc show dev gre1 # 查看各个类的流量统计 tc -p -s -d class show dev gre1
此时再Ping隧道接口,应该能正常连通,抓包gre1也能看到数据包了。
额外注意事项
- TC的qdisc默认在**出口方向(egress)**处理流量,抓包时要关注gre1的发送包;
- 确保OpenWrt已安装TC工具包:
opkg install tc(你能执行tc命令的话应该已经安装); - 如果需要针对入口流量(ingress)做控制,需要单独配置ingress qdisc,流程和出口配置不同。
内容的提问来源于stack exchange,提问作者Shihab Pullissery
相关产品推荐
相关产品推荐

