找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 590|回复: 2

ImmortalWrt-QOS 脚本

[复制链接]
发表于 2026-5-22 15:41 | 显示全部楼层 |阅读模式
本帖最后由 滑稽的菊花 于 2026-5-22 16:32 编辑



———————————-
复制粘贴到xxx.sh 文件内,
上传路由器,
chmod 755 xxx.sh 修改权限,
直接运行。
——————————————
脚本使用 deepseekv4-pro 生成;
测试路由器环境:
RedMi AX6S 刷入 ImmortalWrt 25.12.0-rc2
按照脚本生成的测试命令,反馈给AI,AI说已正常运行,实际体验还可以。
———————————————-
公寓带宽上传约9M、下载约30M。
填写时可少写1~10M,防止占用过高。
————————————————-
测试内网环境:
1电脑、5手机,电脑游戏多开,手机刷bilibili。
电脑单开游戏流畅无掉线(CF、英雄联盟、300英雄)。
电脑多开游戏卡顿小概率掉线(后台双开300英雄,前台战地5或CF,其中一个300英雄延迟会非常高,40%概率掉线,但CF 或 战地 不会掉线)
手机B站视频缓冲3-6秒,不快进或加速播放可流畅观看,快进则缓冲3-10秒。(480p缓冲3-5秒、720缓冲5-8秒、1080缓冲6-9秒,估计大概是这个范围)

总结:带宽太小,估计下载35M-40M,上传10M-13M,5台设备同时用网,不会有缓冲。
若使用出现问题,请使用 deepseekv4-pro,复制粘贴代码 和 报错信息,让AI解决。
——————————————————————–
修改的参数位置:
ctrl+f 搜索,然后修改以下位置的参数(kbit):

