软件路由器迁移记

之前一直想修一下多年未维护的Homelab,尤其是跑在PVE上用于国际上网的OpenWRT虚拟软件路由,已经有段时间没有更新,一些软件也都失效了;而第三方一键编译的固件并不开源,存在不透明的后门。

今天抽出了相对空闲的时间和精力,总算能处理这件琐事了,原本运行多时的OpenWRT终于下线,换成了较为规范并且入乡随俗的ImmortalWRT,几乎可以说是无缝迁移。


前言

说来蹊跷,这个OpenWRT本来是装在一台“网红工控机”上的,不过后来我就把它卖了,选择了扩展性能更强的H110台式平台,后来又因稳定性独立出去、换到了跑了Win10的H81上,当然为了重组服务现在又回来了……

我很久以前便开始研究OpenWRT,这是一个为路由器设计的Linux发行版。不过原版的OpenWRT是欧美开发者维护的,在天朝这边水土不服,缺少一些国内特有的软件和需求。

国内的OpenWRT圈子也很乱,一些“大大”们另起炉灶,但是种种原因不能同步到官方仓库源当中,多个“大大”的版本也互不兼容,好似神仙打架;另外一些编译者也丝毫不遵守开源透明的规则约束,反而持着李彦宏一样的态度,不仅加后门,还带来文革甚至大清时期的思想(高大全、师夷长技以制夷),嗯……这下真是120年清朝老兵了。堆料也非常严重,什么功能都往一个路由器系统上塞。可以说比以前的Android还要混乱。

然而国外的OpenWRT用户,并不需要考虑国内复杂的情况,自然也就没有这些稀奇古怪的东西。尤其是搭配了Proxmox VE这样的系统,也就是当作速度更快的廉价高性能路由使用,有了其他虚拟机服务,更没有必要如此折腾。

但在国内的话,这种烂摊子技能还是不能置之不理。比如说Passwall,就好比如在东北农村学会烧炕,显然在城市生活就不需要学习;但只要一天还留在农村生活,就还是要练习这种地域性技能。

SoftRouter这种东西其实是很复杂的,不是术业专攻的人很难理解如何学习。与其随着网红叫做软路由,我更倾向叫他软件路由器,就像捣鼓无线电技术的软件定义无线电(Software Defined Radio)简称SDR……

巧了,Router的第一个大写字母也是R,反正都是网络通信技术(笑)

在这种环境下,原版的OpenWRT不满足需求,第三方“另起炉灶”编译的固件也不敢用。

后来我发现了ImmortalWRT,也是基于OpenWRT二次开发的发行版,就像Debian和Ubuntu、Arch和Manjaro的关系,它有一个完善的软件源仓库,比那些野路的第三方编译要靠谱一些。

虽然也是针对国内情况开创的独立分支,不过软件源和兼容性还是相当可观,一些常用的应用都有,维护和上游同步也较为规范与及时。(尽管如今23.05正式发布了,ImmortalWRT仍停留在rc4版本……不过也能用)


安装

ImmortalWRT官方提供了类似原版OpenWRT的在线构建编译服务,默认预装了必备的软件包(如dnsmasq-full),还可以编辑自定义配置,增加 uci-defaults 初始化脚本,设定IP地址之类的项目。

https://firmware-selector.immortalwrt.org/?version=23.05.0-rc4&target=x86%2F64&id=generic

默认其实就有qcow2、vmdk等各种虚拟磁盘版本,还有iso格式的安装镜像,但这些需要手动配置IP地址。若使用自定义配置的话,就没有这些预提供的版本下载了。在PVE这类虚拟机平台,需要手动转换虚拟磁盘的格式。

PVE的虚拟机创建步骤就不过多赘述了,基本上大部分操作通过图形界面就能完成了,再就是通过local上传镜像。这方面ImmortalWRT和原版的OpenWRT安装过程大差不差。

主要还是记录转换磁盘格式、并导入存储在local-lvm虚拟机的命令:

