宿舍折腾香橙派记录:软路由、UPS and More
起源
初入大学校园,总想着要干点什么。众所周知CERNET2教育网的IPv6是完全免费的,可以拿来做免流,正好大一认识了一位学长,于是在他的指导下便开始了香橙派的折腾。
购买和组装

选择的是香橙派Orangepi3b,由于我发现emmc模块单买要便宜一点,于是就和开发板分开买了。中途突然发现烧录系统镜像还得有公对公的USB线,于是又临时买了一根。

到货后按照官方文档所示,我迫不及待地把emmc插入开发板背面的扩展接口内,结果发现非常松,正当我怀疑这玩意“难道是焊上去的”之时,使劲一按发出清脆一响,就固定好了,居然是暴力出奇迹啊。
烧录Linux镜像到emmc
先下载瑞芯微驱动DriverAssitant_v5.12.zip并安装,通过USB2.0公对公数据线连接好开发板与Windows电脑,不用连接电源,然后按住开发板的MaskROM按键不放,再给开发板接上Type-C接口的电源,并上电,就可以松开MaskROM按键了。

打开官方提供的RKDevTool,这时候就提示发现一个MASKROM设备了,这里都按照官方教程进行镜像烧录,就不详细阐述了。
这里选择的是Ubuntu系统,烧录完Linux镜像后,系统会自动启动。
初步配置
这时候我没有显示器,开机之后也没办法操作,遂来到学长工位,在学长的帮助下,进行了初步配置。配图有点糊,是当时连上显示器后的命令行界面:

简单来说就是让香橙派用create_ap打开一个WiFi热点,这样用电脑去连接,就可以在局域网环境下通过ssh登录了。回到宿舍后,我用提前买好的10米网线连接宿舍光猫,用祖传的校园网登录bash脚本完成了校园网接入。

这时候就已经可以上网了,按照一般的linux系统流程,我此后完成了国内镜像源的替换,apt包的更新等。为了防止由于热点爆炸+IP变化而导致的ssh失联(别说,还真遇到过),我又写了一个使用cloudflare api实现的ddns服务。
软路由
说白了,就是让香橙派作为路由器,对流量进行处理和转发。
hostapd
最开始用的是create_ap自动配置热点,后来改成自己的/etc/hostapd.conf配置,别的不说了,里面主要就是hw_mode=a可以设置热点为5 GHz频段。
有个坑就是自己配置无线网卡的时候,一定都不能让NetworkManager管理网卡(要改成unmanaged状态),否则会报错。
dnsmasq
dnsmasq作为DHCP服务器,可以给客户端分配静态IP地址,配置例如:
listen-address=192.168.88.1
dhcp-range=192.168.88.50,192.168.88.150,12h
radvd
香橙派作为路由器,radvd是用来给客户端发送路由器通告(RA)的,用来维持IPv6。
提到IPv6,为了让香橙派热点支持它,我可折腾了好久,中途遇到了各种客户端丢失IPv6地址、路由表丢失等问题。
一开始Windows在半小时后会丢失路由表,重新连接WiFi后恢复,稳定复现。我一气之下使用wireshark抓包对比才看出点问题:不知道什么原因,Windows客户端一直收不到香橙派的组播ICMPv6。我最后改成针对单客户端链路地址的单播,才勉强解决路由表丢失的问题。
interface wlan0 {
AdvSendAdvert on;
MaxRtrAdvInterval 100;
MinRtrAdvInterval 30;
AdvDefaultLifetime 2000;
AdvOtherConfigFlag on;
clients {
fe80::xxxx:xxxx:xxxx:xxxx; # 写上clients就会进行单播了
};
prefix 2606:678:123::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvValidLifetime 86400;
AdvPreferredLifetime 43200;
AdvRouterAddr on;
};
};