—- 网络接口配置 —-
—- 带宽配置(kbit)—-
—- 上传各类保证带宽(kbit)—-
—- 下载各类保证带宽(kbit)—-
—————————————————————————


  1. #!/bin/sh

  2. # ============================================================
  3. # ImmortalWrt 智能 QoS 游戏优化版 v2.5
  4. # 文件名: qos-game-optimized.sh
  5. # 适用平台: ImmortalWrt 25.10 R2 (apk包管理器)
  6. # ============================================================

  7. # ============================================================
  8. # 【脚本大纲】
  9. # ============================================================
  10. #
  11. #   零、执行前检查
  12. #      0.1 检查root权限
  13. #      0.2 检测包管理器类型(apk/opkg)
  14. #      0.3 检查并安装依赖包(apk方式)
  15. #      0.4 检测网络接口(WAN/IPv6/LAN)
  16. #      0.5 验证关键内核模块
  17. #
  18. #   一、环境准备
  19. #      1.1 备份当前规则(iptables + tc)
  20. #      1.2 清理旧QoS规则(包括IPv6接口)
  21. #      1.3 加载内核模块(静默+验证)
  22. #      1.4 配置用户参数(带宽/优先级/端口)
  23. #
  24. #   二、虚拟网卡初始化
  25. #      2.1 创建/复用ifb0(上传整形)
  26. #      2.2 创建/复用ifb1(下载整形)
  27. #      2.3 启用虚拟网卡
  28. #
  29. #   三、HTB队列配置
  30. #      3.1 上传HTB队列树(ifb0)
  31. #          - 根队列 1:(总带宽控制)
  32. #          - 子类 1:10~50(优先级队列)
  33. #          - 叶子qdisc: 购物_codel(自动回退pfifo)
  34. #      3.2 下载HTB队列树(ifb1)
  35. #          - 根队列 2:(总带宽控制)
  36. #          - 子类 2:10~50(优先级队列)
  37. #          - 叶子qdisc: 购物_codel(自动回退pfifo)
  38. #
  39. #   四、流量重定向配置
  40. #      4.1 下行重定向(支持多接口IPv4/IPv6分离)
  41. #          - 检测IPv6接口(pppoe-wan/pppoe-wan6/wan6)
  42. #          - IPv4: WAN ingress → ifb1
  43. #          - IPv6: 独立接口或共用接口处理
  44. #      4.2 上传重定向(支持多接口IPv4/IPv6分离)
  45. #          - IPv4: WAN egress → ifb0
  46. #          - IPv6: 独立接口或共用接口处理
  47. #
  48. #   五、防火墙标记规则
  49. #      5.1 游戏流量识别(P10 - 最高优先级)
  50. #          - UDP游戏端口范围(5060-60000)
  51. #          - TCP游戏管理端口
  52. #          - UDP小包特征(1024-65535, len≤512)
  53. #      5.2 DNS/ICMP/小包标记(P15 - 次高优先级)
  54. #          - DNS查询(UDP/TCP 53)
  55. #          - ICMP/ICMPv6控制报文
  56. #          - 非UDP小包(≤256字节)
  57. #      5.3 微信/支付/通讯标记(P20 - 中高优先级)
  58. #          - 微信专用端口
  59. #          - SNI字符串匹配(weixin/wechat)
  60. #      5.4 普通网页标记(P25 - 中等优先级)
  61. #          - HTTP/HTTPS/QUIC
  62. #      5.5 视频/下载标记(P35 - 低优先级)
  63. #          - 视频平台SNI匹配
  64. #          - 大流量端口
  65. #      5.6 默认流量标记(P30 - 中低优先级)
  66. #      5.7 Conntrack标记保存(IPv4+IPv6)
  67. #
  68. #   六、FW过滤器绑定
  69. #      6.1 ifb0 fw过滤器(上传方向,mark→class映射)
  70. #      6.2 ifb1 fw过滤器(下载方向,mark→class映射)
  71. #
  72. #   七、验证与监控
  73. #      7.1 规则统计输出
  74. #      7.2 IPv6支持状态
  75. #      7.3 游戏连接统计
  76. #      7.4 验证命令和故障排查
  77. #
  78. # ============================================================
  79. # 【依赖包说明 - apk版本】
  80. # ============================================================
  81. #
  82. # 【必需包】(apk包名可能与opkg不同)
  83. #   - kmod-ifb               : 虚拟网卡ifb模块
  84. #   - kmod-sched-connmark    : tc connmark action
  85. #   - kmod-sched-core        : tc调度核心(HTB、购物_codel等)
  86. #   - kmod-ipt-connmark      : CONNMARK目标
  87. #   - iptables-mod-extra     : multiport、string、length匹配
  88. #   - tc-tiny 或 tc-full     : 流量控制工具
  89. #   - ip-tiny 或 ip-full     : iproute2工具
  90. #   - iptables-nft 或 iptables-legacy : 防火墙工具
  91. #
  92. # 【安装命令 - apk】
  93. #   apk update
  94. #   apk add kmod-ifb kmod-sched-connmark kmod-sched-core \
  95. #           kmod-ipt-connmark iptables-mod-extra tc-tiny ip-tiny
  96. #
  97. # 【可选包】
  98. #   - kmod-ipt-ipopt         : IP选项匹配
  99. #   - conntrack-tools        : 连接跟踪调试工具
  100. #
  101. # ============================================================
  102. # 【核心概念讲解】
  103. # ============================================================
  104. #
  105. # 1. IFB(Intermediate Functional Block)
  106. #    - 虚拟网络设备,用于流量重定向和整形
  107. #    - ifb0: 处理上传流量(egress方向重定向)
  108. #    - ifb1: 处理下载流量(ingress方向重定向)
  109. #
  110. # 2. HTB(Hierarchical Token Bucket)
  111. #    - 层次化令牌桶算法
  112. #    - rate: 保证带宽(kbit/s)
  113. #    - ceil: 最大可借用带宽
  114. #    - prio: 优先级(0-7,0最高)
  115. #    - quantum: 每次轮询发送的字节数
  116. #
  117. # 3. 购物_codel(Fair Queueing with Controlled Delay)
  118. #    - 公平排队 + CoDel AQM算法
  119. #    - 在同一类内部公平分配带宽
  120. #    - 减少bufferbloat,降低延迟
  121. #
  122. # 4. CONNMARK机制
  123. #    - 上传: iptables设置skb->mark → CONNMARK保存到conntrack
  124. #    - 下载: tc action connmark恢复conntrack标记 → 对称QoS
  125. #
  126. # 5. 标记系统(fwmark → HTB类映射)
  127. #    - 10: 游戏/语音(最高优先级, prio 0)
  128. #    - 15: DNS/ICMP/小包(prio 1)
  129. #    - 20: 微信/支付(prio 2)
  130. #    - 25: 普通网页(prio 3)
  131. #    - 30: 默认流量(prio 4)
  132. #    - 35: 视频/下载(prio 5)
  133. #    - 40-50: 备用保留
  134. #
  135. # ============================================================
  136. # 【常见游戏端口参考】
  137. # ============================================================
  138. #
  139. # Steam:       TCP 27014-27050, UDP 27000-27100, 3478
  140. # 英雄联盟:    TCP 2099, 5222-5223, UDP 5000-5500
  141. # CS:GO:       UDP 27000-27030, 3478
  142. # DOTA2:       UDP 27000-27100
  143. # PUBG:        UDP 7000-8000, 10000-20000
  144. # 堡垒之夜:    UDP 9000-9100, 3478-3479
  145. # Discord:     UDP 3478-3481, 50000-60000
  146. #
  147. # ============================================================

  148. # ============================================================
  149. # 第零步:执行前检查
  150. # ============================================================

  151. echo "=========================================="
  152. echo " ImmortalWrt 游戏优化 QoS v2.5"
  153. echo " 适配版本: 25.10 R2 (apk)"
  154. echo "=========================================="
  155. echo ""

  156. # 0.1 检查root权限
  157. if [ "$(id -u)" != "0" ]; then
  158.    echo "❌ 错误: 此脚本必须以root身份运行"
  159.    exit 1
  160. fi
  161. echo "✓ Root权限检查通过"

  162. # 0.2 检测包管理器类型
  163. echo "→ 检测包管理器..."
  164. PKG_MGR=""
  165. if command -v apk >/dev/null 2>&1; then
  166.     PKG_MGR="apk"
  167.     echo "  ✓ 检测到apk包管理器 (25.10 R2+)"
  168. elif command -v opkg >/dev/null 2>&1; then
  169.     PKG_MGR="opkg"
  170.     echo "  ✓ 检测到opkg包管理器 (旧版本)"
  171. else
  172.     echo "  ❌ 未找到包管理器,请手动安装依赖"
  173.     exit 1
  174. fi

  175. # 0.3 检查并安装依赖包(已适配25.10 R2包名)
  176. echo "→ 检查依赖包..."

  177. # 定义依赖包列表(按包管理器分组)
  178. if [ "$PKG_MGR" = "apk" ]; then
  179.     # 25.10 R2的正确包名
  180.     REQUIRED_PKGS="kmod-ifb kmod-sched-core kmod-sched-connmark kmod-ipt-extra tc-tiny ip-tiny iptables-zz-legacy"
  181. elif [ "$PKG_MGR" = "opkg" ]; then
  182.     # 旧版本的包名(兼容)
  183.     REQUIRED_PKGS="kmod-ifb kmod-sched-connmark kmod-sched-core kmod-ipt-connmark iptables-mod-extra tc ip"
  184. fi

  185. MISSING_PKGS=""

  186. # 检查缺失的包
  187. for pkg in $REQUIRED_PKGS; do
  188.     if [ "$PKG_MGR" = "apk" ]; then
  189.         if ! apk info -e "$pkg" >/dev/null 2>&1; then
  190.             MISSING_PKGS="$MISSING_PKGS $pkg"
  191.         fi
  192.     elif [ "$PKG_MGR" = "opkg" ]; then
  193.         if ! opkg list-installed 2>/dev/null | grep -q "^$pkg "; then
  194.             MISSING_PKGS="$MISSING_PKGS $pkg"
  195.         fi
  196.     fi
  197. done

  198. if [ -n "$MISSING_PKGS" ]; then
  199.     echo "  ⚠ 以下依赖包未安装:$MISSING_PKGS"
  200.     echo "  → 尝试自动安装..."
  201.    
  202.     if [ "$PKG_MGR" = "apk" ]; then
  203.         apk update 2>/dev/null
  204.         for pkg in $MISSING_PKGS; do
  205.             echo "    安装 $pkg..."
  206.             apk add "$pkg" 2>/dev/null
  207.             if [ $? -eq 0 ]; then
  208.                 echo "    ✓ $pkg 安装成功"
  209.             else
  210.                 echo "    ❌ $pkg 安装失败,请手动执行: apk add $pkg"
  211.             fi
  212.         done
  213.     elif [ "$PKG_MGR" = "opkg" ]; then
  214.         opkg update 2>/dev/null
  215.         for pkg in $MISSING_PKGS; do
  216.             echo "    安装 $pkg..."
  217.             opkg install "$pkg" 2>/dev/null
  218.             if [ $? -eq 0 ]; then
  219.                 echo "    ✓ $pkg 安装成功"
  220.             else
  221.                 echo "    ❌ $pkg 安装失败,请手动执行: opkg install $pkg"
  222.             fi
  223.         done
  224.     fi
  225. else
  226.     echo "  ✓ 所有依赖包已安装"
  227. fi

  228. echo ""

  229. # ============================================================
  230. # 第一步:环境准备
  231. # ============================================================

  232. echo "==> 第一步:环境准备"

  233. # 1.1 备份当前规则
  234. echo "  → 备份当前iptables规则..."
  235. BACKUP_FILE="/tmp/qos_backup_$(date +%Y%m%d_%H%M%S)"
  236. iptables-save > "${BACKUP_FILE}_iptables.txt" 2>/dev/null
  237. ip6tables-save > "${BACKUP_FILE}_ip6tables.txt" 2>/dev/null
  238. echo "    备份已保存到: ${BACKUP_FILE}_*"

  239. # 1.2 清理旧规则
  240. echo "  → 清理旧防火墙规则..."
  241. iptables -t mangle -F FORWARD 2>/dev/null
  242. iptables -t mangle -X 2>/dev/null
  243. ip6tables -t mangle -F FORWARD 2>/dev/null
  244. ip6tables -t mangle -X 2>/dev/null

  245. echo "  → 清理旧tc规则..."
  246. # 清理IFB接口
  247. tc qdisc del dev ifb0 root 2>/dev/null
  248. tc qdisc del dev ifb1 root 2>/dev/null

  249. # 清理WAN接口
  250. WAN_INTERFACES="pppoe-wan pppoe-wan6 wan6 eth0 eth1 wan"
  251. for iface in $WAN_INTERFACES; do
  252.     if ip link show "$iface" >/dev/null 2>&1; then
  253.         tc qdisc del dev "$iface" ingress 2>/dev/null
  254.         tc qdisc del dev "$iface" root 2>/dev/null
  255.     fi
  256. done

  257. # 1.3 加载内核模块
  258. echo "  → 加载内核模块..."
  259. # 静默加载,不显示非关键警告
  260. modprobe ifb numifbs=2 2>/dev/null || true
  261. modprobe xt_MARK 2>/dev/null || true
  262. modprobe xt_connmark 2>/dev/null || true
  263. modprobe xt_multiport 2>/dev/null || true
  264. modprobe xt_string 2>/dev/null || true
  265. modprobe xt_length 2>/dev/null || true
  266. modprobe xt_comment 2>/dev/null || true
  267. modprobe act_connmark 2>/dev/null || true
  268. modprobe act_mirred 2>/dev/null || true
  269. modprobe sch_htb 2>/dev/null || true
  270. modprobe sch_购物_codel 2>/dev/null || true
  271. modprobe cls_fw 2>/dev/null || true
  272. modprobe cls_u32 2>/dev/null || true

  273. # 验证关键模块
  274. echo "  → 验证关键模块..."
  275. CRITICAL_MODS="ifb sch_htb cls_fw act_mirred"
  276. for mod in $CRITICAL_MODS; do
  277.     if lsmod | grep -q "^$mod "; then
  278.         echo "    ✓ $mod"
  279.     else
  280.         echo "    ⚠ $mod 未加载,QoS可能无法正常工作"
  281.     fi
  282. done

  283. # 1.4 配置用户参数
  284. echo "  → 配置网络参数..."

  285. # ---- 网络接口配置 ----
  286. WAN="pppoe-wan"        # 主WAN接口(IPv4)
  287. LAN_IF="br-lan"        # 内网接口
  288. LAN_SUBNET="192.168.254.0/24"  # 内网IPv4网段

  289. # ---- 检测IPv6接口 ----
  290. echo "  → 检测IPv6接口..."
  291. WAN_IPV6=""
  292. IPV6_SUPPORT=0

  293. # 检查主WAN口是否有IPv6
  294. if ip -6 addr show dev "$WAN" 2>/dev/null | grep -q "inet6.*global"; then
  295.     WAN_IPV6="$WAN"
  296.     IPV6_SUPPORT=1
  297.     echo "    ✓ 检测到IPv6在主WAN口: $WAN"
  298. fi

  299. # 检查pppoe-wan6接口
  300. if [ $IPV6_SUPPORT -eq 0 ] && ip link show pppoe-wan6 2>/dev/null | grep -q "UP"; then
  301.     WAN_IPV6="pppoe-wan6"
  302.     IPV6_SUPPORT=1
  303.     echo "    ✓ 检测到IPv6专用接口: pppoe-wan6"
  304. fi

  305. # 检查wan6接口
  306. if [ $IPV6_SUPPORT -eq 0 ] && ip link show wan6 2>/dev/null | grep -q "UP"; then
  307.     WAN_IPV6="wan6"
  308.     IPV6_SUPPORT=1
  309.     echo "    ✓ 检测到IPv6接口: wan6"
  310. fi

  311. # 自动检测其他IPv6接口
  312. if [ $IPV6_SUPPORT -eq 0 ]; then
  313.     for iface in $(ip -6 addr show 2>/dev/null | grep "inet6.*global" | awk '{print $NF}' | sort -u); do
  314.         if [ "$iface" != "$LAN_IF" ] && [ "$iface" != "lo" ] && [ -n "$iface" ]; then
  315.             WAN_IPV6="$iface"
  316.             IPV6_SUPPORT=1
  317.             echo "    ✓ 自动检测到IPv6接口: $WAN_IPV6"
  318.             break
  319.         fi
  320.     done
  321. fi

  322. if [ $IPV6_SUPPORT -eq 0 ]; then
  323.     echo "    ⚠ 未检测到IPv6全局地址,IPv6 QoS将禁用"
  324. fi

  325. # ---- 带宽配置(kbit)----
  326. UP_BW="8000"          # 上行总带宽(约8Mbps)
  327. DOWN_BW="27000"       # 下行总带宽(约27Mbps)
  328. BURST="160k"          # 突发流量大小

  329. # ---- 上传各类保证带宽(kbit)----
  330. UP_P10="2500"   # 游戏(最高优先级)
  331. UP_P15="800"    # DNS/小包
  332. UP_P20="600"    # 微信/支付
  333. UP_P25="800"    # 网页
  334. UP_P30="1500"   # 默认
  335. UP_P35="500"    # 视频/下载
  336. UP_SPARE="300"  # 备用类

  337. # ---- 下载各类保证带宽(kbit)----
  338. DL_P10="5500"   # 游戏
  339. DL_P15="3000"   # DNS/小包
  340. DL_P20="2000"   # 微信/支付
  341. DL_P25="4000"   # 网页
  342. DL_P30="6000"   # 默认
  343. DL_P35="3000"   # 视频/下载
  344. DL_SPARE="1000" # 备用类

  345. echo ""

  346. # ============================================================
  347. # 第二步:虚拟网卡初始化
  348. # ============================================================

  349. echo "==> 第二步:初始化IFB虚拟网卡"

  350. # 2.1 创建ifb0
  351. if ip link show ifb0 >/dev/null 2>&1; then
  352.     echo "  ✓ ifb0已存在"
  353. else
  354.     ip link add ifb0 type ifb 2>/dev/null
  355.     if [ $? -eq 0 ]; then
  356.         echo "  ✓ ifb0创建成功"
  357.     else
  358.         echo "  ❌ ifb0创建失败,请检查kmod-ifb是否安装"
  359.         exit 1
  360.     fi
  361. fi

  362. # 2.2 创建ifb1
  363. if ip link show ifb1 >/dev/null 2>&1; then
  364.     echo "  ✓ ifb1已存在"
  365. else
  366.     ip link add ifb1 type ifb 2>/dev/null
  367.     if [ $? -eq 0 ]; then
  368.         echo "  ✓ ifb1创建成功"
  369.     else
  370.         echo "  ❌ ifb1创建失败"
  371.         exit 1
  372.     fi
  373. fi

  374. # 2.3 启用虚拟网卡
  375. ip link set ifb0 up
  376. ip link set ifb1 up
  377. echo "  ✓ ifb0/ifb1已启用"
  378. echo ""

  379. # ============================================================
  380. # 第三步:HTB队列配置
  381. # ============================================================

  382. echo "==> 第三步:配置HTB队列"

  383. # ---------- 3.1 上传HTB队列 (ifb0) ----------
  384. echo "  → 配置上传队列 (ifb0)..."

  385. tc qdisc del dev ifb0 root 2>/dev/null
  386. tc qdisc add dev ifb0 root handle 1: htb default 30 r2q 1

  387. # 根类
  388. tc class add dev ifb0 parent 1: classid 1:1 htb \
  389.     rate ${UP_BW}kbit ceil ${UP_BW}kbit quantum 1500 burst $BURST
  390. echo "    ✓ 上传根类创建完成 (${UP_BW}kbit)"

  391. # 子类
  392. for cls in 10 15 20 25 30 35 40 45 50; do
  393.     eval rate=\${UP_P${cls}:-$UP_SPARE}
  394.     prio=$(( (cls-10)/5 ))
  395.     [ $prio -gt 7 ] && prio=7
  396.    
  397.     tc class add dev ifb0 parent 1:1 classid 1:${cls} htb \
  398.         rate ${rate}kbit ceil ${UP_BW}kbit prio $prio quantum 1500 burst $BURST
  399.    
  400.     # 优先使用购物_codel,失败则使用pfifo
  401.     tc qdisc add dev ifb0 parent 1:${cls} 购物_codel limit 1000 2>/dev/null || \
  402.         tc qdisc add dev ifb0 parent 1:${cls} pfifo limit 1000
  403. done

  404. echo "    ✓ 上传子类创建完成"
  405. echo "       P10(游戏):${UP_P10}kbit P15:${UP_P15}kbit P20:${UP_P20}kbit"
  406. echo "       P25(网页):${UP_P25}kbit P30:${UP_P30}kbit P35(视频):${UP_P35}kbit"

  407. # ---------- 3.2 下载HTB队列 (ifb1) ----------
  408. echo "  → 配置下载队列 (ifb1)..."

  409. tc qdisc del dev ifb1 root 2>/dev/null
  410. tc qdisc add dev ifb1 root handle 2: htb default 30 r2q 1

  411. # 根类
  412. tc class add dev ifb1 parent 2: classid 2:1 htb \
  413.     rate ${DOWN_BW}kbit ceil ${DOWN_BW}kbit quantum 1500 burst $BURST
  414. echo "    ✓ 下载根类创建完成 (${DOWN_BW}kbit)"

  415. # 子类
  416. for cls in 10 15 20 25 30 35 40 45 50; do
  417.     eval rate=\${DL_P${cls}:-$DL_SPARE}
  418.     prio=$(( (cls-10)/5 ))
  419.     [ $prio -gt 7 ] && prio=7
  420.    
  421.     tc class add dev ifb1 parent 2:1 classid 2:${cls} htb \
  422.         rate ${rate}kbit ceil ${DOWN_BW}kbit prio $prio quantum 1500 burst $BURST
  423.    
  424.     tc qdisc add dev ifb1 parent 2:${cls} 购物_codel limit 1000 2>/dev/null || \
  425.         tc qdisc add dev ifb1 parent 2:${cls} pfifo limit 1000
  426. done

  427. echo "    ✓ 下载子类创建完成"
  428. echo "       P10(游戏):${DL_P10}kbit P15:${DL_P15}kbit P20:${DL_P20}kbit"
  429. echo "       P25(网页):${DL_P25}kbit P30:${DL_P30}kbit P35(视频):${DL_P35}kbit"
  430. echo ""

  431. # ============================================================
  432. # 第四步:流量重定向配置
  433. # ============================================================

  434. echo "==> 第四步:配置流量重定向"

  435. # ---------- 4.1 下行重定向(WAN ingress → ifb1)----------
  436. echo "  → 配置下行重定向..."

  437. # IPv4下行重定向
  438. tc qdisc del dev "$WAN" ingress 2>/dev/null
  439. tc qdisc add dev "$WAN" handle ffff: ingress
  440. tc filter add dev "$WAN" parent ffff: protocol ip prio 1 u32 \
  441.     match u32 0 0 \
  442.     action connmark \
  443.     action mirred egress redirect dev ifb1
  444. echo "    ✓ IPv4下行重定向已配置"

  445. # IPv6下行重定向
  446. if [ $IPV6_SUPPORT -eq 1 ]; then
  447.     if [ "$WAN_IPV6" = "$WAN" ]; then
  448.         # IPv6和IPv4在同一接口
  449.         tc filter add dev "$WAN" parent ffff: protocol ipv6 prio 2 u32 \
  450.             match u32 0 0 \
  451.             action connmark \
  452.             action mirred egress redirect dev ifb1 2>/dev/null
  453.         if [ $? -eq 0 ]; then
  454.             echo "    ✓ IPv6下行重定向已配置(共用接口)"
  455.         else
  456.             echo "    ⚠ IPv6下行重定向失败,尝试备用方法..."
  457.             # 备用方法:在root qdisc上重定向
  458.             tc qdisc add dev "$WAN" root handle 5: htb default 1 r2q 1 2>/dev/null
  459.             tc class add dev "$WAN" parent 5: classid 5:1 htb rate 100mbit 2>/dev/null
  460.             tc filter add dev "$WAN" parent 5: protocol ipv6 prio 1 u32 \
  461.                 match u32 0 0 \
  462.                 action connmark \
  463.                 action mirred egress redirect dev ifb1 2>/dev/null
  464.             [ $? -eq 0 ] && echo "    ✓ IPv6下行重定向已配置(备用方法)" || echo "    ❌ IPv6下行重定向失败"
  465.         fi
  466.     else
  467.         # IPv6在独立接口上
  468.         tc qdisc del dev "$WAN_IPV6" ingress 2>/dev/null
  469.         tc qdisc add dev "$WAN_IPV6" handle ffff: ingress 2>/dev/null
  470.         
  471.         if [ $? -eq 0 ]; then
  472.             tc filter add dev "$WAN_IPV6" parent ffff: protocol ipv6 prio 1 u32 \
  473.                 match u32 0 0 \
  474.                 action connmark \
  475.                 action mirred egress redirect dev ifb1 2>/dev/null
  476.             if [ $? -eq 0 ]; then
  477.                 echo "    ✓ IPv6下行重定向已配置(接口: $WAN_IPV6)"
  478.             else
  479.                 echo "    ⚠ IPv6 filter添加失败,尝试root qdisc方法..."
  480.                 tc qdisc add dev "$WAN_IPV6" root handle 6: htb default 1 r2q 1 2>/dev/null
  481.                 tc class add dev "$WAN_IPV6" parent 6: classid 6:1 htb rate 100mbit 2>/dev/null
  482.                 tc filter add dev "$WAN_IPV6" parent 6: protocol ipv6 prio 1 u32 \
  483.                     match u32 0 0 \
  484.                     action connmark \
  485.                     action mirred egress redirect dev ifb1 2>/dev/null
  486.                 [ $? -eq 0 ] && echo "    ✓ IPv6下行重定向已配置(备用方法)" || echo "    ❌ IPv6下行重定向失败"
  487.             fi
  488.         else
  489.             echo "    ⚠ IPv6接口不支持ingress,使用root qdisc方法..."
  490.             tc qdisc add dev "$WAN_IPV6" root handle 6: htb default 1 r2q 1 2>/dev/null
  491.             tc class add dev "$WAN_IPV6" parent 6: classid 6:1 htb rate 100mbit 2>/dev/null
  492.             tc filter add dev "$WAN_IPV6" parent 6: protocol ipv6 prio 1 u32 \
  493.                 match u32 0 0 \
  494.                 action connmark \
  495.                 action mirred egress redirect dev ifb1 2>/dev/null
  496.             [ $? -eq 0 ] && echo "    ✓ IPv6下行重定向已配置(备用方法)" || echo "    ❌ IPv6下行重定向失败"
  497.         fi
  498.     fi
  499. fi

  500. # ---------- 4.2 上传重定向(WAN egress → ifb0)----------
  501. echo "  → 配置上传重定向..."

  502. # IPv4上传重定向
  503. tc qdisc del dev "$WAN" root 2>/dev/null
  504. tc qdisc add dev "$WAN" root handle 3: htb default 1 r2q 1
  505. tc class add dev "$WAN" parent 3: classid 3:1 htb rate 100mbit
  506. tc filter add dev "$WAN" parent 3: protocol ip prio 1 u32 \
  507.     match u32 0 0 \
  508.     action mirred egress redirect dev ifb0
  509. echo "    ✓ IPv4上传重定向已配置"

  510. # IPv6上传重定向
  511. if [ $IPV6_SUPPORT -eq 1 ]; then
  512.     if [ "$WAN_IPV6" = "$WAN" ]; then
  513.         # IPv6和IPv4在同一接口
  514.         tc filter add dev "$WAN" parent 3: protocol ipv6 prio 2 u32 \
  515.             match u32 0 0 \
  516.             action mirred egress redirect dev ifb0 2>/dev/null
  517.         if [ $? -eq 0 ]; then
  518.             echo "    ✓ IPv6上传重定向已配置(共用接口)"
  519.         else
  520.             echo "    ⚠ IPv6上传重定向失败,接口可能不支持IPv6 filter"
  521.         fi
  522.     else
  523.         # IPv6在独立接口上
  524.         tc qdisc del dev "$WAN_IPV6" root 2>/dev/null
  525.         tc qdisc add dev "$WAN_IPV6" root handle 7: htb default 1 r2q 1 2>/dev/null
  526.         tc class add dev "$WAN_IPV6" parent 7: classid 7:1 htb rate 100mbit 2>/dev/null
  527.         tc filter add dev "$WAN_IPV6" parent 7: protocol ipv6 prio 1 u32 \
  528.             match u32 0 0 \
  529.             action mirred egress redirect dev ifb0 2>/dev/null
  530.         if [ $? -eq 0 ]; then
  531.             echo "    ✓ IPv6上传重定向已配置(接口: $WAN_IPV6)"
  532.         else
  533.             echo "    ⚠ IPv6上传重定向失败,接口$WAN_IPV6可能不支持"
  534.         fi
  535.     fi
  536. fi

  537. echo ""

  538. # ============================================================
  539. # 第五步:防火墙标记规则
  540. # ============================================================

  541. echo "==> 第五步:配置防火墙标记规则"

  542. # 标记规则函数
  543. mark_rules() {
  544.     local T=$1      # iptables/ip6tables
  545.     local SRC=$2    # 源匹配
  546.     local DST=$3    # 目标匹配

  547.     echo "  → 配置${T}标记规则..."
  548.    
  549.     # ===== P10 游戏(最高优先级)=====
  550.     echo "    → 游戏标记规则..."
  551.    
  552.     # UDP游戏端口
  553.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p udp \
  554.         -m multiport --dports 5060,3478,3479,3480,3481,50000:60000,27000:27200,8801:8810,10000:20000,30000:40000 \
  555.         -m comment --comment "Game-UDP" -j MARK --set-mark 10
  556.    
  557.     # TCP游戏管理端口
  558.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp \
  559.         -m multiport --dports 27014:27050,3478,3479,3480,3481,5222,5223,5228,8080 \
  560.         -m comment --comment "Game-TCP" -j MARK --set-mark 10
  561.    
  562.     # UDP小包特征(游戏典型特征)
  563.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p udp \
  564.         --dport 1024:65535 -m length --length 0:512 \
  565.         -m comment --comment "Game-UDP-SmallPacket" -j MARK --set-mark 10

  566.     # ===== P15 DNS/ICMP/小包(次高优先级)=====
  567.     echo "    → DNS/小包标记规则..."
  568.    
  569.     # DNS查询
  570.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p udp --dport 53 \
  571.         -m comment --comment "DNS-UDP" -j MARK --set-mark 15
  572.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp --dport 53 \
  573.         -m comment --comment "DNS-TCP" -j MARK --set-mark 15
  574.    
  575.     # ICMP控制报文
  576.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p icmp \
  577.         -m comment --comment "ICMP" -j MARK --set-mark 15
  578.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p ipv6-icmp \
  579.         -m comment --comment "ICMPv6" -j MARK --set-mark 15 2>/dev/null || true
  580.    
  581.     # 非UDP小包
  582.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 \
  583.         -m length --length 0:256 ! -p udp \
  584.         -m comment --comment "SmallPacket-NonUDP" -j MARK --set-mark 15

  585.     # ===== P20 微信/支付(中高优先级)=====
  586.     echo "    → 微信/支付标记规则..."
  587.    
  588.     # SNI匹配微信(如果支持字符串匹配)
  589.     if lsmod 2>/dev/null | grep -q xt_string; then
  590.         $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp --dport 443 \
  591.             -m string --string "weixin" --algo bm --from 40 --to 80 \
  592.             -m comment --comment "WeChat-SNI" -j MARK --set-mark 20 2>/dev/null || true
  593.         
  594.         $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp --dport 443 \
  595.             -m string --string "wechat" --algo bm --from 40 --to 80 \
  596.             -m comment --comment "WeChat-SNI2" -j MARK --set-mark 20 2>/dev/null || true
  597.     fi
  598.    
  599.     # 微信专用端口
  600.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp \
  601.         -m multiport --dports 5223,8080,14000,8000,8001,5228 \
  602.         -m comment --comment "WeChat-Ports" -j MARK --set-mark 20

  603.     # ===== P25 网页(中等优先级)=====
  604.     echo "    → 网页标记规则..."
  605.    
  606.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp --dport 80 \
  607.         -m comment --comment "Web-HTTP" -j MARK --set-mark 25
  608.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp --dport 443 \
  609.         -m comment --comment "Web-HTTPS" -j MARK --set-mark 25
  610.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p udp --dport 443 \
  611.         -m comment --comment "Web-QUIC" -j MARK --set-mark 25

  612.     # ===== P35 视频/下载(低优先级)=====
  613.     echo "    → 视频/下载标记规则..."
  614.    
  615.     # SNI匹配视频平台
  616.     if lsmod 2>/dev/null | grep -q xt_string; then
  617.         for domain in \
  618.             "douyin.com" "kuaishou.com" "bilibili.com" \
  619.             "huya.com" "douyu.com" "youtube.com" "netflix.com" \
  620.             "iqiyi.com" "youku.com" "qq.com" "twitch.tv"; do
  621.             
  622.             $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 \
  623.                 -p tcp --dport 443 \
  624.                 -m string --string "$domain" --algo bm --from 40 --to 120 \
  625.                 -m comment --comment "Video-$domain" -j MARK --set-mark 35 2>/dev/null || true
  626.         done
  627.     fi
  628.    
  629.     # 视频/下载端口
  630.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 -p tcp \
  631.         -m multiport --dports 1935,8080,8000:8002 \
  632.         -m comment --comment "Video-Ports" -j MARK --set-mark 35

  633.     # ===== P30 默认(中低优先级)=====
  634.     echo "    → 默认标记规则..."
  635.     $T -t mangle -A FORWARD $SRC $DST -m mark --mark 0 \
  636.         -m comment --comment "Default" -j MARK --set-mark 30

  637.     echo "    ✓ ${T}标记规则配置完成"
  638. }

  639. # 应用规则
  640. echo "  → 应用IPv4标记规则..."
  641. mark_rules iptables "-s $LAN_SUBNET" "! -d $LAN_SUBNET"

  642. echo "  → 应用IPv6标记规则..."
  643. mark_rules ip6tables "-i $LAN_IF" "! -o $LAN_IF"

  644. # 保存标记到Conntrack
  645. echo "  → 保存标记到Conntrack..."
  646. iptables -t mangle -A FORWARD -m mark ! --mark 0 \
  647.     -m comment --comment "Save-Conntrack" -j CONNMARK --save-mark
  648. echo "    ✓ IPv4 Conntrack标记保存已配置"

  649. ip6tables -t mangle -A FORWARD -m mark ! --mark 0 \
  650.     -m comment --comment "Save-Conntrack-v6" -j CONNMARK --save-mark
  651. echo "    ✓ IPv6 Conntrack标记保存已配置"
  652. echo ""

  653. # ============================================================
  654. # 第六步:FW过滤器绑定
  655. # ============================================================

  656. echo "==> 第六步:绑定FW过滤器"

  657. for dev in ifb0 ifb1; do
  658.     if [ "$dev" = "ifb0" ]; then
  659.         parent="1:"
  660.         direction="上传"
  661.     else
  662.         parent="2:"
  663.         direction="下载"
  664.     fi
  665.    
  666.     echo "  → 配置${direction}过滤器 (${dev})..."
  667.    
  668.     for cls in 10 15 20 25 30 35 40 45 50; do
  669.         tc filter replace dev $dev protocol all parent $parent prio 1 \
  670.             handle $cls fw classid ${parent}${cls} 2>/dev/null
  671.     done
  672.    
  673.     echo "    ✓ ${direction}过滤器绑定完成"
  674. done

  675. echo ""

  676. # ============================================================
  677. # 第七步:验证与总结
  678. # ============================================================

  679. echo "=========================================="
  680. echo " ✅ QoS部署完成!"
  681. echo "=========================================="
  682. echo ""
  683. echo "【配置摘要】"
  684. echo "  包管理器: $PKG_MGR"
  685. echo "  主WAN接口: $WAN"
  686. echo "  IPv6接口: $([ $IPV6_SUPPORT -eq 1 ] && echo "$WAN_IPV6" || echo "禁用")"
  687. echo "  内网接口: $LAN_IF ($LAN_SUBNET)"
  688. echo "  上行带宽: ${UP_BW}kbit (~$((UP_BW/1000))Mbps)"
  689. echo "  下行带宽: ${DOWN_BW}kbit (~$((DOWN_BW/1000))Mbps)"
  690. echo ""
  691. echo "【优先级分配】"
  692. echo "  P10 游戏 : ${UP_P10}kbit↑ / ${DL_P10}kbit↓ (最高)"
  693. echo "  P15 DNS  : ${UP_P15}kbit↑ / ${DL_P15}kbit↓"
  694. echo "  P20 微信 : ${UP_P20}kbit↑ / ${DL_P20}kbit↓"
  695. echo "  P25 网页 : ${UP_P25}kbit↑ / ${DL_P25}kbit↓"
  696. echo "  P30 默认 : ${UP_P30}kbit↑ / ${DL_P30}kbit↓"
  697. echo "  P35 视频 : ${UP_P35}kbit↑ / ${DL_P35}kbit↓ (最低)"
  698. echo ""

  699. # 规则统计
  700. echo "【规则统计】"
  701. echo "  IPv4规则: $(iptables -t mangle -L FORWARD -n 2>/dev/null | grep -c 'MARK\|CONNMARK') 条"
  702. echo "  IPv6规则: $(ip6tables -t mangle -L FORWARD -n 2>/dev/null | grep -c 'MARK\|CONNMARK') 条"
  703. echo "  TC过滤器: $(tc filter show dev ifb0 2>/dev/null | grep -c 'fw') 个(上传) + $(tc filter show dev ifb1 2>/dev/null | grep -c 'fw') 个(下载)"
  704. echo ""

  705. # IPv6状态
  706. if [ $IPV6_SUPPORT -eq 1 ]; then
  707.     echo "【IPv6支持】"
  708.     echo "  状态: 已启用"
  709.     echo "  接口: $WAN_IPV6"
  710.    
  711.     # 检查IPv6规则是否生效
  712.     if [ "$WAN_IPV6" = "$WAN" ]; then
  713.         v6_down=$(tc filter show dev "$WAN" parent ffff: 2>/dev/null | grep -c "protocol ipv6")
  714.         v6_up=$(tc filter show dev "$WAN" parent 3: 2>/dev/null | grep -c "protocol ipv6")
  715.     else
  716.         v6_down=$(tc filter show dev "$WAN_IPV6" parent ffff: 2>/dev/null | grep -c "protocol ipv6")
  717.         v6_up=$(tc filter show dev "$WAN_IPV6" parent 7: 2>/dev/null | grep -c "protocol ipv6")
  718.     fi
  719.     echo "  下行规则: ${v6_down}条"
  720.     echo "  上传规则: ${v6_up}条"
  721.     echo ""
  722. fi

  723. echo "【验证命令】"
  724. echo "  上传队列统计: tc -s class show dev ifb0"
  725. echo "  下载队列统计: tc -s class show dev ifb1"
  726. echo "  防火墙规则: iptables -t mangle -L FORWARD -n -v"
  727. echo "  Conntrack标记: cat /proc/net/nf_conntrack | grep mark"
  728. echo "  实时监控: watch -n1 'tc -s class show dev ifb0 | grep -E "class htb|Sent"'"
  729. echo ""

  730. echo "【故障排查】"
  731. echo "  1. 游戏掉线: 增加P10带宽或添加游戏端口"
  732. echo "  2. 网页卡顿: 检查P25带宽是否充足"
  733. echo "  3. IPv6不生效: 确认IPv6接口检测正确"
  734. echo "  4. 完全清除: 重启路由器或手动清理tc/iptables规则"
  735. echo ""

  736. # 游戏连接统计
  737. echo "【当前游戏连接】"
  738. echo "  已标记为游戏的连接数:"
  739. echo "    IPv4: $(cat /proc/net/nf_conntrack 2>/dev/null | grep 'mark=10' | wc -l)"
  740. echo "    IPv6: $(cat /proc/net/nf_conntrack 2>/dev/null | grep 'mark=10' | wc -l)"
  741. echo ""
  742. echo "=========================================="
