2097 字
10 分钟
软路由配置记录

背景#

  • 学校校园网网关限制了每个带宽账号2个mac——这对我的超过7个设备是极大的阻碍。
  • AP隔离使得内网设备间不可通信。AP/Client Isolation 在 L2 层面拦截站对站流量,这意味着它阻止了无线客户端之间直接交换以太网帧(ARP、IPv4/IPv6 unicast)。因为没有 L2 通道,基于直接 IP 的会话(比如 SSH/TCP 连接、UDP 单播、广播)通常无法建立,这是帧 Frame 级别的阻拦,不可绕过——这对我多设备通信极不友好。
  • 我有些设备不便于在本地代理,或者其l3/4无法被捕获/转发。
  • 我没玩过软路由,给自己找点罪受,,体验实践一遍软路由整套部署的大致工作流。

普及下 router-based proxy 和 device-based proxy 的区别

router-based:

类型例子OSI 层原理
NAT(网络地址转换)OpenWrt、iptables MASQUERADEL3 / L4直接改写 IP 头和 TCP/UDP 端口,不看应用层内容。纯粹的数据包转发。
TProxy / REDIRECT 透明代理Clash、Surge、OpenClash、Xray 透明代理L3 / L4捕获所有目的端口流量,把 TCP/UDP 流导入本地监听的代理进程(例如 HTTP/SOCKS)。代理进程再在 L7 层解析。
防火墙规则/路由策略iptables、nftables、ip rule、ip routeL3 / L4依据 IP 和端口做流量重定向或丢弃,不理解 L7 内容。
软路由中的代理核心Clash、Xray、V2Ray、Sing-boxL7在路由器中运行的代理引擎本身理解 HTTP、TLS、QUIC、SOCKS 协议。属于应用层代理,但它接收的流量是从内核 L4 转发来的。

device-based:

类型示例OSI 层原理
HTTP 代理系统设置中的 HTTP Proxy、Surge、QuantumultL7应用发送 HTTP 请求给代理,代理解析并转发。处理的是应用层 HTTP 协议。
SOCKS5 代理Shadowsocks、Clash 本地模式L7代理客户端封装 TCP/UDP 连接请求,通过 SOCKS 协议转交代理服务器。
VPN App / Tun 驱动Clash Tun、WireGuard、Outline、OpenVPNL3~L4(虚拟网卡)+ L7(代理引擎)虚拟网卡捕获 IP 包(L3),然后交给 L7 的代理协议(如 Shadowsocks、Vmess、Trojan)处理。