此后问题又来了,如果Windows电脑休眠太久,ip -6 neigh查看香橙派的neighbor可能会将其标注为FAILED,并且无法自动恢复(这就很奇怪了),导致回程包发不回去,而此时Windows主动ping一下香橙派的地址又能重新联系上(而安卓手机系统好像又没有这个现象)。总之就是二者的联系不太稳定,我手动写唤醒计划脚本才缓解了这一切。
透明代理
最初的配置是写了两个xray的config,一个用作代理分流,另一个作为dns服务器(可以让校内域名通过校内dns服务器解析,其他的分国内和国外域名dns分流)。然后开整透明代理,确保net.ipv4.ip_forward=1 打开linux IPv4转发(同理IPv6要打开net.ipv6.conf.all.forwarding=1),使用nftables规则,把包转发到xray的tproxy端口,这样就可以由xray处理流量。
由于透明代理时的dns是在客户端处理的,因此把所有53端口的dns流量都强制劫持到xray,确保由自己的dns处理。
{
"type": "field",
"outboundTag": "direct",
"ip":["172.21.0.21"], // 小心踩坑了,校内dns服务器53端口得直连,不用劫持到dns-out
"port": "53"
},
{
"type": "field",
"outboundTag": "dns-out",
"ip":["0.0.0.0/0","::/0"],
"port": "53"
}
// dns-out为本地dns服务器
xray的tproxy入站配置可以这样写,端口12422:
{
"tag": "transparent",
"port": 12422,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"],
"metadataOnly": false
},
"streamSettings": {
"sockopt": {
"tproxy": "tproxy"
}
}
}
nftables简化配置如下,流量处理后打上标记2,避免形成环路,根据实际需求修改:
define RESERVED_IPv4 = {
0.0.0.0/8,
10.0.0.0/8,
100.64.0.0/10,
127.0.0.0/8,
169.254.0.0/16,
192.168.0.0/16,
192.0.0.0/24,
224.0.0.0/4,
240.0.0.0/4,
255.255.255.255/32
}
define RESERVED_IPv6 = {
::/128,
::1/128,
fc00::/7,
fd00::/7,
fe80::/10,
ff00::/8
}
table inet xray {
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
ip daddr $RESERVED_IPv4 accept
ip6 daddr $RESERVED_IPv6 accept
meta mark 2 accept
meta l4proto {tcp,udp} meta mark set 1 tproxy ip to 127.0.0.1:12422 accept
meta l4proto {tcp,udp} meta mark set 1 tproxy ip6 to [::1]:12422 accept
}
chain output {
type route hook output priority mangle; policy accept;
ip daddr $RESERVED_IPv4 accept
ip6 daddr $RESERVED_IPv6 accept
meta mark 2 accept
meta l4proto {tcp,udp} meta mark set 1
}
}
还要设置一下,标记为1的包,走路由表规则到本地:
ip rule add fwmark 1 table 104
ip route add local 0.0.0.0/0 dev lo table 104
ip -6 rule add fwmark 1 table 106
ip -6 route add local ::/0 dev lo table 106
外壳搭建
由于现在就只是一块板子,在桌上不美观也不好放,于是我就有了加装外壳的打算。在网上购买亚克力板子,还附赠一个小风扇(虽然不能控制转速等参数,拿来散热够用了,就是清灰比较麻烦)。

