三一工学院校园网稳定术——二层TTL透明修改
本文最后更新于 46 天前,其中的信息可能已经有所发展或是发生改变。

前情提要

三一工学院26年上学期采用了新的校园网认证系统,截至现在作者仍然认为这个校园网系统非常垃圾。不过日子还是要过的,NAT还是要跑的,所以我们就开始研究如何单号多用。

适用人群

无长文本阅读障碍 / 具备一定网络知识 / 具备一定的 OpenWRT 知识 / 具备一定的 Linux 知识

针对现象

校园网拨号不稳定,运营商经常踢线,一定缓解,不保证完全修复

思路

我们需要一个原版 OpenWRT 来帮助我们实现这个中间人修改,而且我们需要三个网络接口来实现这一点。

  • LAN口(管理+上网用)
  • TTL上游口(连接校园网)
  • TTL下游口(输出被修改后的数据包)

核心路径:桥接 + br_netfilter + iptables legacy TTL target(nftables 在纯桥接下修改 TTL 经常不稳定,iptables legacy 更可靠)。

完整步骤(适用于 x86/64 等通用平台)

  1. 网络配置(保持纯 L2 桥接)Bash# /etc/config/network 关键部分 config device option name 'br-ttl' option type 'bridge' list ports 'eth0' # 下游(接次级路由) list ports 'eth2' # 上游(接主路由) config interface 'ttl' option device 'br-ttl' option proto 'none' # 必须是 none,保持透明重启网络:Bash/etc/init.d/network restart
  2. 安装必要软件包Bashopkg update opkg install kmod-br-netfilter iptables-zz-legacy iptables-mod-ipopt kmod-ipt-ipopt
  3. 加载 br_netfilter 并启用桥接流量进入 iptablesBashmodprobe br_netfilter # 持久化 echo "br_netfilter" > /etc/modules.d/99-br_netfilter # 关键 sysctl 设置(让桥接包进入 netfilter) cat << EOF >> /etc/sysctl.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-arptables = 1 EOF sysctl -p重启网络确认生效:Bash/etc/init.d/network restart sysctl net.bridge.bridge-nf-call-iptables # 必须输出 = 1
  4. 关闭 flow offloading(必须,否则绕过 mangle)Bashuci set firewall.@defaults[0].flow_offloading='0' uci set firewall.@defaults[0].flow_offloading_hw='0' uci commit firewall /etc/init.d/firewall restart
  5. 添加 iptables mangle 规则(统一改 TTL 为 64)Bash# 清空旧规则(可选) iptables -t mangle -F # 插入规则(-I 放在链顶,优先级最高) iptables -t mangle -I PREROUTING -i br-ttl -j TTL --ttl-set 64 iptables -t mangle -I POSTROUTING -o br-ttl -j TTL --ttl-set 64 # 或者更精确(只针对进出 eth0/eth2,避免影响管理口) iptables -t mangle -I PREROUTING -i eth0 -j TTL --ttl-set 64 iptables -t mangle -I PREROUTING -i eth2 -j TTL --ttl-set 64 iptables -t mangle -I POSTROUTING -o eth0 -j TTL --ttl-set 64 iptables -t mangle -I POSTROUTING -o eth2 -j TTL --ttl-set 64
  6. 持久化规则 把上面四条(或两条)iptables 命令写入 /etc/firewall.user:Bashvi /etc/firewall.user内容示例:textiptables -t mangle -I PREROUTING -i br-ttl -j TTL --ttl-set 64 iptables -t mangle -I POSTROUTING -o br-ttl -j TTL --ttl-set 64然后:Bash/etc/init.d/firewall restart
  7. 验证Bash# 查看规则是否在链里 & 计数是否上涨 iptables -t mangle -L -v -n # 抓上游出去的 ICMP request,看 ttl 是否已改成 64 tcpdump -i eth2 -nnvv 'icmp[icmptype] = 8' -c 10正常结果:下游设备发出的 echo request 在 eth2 上看到 ttl = 64。

常见问题快速处理

  • TTL 没变? → 确认 net.bridge.bridge-nf-call-iptables = 1 → 确认 flow_offloading 已关 → 确认规则计数在涨(pkts > 0)
  • 想改成其他值(如 65、128) → 把 –ttl-set 64 改成对应数字即可
  • IPv6(Hop Limit) → 用 ip6tables:Baship6tables -t mangle -I PREROUTING -i br-ttl -j HL --hl-set 64 ip6tables -t mangle -I POSTROUTING -o br-ttl -j HL --hl-set 64
  • 规则重启丢失? → 确认写在 /etc/firewall.user 里

这就是目前在 OpenWrt 24.10.5 上最稳定、社区验证最多的纯二层透明修改 TTL 方案(2025–2026 年主流做法)。

评论

  1. 3 周前
    2026-4-03 12:21:03

    牛逼!!!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