#转到iso存储池
cd /var/lib/vz/template/iso/
#转换为qcow2磁盘格式
qemu-img convert -f raw -O   qcow2 immortalwrt-[…].img   […].qcow2
#导入对应ID的虚拟机
qm importdisk [VM ID] [...].qcow2 local-lvm

转到虚拟机,设置硬盘和启动项,记得把Guest Agent打开,可以加入串口终端,监控和配置系统命令行。

随后开机,如果自定义设定了同网段IP(不能和原来的主路由重叠),不出意外现在就可以访问luci界面了。是的,就这样简单。


同网段迁移路由结构的话,我是先在虚拟机仅配置了一个LAN桥接网络,并指向为现有的网关和DNS,访问互联网,随后进一步配置需要的软件包;

待一切设定妥当以后(安装软件包、修改防火墙、接口规则),再添加额外的WAN网卡,并保持LAN DHCP打开。把光猫和新的软路由相连,通过PPPoE拨号成功之后,就可以把原来的OpenWRT路由VM关机了。

然后把新的路由系统的LAN设置取消V4网关和DNS,而IP设置为原来的x.1,就不影响原本网段的静态结构拓扑,以及其他设备和软件内的IP设定。就像狸猫换太子一般。

不过域主自己太懒,没有进一步去导入导出端口映射和DHCP绑定的设置,一些设备的IP地址还是发生了变动,但网段结构大体上是没有影响的,尤其是不易更改IP地址的PVE主机。

软件配置

以下是我主要安装的一些额外软件包:(是的,常见的一些L系特色软件,它们在ImmortalWRT官方的软件源就包含了)

luci-app-adbyby-plus
luci-app-advanced-reboot
luci-app-argon-config
luci-app-ddns-go
luci-app-fileassistant
luci-app-firewall
luci-app-frpc
luci-app-ipsec-vpnserver-manyusers
luci-app-openclash
luci-app-openvpn-server
luci-app-opkg
luci-app-passwall
luci-app-softethervpn
luci-app-ttyd
luci-app-udpxy
luci-app-unblockneteasemusic
luci-app-upnp
luci-app-wol
qemu-ga
umdns
kmod-ipt-fullconenat

Passwall不多提,很多配置用copy paste就能够迁移,只是内核发生了变动,协议是一样的,有的订阅Node不是很好支持。

qemu-ga是非常常见的虚拟机服务,安装以后PVE就可以监控、关闭或重启路由器虚拟机了。

umdns可以开启路由器的mDNS广播,兼容苹果的Bonjour(宾周),可以通过 .local 访问主机。fullconenat也没有随默认软件附带,索性就自行安装了。

OpenVPN服务器也回来了,和以前一样,需要在命令行修改 /etc/config/openvpn ,加入 option duplicate_cn '1' 的代码,重新启动就可以允许多设备连接了。顺手配置了一下DDNS,发现原来的过期了,买了一个便宜域名,RDP和Moonlight串流又可以用了,善哉善哉。

SoftEther的话也可以使用,功能很强大,有用户管理功能,但是易用性不如OpenVPN,不太适合跟朋友们联机用。其他几个系统自带的VPN协议,由于版本差异和运营商阻断的关系,我就没连上过……

另外luci界面修改配置以后,有回滚更改的倒计时,默认5秒的生效等待,甚是令人厌烦。对于高性能的x86处理器而言,可以改成更短的时间。只需要编辑 /etc/config/luci 的代码行:

config internal 'apply'
        option rollback '30'
        option holdoff '4'
        option timeout '5'
        option display '1.5'

我直接更改成更短的时间:

config internal 'apply'
        option rollback '30'
        option holdoff '0.2'
        option timeout '0.3'
        option display '0'

不过实测保险起见,还是会有2秒左右的生效延迟,但已经足够了。另外新版的Passwall貌似也是直接编辑,不经过luci界面的生效延迟。


棘手的软件路由器总算告一段落,接下来就要迁移一下PVE主机了。

然后是装个Windows Server重构Minecraft和CS的服务器,之后再研究一下Daphile和HomeAssistant吧……

希望这篇文章记录能帮到一些同好。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注