ups
由于宿舍晚上会熄灯断电,为了避免造成负面损坏,之前的策略一直是在晚上11点前2-3分钟自动关机,这样第二天来电后香橙派会自动开机。
但是这样有一个问题,那就是晚上就不能用香橙派的WiFi了,且没有针对突发停电的应对方案。(之前其实还有时间校准问题,晚上断电后不能正确计时,因此早上还要自动借助ntp服务器校准系统时间)
为此,我打算买一个ups(不间断电源),而市面上的ups一般都较大不适合宿舍使用,于是我最后选择了一个轻量的方案。
不是打广告的意思(,这个小型ups有三节18650电池串联,可以专门给树莓派/香橙派供电,支持5V5A输出,且在断电的一瞬间也能保持供电稳定,我的测试下满电大概能撑10小时,白天支持同时给电池充电和香橙派供电,完全满足要求。

这样就不再需要自动关机,在正常情况下,就可以不间断地一直运行下去了。同时为了晚上节电,我还写了一套脚本,可以在深夜开启CPU的节电模式自动降频,暂时禁用网卡关闭热点,第二天来电后恢复。
值得一提的是,这个小ups还支持用I2C接口读取当前的电压、电流、功率和电量百分比状态。通过sudo usermod -aG i2c [username]给一个linux用户赋予I2C组权限,使用一个封装好的python类就可以读出来。
往后的某一天,我心血来潮,又想着用flask做了一个ups电量监测系统,每30s采集一次数据并存入数据库,用折线图可视化出来24小时的历史数据,效果还不错,如图就是某一天记录的完整充放电过程。

双网卡
我后来把网线从光猫换接到宿舍桌下的网口了,这样晚上也可以用网。但是我发现有线网的稳定性不好,甚至过半小时左右会timeout一下(难道说设施老化?)。又是某一天突发奇想,我打算再接入一个网卡,这样白天通过WiFi连接光猫,晚上再换到有线网。一开始我想着直接就用一个USB网卡,后经推荐我选择了AX200网卡(原因是支持WiFi6,且香橙派上有M.2接口)。
买到后我傻眼了,这个接口根本插不进去,后来才知道香橙派这个M.2接口是给外接固态硬盘提供的,用网卡的话还得要一个转接卡(香橙派这样加装网卡好像全网参考都比较少?),万幸的是加上转接卡后,果然能用了,linux内置Intel驱动,不需要额外编译内核,运行起来会亮蓝灯。

这样现在就变成了双网卡配置,板载网卡用于开热点,加装的AX200用于连接宿舍光猫。一番折腾后,我加上了依赖时间的路由自动切换脚本和相应的校园网登录逻辑。
mosdns
当前版本的xray-core对dns的处理其实并不是很到位,很多类型的(比如TXT record)dns请求不能内部处理,甚至会有奇怪的timeout问题。为了更好的体验,我选择了自建mosdns,分流缓存什么的功能都不缺,再由xray直接把dns-out转发到mosdns本地的udp端口。
我后面发现有线网的dns好像存在劫持问题,53端口都会被劫持到校内dns,于是全部换用加密的doh。
一个简化的参考配置(mosdns v5版本)如下,除了校内域名外,腾讯系的用dnspod doh,剩下用阿里doh:
log:
level: info
plugins:
- args:
upstreams:
- addr: 172.21.0.21
tag: forward_local_dns
type: forward
- args:
upstreams:
- addr: https://dns.alidns.com/dns-query
dial_addr: "2400:3200::1"
enable_pipeline: true
tag: forward_ali_doh
type: forward
- args:
upstreams:
- addr: https://doh.pub/dns-query
dial_addr: "120.53.53.53"
enable_pipeline: true
tag: forward_dnspod_doh
type: forward
- tag: "tencent_domain"
type: "domain_set"
args:
exps:
- "qq.com"
- "qpic.cn"
- "gtimg.cn"
- "gtimg.com"
- "cdn-go.cn"
- "wechatpay.cn"
- "tenpay.com"
- "wechat.com"
- "weixin.com"
- "weiyun.com"
- "idqqimg.com"
- "tencent.com"
- tag: cache
type: cache
args:
size: 10240
lazy_cache_ttl: 86400
- tag: "main"
type: "sequence"
args:
- matches:
- "!qtype 65"
exec: $cache
- matches: has_resp
exec: accept
- matches:
- qname xxx.edu.cn
exec: $forward_local_dns
- matches: has_resp
exec: accept
- matches:
- qname $tencent_domain
exec: $forward_dnspod_doh
- matches: has_resp
exec: accept
- exec: $forward_ali_doh
- args:
entry: main
listen: 127.0.0.1:5355
tag: udp_server
type: udp_server
cloudreve部署
Cloudreve是一款开源的网盘软件,正好可以在香橙派内部署一个。我把E5订阅的OneDrive挂载上去,就实现了一个校内大容量的网盘,存取文件都比较方便。
除此之外,cloudreve还支持离线下载,香橙派正适合用于这种挂机用途,配置过程在此不阐述。
一些感想
通过统计数据可以发现,现在B站、学习通、微信等都有了IPv6的支持,日常使用数据很多都通过IPv6实现了免流。香橙派不仅成为了宿舍内的“小数据中心”,整个折腾过程也让我对linux系统的使用更加熟练。
别看这篇文章就写到这里,实际上中间经历的坑远超想象,一步一步才调到现在的效果,也算是2025的一个较大成果吧。