本文最后更新于 46 天前,其中的信息可能已经有所发展或是发生改变。
前情提要
三一工学院26年上学期采用了新的校园网认证系统,截至现在作者仍然认为这个校园网系统非常垃圾。不过日子还是要过的,NAT还是要跑的,所以我们就开始研究如何单号多用。
适用人群
无长文本阅读障碍 / 具备一定网络知识 / 具备一定的 OpenWRT 知识 / 具备一定的 Linux 知识
针对现象
校园网拨号不稳定,运营商经常踢线,一定缓解,不保证完全修复
思路
我们需要一个原版 OpenWRT 来帮助我们实现这个中间人修改,而且我们需要三个网络接口来实现这一点。
- LAN口(管理+上网用)
- TTL上游口(连接校园网)
- TTL下游口(输出被修改后的数据包)
核心路径:桥接 + br_netfilter + iptables legacy TTL target(nftables 在纯桥接下修改 TTL 经常不稳定,iptables legacy 更可靠)。
完整步骤(适用于 x86/64 等通用平台)
- 网络配置(保持纯 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 - 安装必要软件包Bash
opkg update opkg install kmod-br-netfilter iptables-zz-legacy iptables-mod-ipopt kmod-ipt-ipopt - 加载 br_netfilter 并启用桥接流量进入 iptablesBash
modprobe 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 - 关闭 flow offloading(必须,否则绕过 mangle)Bash
uci set firewall.@defaults[0].flow_offloading='0' uci set firewall.@defaults[0].flow_offloading_hw='0' uci commit firewall /etc/init.d/firewall restart - 添加 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 - 持久化规则 把上面四条(或两条)iptables 命令写入 /etc/firewall.user:Bash
vi /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 - 验证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:Bash
ip6tables -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 年主流做法)。
牛逼!!!