复制代码

只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
发表于 2026-5-22 16:07 | 显示全部楼层
这个脚本整体上不是“玩具脚本”,而是一个已经接近生产级的 ImmortalWrt/OpenWrt QoS 自动化方案。
它的目标非常明确:

> 用 IFB + HTB + iptables fwmark + conntrack 实现“游戏优先、网页其次、视频限速”的低延迟 QoS。

但它里面同时存在:

* 架构级优点
* 多处严重逻辑缺陷
* 多个“看起来高级、实际有问题”的实现
* 若干会直接导致:

  * 断网
  * IPv6异常
  * CPU飙升
  * QoS失效
  * tc死循环重定向
  * nftables兼容崩溃
    的风险点。

下面我按“工程级审查”方式给你拆解。


---

# 一、脚本真实架构

它采用的是:

```text
iptables MARK
        ↓
CONNMARK 保存
        ↓
tc fw filter
        ↓
HTB class
        ↓
购物_codel
```

这是 Linux 传统 QoS 经典方案。

属于:

```text
L3/L4分类 QoS
```

不是:

* cake
* sqm-scripts
* nftables flowtable
* eBPF/XDP

所以:

优点:

* 兼容性强
* 老设备可用
* 可细分优先级
* 可控性高

缺点:

* CPU消耗大
* 配置复杂
* 容易冲突
* nft时代已经偏旧