然后这个 gl-mt3000 在硬路由上性价比和社区名声不错,但单纯就软路由来说,并不算是性价比很好的选择,而是个妥协。既要天线2.4g+5g高频宽、usb-device + 2.5g wan口 接入等硬路由需求,又要openwrt supporting list “榜上有名”,还要有轻便小巧+售后兜底,那肯定是有代价的(

友善系列可玩度高,但价格太抽象了,且仅能做软路由用途,不考虑()而且我很 实用主义 懒,着实不想在工作流外的事情上花太多时间,我没那么多闲空。

MediaTek MT7981BA 这个CPU作为arm平台,那转发处理肯定是性能远不如E5等便宜好用x86平台的,但没办法,我总不能为了个软路由在宿舍单独放个itx+ups堆箱 or 裸露开发板+线缆放在宿舍小的可怜的桌面上,那也太抽象了。

这里鸣谢下 molinyue 。没有这位在网工上很厉害的朋友,面对软路由这个完全陌生的领域,我可能要自己摸索个少说三天往上()时间高低得翻个四五倍不止(

过程#

前置部分#

首先,我们需要明白的是,openwrt的本质就是linux,是个特化适配了路由器相关软硬件包的轻量distro,因此您可以用您对macos(cli)和对linux常规distro共通的常识去对待它。把它当成一个比较好伺候的linux server即可。

它的pack manager是opkg听说不太好用

Terminal window
ssh gl-mt3000.local || ssh 192.168.8.1 #出厂默认ipv4是这个
cat /etc/openwrt_release
cd /etc/opkg
ls -la
cat distfeeds.conf

如果您发现ssh出现问题,那大概率是”host indentification has changed”,清理下残留host记录就好

Terminal window
rm -f "$HOME/.ssh/known_hosts"

如果您配置过.ssh/config,看到诸如”permission error”,那大概率是ssh配置文件的权限设置问题,openssh对此有着严格的安全要求,如果您是 macOS/linux 用户,那非常简单,只需如下,但如果是windows,umm请自行llm/Google

Terminal window
chmod 600 ~/.ssh/config

给不太清楚这个config是做什么的萌新普及下,你可以理解成这是个openssh的配置文件,它是描述性的,而且日常用的话其实配起来很简单,可以省去每次输入完整ipv4以及ssh protocol断链的烦恼,以下为示例:

Host *
AddKeysToAgent yes # 自动将密钥添加到 ssh-agent
UseKeychain yes # macOS 使用 Keychain 管理密码,其他os用户可忽略
IdentityFile ~/.ssh/id_rsa # 默认私钥存储文件
ServerAliveInterval 60 # 每60s尝试一次相应,避免断链
ServerAliveCountMax 5 # 服务器无响应时,5*60=300s后断链
Host gl-mt3000
HostName 192.168.8.1 # ipv4
User root # login user
Port 22 # ssh开放端口

cat查看信息后,可以清楚的看到这个路由器出厂内置的就是openwrt的一个snapshot, 这点毫无疑问,其区别只是引入了厂商特调的ui和 opkg 源等部分。既然内核完善,具备openwrt luci,是linux且可被ssh,那事情将会变得非常简单

首先摆在您面前的有三个选项 :

  1. 直接前往 openwrt supported device 下载Firmware OpenWrt Upgrade URL(直接进openwrt的 luci ui-web 安装新固件)或者下载Firmware OpenWrt Install URL(通过Uboot刷入安装固件),两者没区别,前者方便的多
  2. 前往 iStore 搜索您的设备型号 gl-mt3000 然后下载tar打包固件,然后同上的第一种安装新固件方式。关于iStore和openwrt的关系/区别请自行llm/Google。不过要说明的是iStoreOS的openwrt内核往往落后官方一些,比如这里是24
  3. 自行下载openwrt提供的,包含编译源码ci流程的container,并使用docker或其他容器工具启动/部署,自行选择自己的平台/设备进行编译()不过放心,gl-mt3000是“榜上有名”的受支持设备,一般不会碰上离谱问题

container1

container2

我是实用主义者懒狗,于是在经过多方征询实践经验摇人后我选择2(

然后就等待固件刷入就行,记得期间不要断路由器电,不碰它最好)

完善部分#

好,那么现在您已经得到了纯的不能再纯的软路由了,您可为自己达成了世上99.99%的普通人都没做到的事感到由衷的自豪(?

接下来就不算什么特别重要的事情了,只是一些诸如openclash,镜像源配置,一些小坑的注意点等细枝末节,根据个人需求完善即可,本文只介绍我的 personal practice,不然一篇post写着实在太费力了(

题外话:在 2025-10-18 更新本文上传图片时碰上了怪事,vercel部署的webapp url正常,被cf dns解析至vercel部署所在的域名则第一张图片加载失败。怪。

openclash的配置其实很简单,只是有几个可能需要留意的小坑。

  1. 在github下载ipk,并通过scp上传至openwrt/iStore中的/tmp缓存区(把它当linux server轻量服务器就好
  2. ssh,补齐作者readme中所写的依赖项,opkg直装
  3. 补齐openclash所需要的内核部分,clash、meta、verge,自选。这里有个要注意的地方就是关于内核安装,项目本身提供了三个镜像源和github url,但这四个有时都会因为网络问题要么不行要么curl下一半断掉。这时您可以多试几次大力出奇迹,或者干脆去github源址下完内核,然后同理scp上传,并安装至openclash内
  4. 余下就是subscribe file,自动生成代理组/策略组config,然后享受您的软路由了

btw,arm平台的软路由确实存在转发能力瓶颈的问题。能用,但有时反应有点慢(tcp握手过程

2025-10-25 17:15#

补充碰上的小问题:

[/tmp/clash_latest_version] Download failed: [curl xxxxx]

具体表现为日志里不断滚出此报错,且无法正常测速代理文件内的各个节点

判断为疑似dns问题

解决方法:

Terminal window
ssh
vim /etc/resolv.conf

然后发现其中包含字段如下

search lan
namerserver 127.0.0.1
nameserver ::1

这玩意一看就不太对劲。。。尝试改为阿里的dns

search lan
nameserver 223.5.5.5

问题解决。

软路由配置记录
https://mias.moe/posts/soft-router-gl-mt3000/soft-routing-config/
作者
Asperfor Mias
发布于
2025-10-17
许可协议
CC BY-NC-SA 4.0