---

# 二、这个脚本最大的致命问题

# 致命问题 1:

# “上传重定向”设计是错误的

脚本这里:

```sh
tc filter add dev "$WAN" parent 3: protocol ip prio 1 u32 \
    match u32 0 0 \
    action mirred egress redirect dev ifb0
```

它想:

```text
WAN egress → ifb0
```

这是非常危险的。

---

# 为什么危险?

IFB标准用法:

```text
ingress -> ifb
```

而不是:

```text
egress -> ifb
```

因为:

Linux tc 本身:

```text
egress 本来就能直接整形
```

无需重定向。

---

# 它的问题:

这会导致:

```text
WAN root qdisc
    ↓
redirect ifb0
    ↓
ifb0 again qdisc
```

部分内核会:

* 丢包
* 死循环
* 无限mirror
* CPU 100%
* PPS暴涨

尤其:

```text
mt7621
mt798x
x86 virtio
```

都可能炸。

---

# 正确方案

正确做法应该:

```text
下载:
WAN ingress -> ifb1

上传:
直接在 WAN root 做 HTB
```

不应该:

```text
WAN egress -> ifb0
```

这是本脚本最大架构错误。

---

# 三、第二个严重问题

# 购物_codel 被错误替换成:

```sh
sch_购物_codel
```

你看到没有:

```sh
modprobe sch_购物_codel
```

还有:

```sh
tc qdisc add dev ifb0 parent 1{cls} 购物_codel
```

这是明显:

AI替换污染。

原本应是:

```text
购物_codel
```

结果:

```text
购物_codel
```

---

# 后果

这会导致:

```text
No such file or directory
```

然后:

自动fallback:

```sh
pfifo
```

于是:

整个低延迟核心:

```text
购物_codel
```

完全失效。

最终变成:

```text
HTB + pfifo
```

延迟会非常差。

---

# 四、第三个大问题

# nftables兼容问题

它安装:

```sh
iptables-zz-legacy
```

说明作者想强制 legacy。

但:

ImmortalWrt 25.x:

已经是:

```text
fw4 + nftables
```

你这里:

```text
iptables legacy
```

会和:

```text
nft firewall
```

并存冲突。

---

# 后果

会出现:

* 部分规则失效
* fw4 reload清空规则
* conntrack mark异常
* IPv6规则丢失

甚至:

```text
WAN完全断网
```

---

# 五、第四个问题

# FORWARD链被直接清空

这里:

```sh
iptables -t mangle -F FORWARD
```

这是危险操作。

---

# 为什么?

OpenWrt:

* mwan3
* ”PW SOFTWARE“
* open插件
* adguardhome
* tailscale
* zerotier

很多都依赖:

```text
mangle/FORWARD
```

你直接:

```text
-F FORWARD
```

等于:

全清。

---

# 后果

可能:

* 海淘上网失效
* 分流失效
* virtual**失效
* IPv6 NAT异常

这是生产环境大忌。

---

# 六、第五个问题

# “游戏识别”极其粗暴

例如:

```sh
--dport 1024:65535
-m length --length 0:512
```

这意味着:

几乎所有:

* QUIC
* DNS
* WebRTC
* 微信
* SSH
* 小TCP ACK

全部会进:

```text
P10 游戏队列
```

---

# 结果

P10队列被污染。

真正游戏:

反而抢不到带宽。

---

# 七、第六个问题

# SNI字符串匹配性能灾难

这里:

```sh
-m string --string "youtube.com"
```

会:

逐包字符串扫描。

---

# 在路由器上后果:

尤其:

```text
MT7621
ARMv7
低端x86
```

CPU直接爆。

---

# 更致命的是:

TLS1.3 + ECH:

现在很多:

```text
SNI已经加密
```

根本匹配不到。

所以:

这是:

```text
高CPU + 低收益
```

---

# 八、第七个问题

# IPv6逻辑并不正确

脚本以为:

```text
pppoe-wan6
wan6
```

是真实数据接口。

但实际上:

很多 OpenWrt:

```text
wan6 是逻辑接口
```

真正数据接口:

可能是:

```text
pppoe-wan
eth1
```

所以:

```sh
tc qdisc add dev wan6
```

可能直接失败。

---

# 九、第八个问题

# 下载整形不完整

它:

```text
WAN ingress -> ifb1
```

但:

没有:

```text
policer
```

也没有:

```text
ACK control
```

实际上:

Linux 对下载方向:

本来就不能真正控制。

只能:

```text
通过丢包反压 TCP
```

所以:

下载 QoS 实际效果:

远没它宣传的强。

---

# 十、这个脚本真正的优点

虽然问题很多。

但:

有几个地方其实水平不错。

---

# 优点 1:

# 自动检测 IPv6

这部分:

确实比很多脚本强。

---

# 优点 2:

# CONNMARK 思路正确

这是专业做法。

说明作者懂:

```text
双向流量一致分类
```

---

# 优点 3:

# HTB层级设计合理

优先级:

```text
10 15 20 25 30 35
```

结构没问题。

---

# 优点 4:

# IFB下载整形方案是标准做法

下载方向:

```text
ingress -> ifb
```

这是正确的。

---

# 十一、综合评价

# 这是:

```text
“半专业 + 半AI污染”的脚本
```

很明显:

原始作者:

懂 Linux QoS。

但:

后期经过:

* AI改写
* 自动翻译
* 关键词污染
* 错误优化

导致:

出现大量危险逻辑。

尤其:

```text
购物_codel
```

这个已经属于:

AI明显污染证据。

---

# 十二、实际风险评级

| 项目      | 风险  |
| ------- | --- |
| 断网风险    | 高   |
| IPv6异常  | 高   |
| CPU占用   | 很高  |
| QoS真实效果 | 中   |
| 游戏优化效果  | 一般  |
| 长期稳定性   | 差   |
| nft兼容性  | 很差  |
| 生产环境适用  | 不建议 |

---

# 十三、真正专业方案应该是什么

现在 2026 年:

真正推荐的是:

```text
SQM + cake
```

或者:

```text
nftables + cake
```

而不是:

```text
HTB + iptables fwmark + string match
```

---

# 十四、如果让我重构

我会:

## 保留:

* IFB下载
* HTB层级
* connmark
* IPv6自动检测

---

## 删除:

* 上传ifb重定向
* string匹配
* FORWARD flush
* legacy iptables强制
* UDP全范围游戏匹配

---

## 替换:

```text
购物_codel → cake
```

---

## 改成:

```text
fw4/nftables 原生
```

---

# 十五、最终结论

这个脚本:

不是垃圾。

但:

离“稳定生产级”还有很大距离。

目前状态:

```text
适合测试
不适合长期主路由生产环境
```
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-5-22 16:48 来自手机 | 显示全部楼层
本帖最后由 ilxp 于 2026-5-22 16:49 编辑

可以看看我年前搞了个iqos。https://www.right.com.cn/forum/thread-8469677-1-1.html
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-23 19:03

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表