在 Proxmox VE 中安装 OpenWRT
终于在年末大出血,购置了若干数码产品,有计划外的也有计划中的,其中就包括本文的主角,一台软路由。
懒得再开一篇文章了,就直接在本文开一个章节聊聊最近买的东西。年终总结是什么?先咕咕着吧(((
同时也记录一下在网上搜了各种东西之后,自己装的 OpenWRT on PVE,算是能满足一两年内的家庭网络需要了。
买了些啥?坏了些啥!(笑)
数码产品无关内容的话,因为在学校,懒得逛超市,机缘巧合之下被马云的天猫超市骗进了坑,在上面买了几箱零食和两大件酸奶。(不过酸奶的保质期稍微有点短,48 盒尽力在喝了才勉强在保质期内喝完,还送了别人一些)
在手机上逛超市其实更折磨,对于各种优惠的利用叠加就是在谋杀脑细胞,和现实意义上的逛超市相比,一次所耗费的时间也差不多。唯一的好处,就是确实不用出门吧。
硬盘
数码产品的话,首先是和软路由价钱差不了太多的一块 Seagate Exos 7E8 8TB 企业级 HDD。为啥呢?因为本人台式机里最早的那块盘,Seagate ST2000DM001 2TB(俗称酷鱼;该型号因短命出名,我的也难逃一劫),在我日常上传文件的时候发现了严重掉速和占满活动时间的情况,所以我就打开它的 SMART 信息一看…
这盘不能要了。上面还有一些算比较重要的数据,丢了的话我大概会心痛的。好在这盘目前装的内容大概也就 1.3TB,而我还有一块 8T 的硬盘,空闲空间大概有 3T,可以完全备份这块盘上的数据。
另外也记录一下:通电次数 973 次,通电时间 27647 小时。用了五六年挂掉,也算是不太意外吧…
关掉可能继续在这块盘上进行读写操作的所有其他软件,我选择用 DiskGenius 跑一个全盘到镜像。果不其然,在备份到我之前观测到掉速时程序操作的文件时,DiskGenius 同样报错,并且给了一些可以用于定位该文件的信息。
备份完毕之后,我确定了损坏文件 —— 一个 3GB+ 的视频。好巧不巧,因为异地需要这份文件处理,我之前刚好在笔记本上有一份正确的备份,所以直接替换掉就行了。
关于买新盘的话,首先自然是拒绝灵车。然后容量最好也就别 2T 了,起码翻个番吧。加钱加着加着就加到了企业级,企业级又很贵自然不必多说,JD 之类的渠道更是贵上加贵。不过 TB 的老店那边,大容量的企业级硬盘价格还算可以接受,所以我就买了这么一块,国行五年保修的,希捷银河 Exos 7E8 8TB。
软路由
为什么要买这台软路由呢?因为家里原本的路由性能太低了,曾经一度出现过被 BT 高连接数干爆之类的情况,另外我也没条件直接快进到家里开 IDC / 上机柜。
我原本使用的是 MikroTik RB750Gr3,丢在弱电箱里。不得不说,Gr3 和 ER-X 都算是弱电箱神器,Gr3 应该还更优秀一点;但是呢,它们共同的问题,还是我们的老朋友 MT7621,两个字,拉跨。
所以我开始寻找软路由。那么 2021 年的新晋软路由之星呢,不必多说,肯定是 J4125 准系统啦。可惜这玩意越到年底反而越贵了,之前我看上的 i210 网卡版本也一度出现缺货和涨价的情况,好在最后还是以能接受的价格买到了。
其余各方面都是直接拉满(浪费就浪费了吧,233):2x8GB 的内存,256GB 的 mSATA。讲个笑话,PVE 直接给自己分了 60G …
拿到手,里面的说明书还写着爱快…?本来我也有考虑过要不要用 iKuai,最后还是选择 OpenWRT 一把梭。
安全密钥
还买了 CanoKey Pigeon。虽然我手上已经有 无滴胶探索版 CanoKey 和 YubiKey 5C NFC 了(后者是下半年 Yubico 搞活动的时候找人拼车买的),但是看着 Pigeon 精致的包装和子安客服,没忍住买了。
然后稍微重新弄了一下密钥什么的,更加合理了一点。现在 git commit -S
的时候是插卡啦。
OpenWRT on PVE
那么现在开始正题,优雅(也许)地在你的 PVE 上安装 OpenWRT。ESXi / Hyper-V 什么的我觉得兴许也行,仅供参考。
1. 安装 Proxmox VE
首先当然是把 PVE 装好啦。我选择的方法是找一个 U 盘弄成 Ventoy,然后把 PVE 的镜像直接丢进去就行了。
我选择了对应 ETH1 作为 PVE 的管理网口,计划是 ETH0 用作 WAN,别的都当作 LAN。不过因为我也只需要占用 LAN 中的两个,我还能避免使用管理网口。之前用笔记本直连配置的时候感觉遇到了不少玄学问题。
装好之后,如果有需要搞 PCI-E 硬件直通之类的,建议自己 Google 一下需要做什么配置,然后进行一个相应的配置 + 重启(避免之后 VM 都跑起来了发现需要重启母鸡,笑死)。SSL 同理,可以在装好 OpenWRT 之后在路由器钦定一个域名给 PVE 的后台用。
2. 安装 OpenWRT
因为我并没有太多奇奇怪怪的需求(像是路由器上的代理、网易云音乐解锁、游戏加速之类),所以我选择的是安装官方的 OpenWRT,好处是可以享受到官方的软件仓库,也不用自己费心费空间费时间编译。
镜像我选择的是 openwrt-21.02.1-x86-64-generic-squashfs-combined.img
,至于为什么选择 squashfs
稍后聊。上传到 PVE 之后,使用如下命令给你的虚拟机添加基于此镜像的磁盘:
qm importdisk <vmid> /var/lib/vz/template/iso/<imgfile>.img local-lvm
然后对这块磁盘进行一个初始化,SATA 就行。如果你和我一样有稍后安装软件包的需求,我建议你现在可以提前扩容一下,方便等会儿进行调整。我把这块盘的容量扩到了 2G。
扩容操作使用 Web 或者 shell 都可以,只不过我感觉 Web 对于容量数字处理可能有点 bug,所以选择了 shell。
硬盘修改完毕之后,记得在 选项 - 引导顺序 中勾上这块硬盘。
另外,网卡也要添加好。直通网卡也一样。
3. 扩容 OpenWRT
因为编译时的参数限制,启动之后你会发现 sda 的大小很小,而且就算能识别到硬盘扩容,也不会自动用掉空闲的空间,需要手动操作。
以下内容基本参考了 Openwrt 官方文档,如有不符之处请以最新官方文档为准。
假设你现在已经启动了 OpenWRT,但可能网段不对。你可以用 PVE 的 VNC Shell 暂时修改 OpenWRT 的网段,例如:
ifconfig br-lan 10.0.0.1
打开 Web 之后,你需要调整一下默认的 LAN / WAN 绑定网卡,固化你对于网段的操作。然后建议换一下 opkg 的源,我使用的是 USTC Mirrors。
首先需要安装 fdisk:opkg install fdisk
然后按照下面这样操作:
1 | # 开始操作 sda |
无脑一点的如下,使用需谨慎。
1 | opkg update |
如果你选择了带 EFI(GPT 格式,UEFI 引导)的镜像,你还需要更新一下 GRUB 配置里的分区 UUID。具体内容参见 Wiki,无脑命令见下。
1 | opkg update |
分区大小调整过后,就可以调整文件系统大小了。我们选用的是 squashfs 镜像,所以调整 f2fs overlay
分区即可。
1 | opkg update |
ext4 rootfs
则参见 Wiki。
需要说明的是,我还没试过调整之后会不会影响 squashfs 的升级,但是 ext4 毫无疑问会受到影响。
4. 安装实用插件
如果你的 OpenWRT 到现在还不是中文的:
1 | opkg update |
我选择的插件不算很多:
- DDNS
- 网络唤醒(Wake on LAN)
UPnPDeprecated- SmartDNS
- statistics
- vnstat
小技巧:有 LuCI 的插件,安装 luci-i18n-<plugin-name>-zh-cn
即可一次性装好插件和中文包。
其中:
-
UPnP 个人建议把常用设备和闹鬼设备的 IP 都固定下来,然后用 ACL 定向允许和拒绝,禁用全局的默认允许规则,避免家里电视上的爱奇艺给自己打了个洞开始 pCDN。
当然,如果你不需要随机端口转发,能把内网的服务和 IP 全部固定下来的话,不如使用防火墙手动创建转发规则,比使用 UPnP 更好。
目前,我已经弃用 UPnP,改用防火墙直接转发。
- SmartDNS 我选用的上游服务器:
名称 | 地址 | 类型 |
---|---|---|
DNSPoD DoH | https://doh.pub/dns-query | https |
Cloudflare DoH | https://cloudflare-dns.com/dns-query | https |
Cloudflare DoT | 1.0.0.1 | tls |
TUNA IPv6 | 2001:da8::666 | tcp |
DNSPoD | 119.29.29.29 | udp |
Aliyun | 223.5.5.5 | udp |
Aliyun IPv6 | 2400:3200::1 | udp |
-
抗污染的可靠结果主要依靠 Cloudflare,你也可以根据自己的喜好加入更多。
TUNA 也是境内的可靠抗污染 DNS,小声国内 DNS 的话,只要不用运营商的坑爹 DNS(e.g. Cloudflare API 返回
127.0.0.1
),什么都好。
- WOL 可以自己写一个简单的脚本,把常用设备的 MAC 地址写进去丢到
/etc
里面,方便直接在 SSH 里./wake-<device>.sh
唤醒远端设备。
5. 其他配置
有关 SSH、统计插件、日志等的配置,在此就不多讲了。
OpenWRT 单线多拨
OpenWRT 的多拨,要说的话还是很简单的。
1. 安装软件包
1 | opkg update |
这里就有一个似乎很坑的地方:我起初没有安装 kmod-macvlan
,因为我认为 mwan3 应该依赖了 macvlan 所以不再需要我自己装。然而,是没有依赖的。
更令我迷惑的是,没装 kmod-macvlan
,LuCI 里就可以创建 Macvlan 类型的设备了…
2. 创建虚拟网卡和接口
装好软件包之后,在 LuCI - 网络 - 接口 - 设备 左下角添加设备配置。
你需要几拨就创建几个。设备类型选 Macvlan,基设备选 WAN 的那个端口,LuCI 会自动填充一个类似 eth0mac0
这样的设备名。你可以根据你的喜好修改,当然我是直接保留了。其余选项可以不加修改,保存即可。
回到「接口」。
在左下角添加新的接口,设备选择你刚创建的虚拟网卡,协议自然是 PPPoE。接口名称的话,我采用的是 vwan0
的格式,看你喜好。
所有虚拟接口需要在「高级设置」中指定网关跃点,需要互不相同(才能负载均衡),比如 51/52/53/…
为了使用 IPv6,我的选择是 vwan0 自动获取 IPv6 地址(产生一个 IPv6 的虚拟动态接口),其他接口禁用 IPv6,毕竟我也不想再搞 NAT6,也不想研究 IPv6 的多拨负载均衡。
如果你可以接受现在暂时没有网,你可以先 把原来的 WAN 取消开机自动运行并且停止运行 / 修改协议为「不配置协议」,并且把防火墙区域里面的 WAN 范围改成你的几个 vwan(IPv6 产生的动态接口可以不用选中)。
然后配置 mwan3。在「网络」中找到「负载均衡」,在「接口」中添加你的 vwanX,我还额外添加了 vwan0_6。跟踪接口是否在线看个人情况配置。
在「成员」中参考默认成员,为你的所有接口添加成员。
「策略」比较简单,一般来说设置几个 _only
策略和一个 _balanced
可以满足大部分人的需要。我把 IPv6 的唯一成员加到了所有策略中,虽然影响应该不大(
「规则」就是具体的负载均衡规则了。比如我指定了一个设备单独使用多拨中的某一条,避免产生频繁的出口 IP 变动和占用其他线的带宽。其它规则看自己。
调试 mwan3(以及其他玩意儿的时候)有一句话我觉得是应该时刻铭记的:如遇玄学问题,尝试重启防火墙和系统。
最后分享一下我的配置截图吧。
基于 VLAN 的单线复用 和 IPTV 组播转发、组播转单播
最近在网上看到了一些有关 IPTV 的东西,所以就来折腾一下试试。
我的需求是:
- 软路由下的设备能:
- 通过转发的组播在本地观看 IPTV 直播
- 通过组播转单播在本地或在外观看 IPTV 直播
- 暂不考虑 把 IPTV 机顶盒接入 LAN 之后相关的认证、拨号转发等,因为装修布线都是给电视盒子有专门到光猫的线,不存在布线导致的问题
- 配置需求:
- 只需一根网线直连光猫和交换机
- 在光猫配置 VLAN 绑定,并为所有用途(VoIP / IPTV / Internet / TR069)的 VLAN 全部做转发,有备无患
- 在软路由处理 IPTV 的 DHCP、组播
我使用的光猫是 HUAWEI HN8145V,成都电信。
1. VLAN 单线复用
前提条件是调教光猫以取得控制权(或者从装维师傅那弄到光猫的超密),并且确保电信界面提供的功能也能满足我们的需求。如果你不拥有对光猫的控制权,你可能需要想别的办法。
我已经将光猫从电信界面修改为了更加大气好用的华为原厂界面,以下均基于 HN8145V 的原厂界面进行说明。
1. 简单确认各连接
在「系统信息 - WAN信息」里,可以看到当前光猫配置了哪些连接,以及它们的 VLAN ID 等。
比如,我的路由模式的连接有 TR069、VoIP;桥接模式的则还有 IPTV 和 Internet。另外可以得知:我的光猫并不负责 IPTV 的 DHCP 和 PPPoE,而是由电视盒子自行处理。
WAN 连接的端口绑定影响不大,因为端口一旦修改为 VLAN 绑定,对应连接就会自动解绑端口。
2. VLAN 绑定
在「高级配置 - 路由 - IPv4 VLAN绑定配置」下,可以看到各端口的绑定情况。
选择需要修改的 LAN 端口,模式修改为 VLAN 绑定,并填入 VLAN 对即可。
我对 VLAN 做了个简单的映射:10/VoIP,20/IPTV,30/Internet,40/TR069
。用户侧的 VLAN ID 你可以按你的喜好选择,WAN 侧的则需要填写之前连接对应的 VLAN ID。
3. 创建 VLAN 设备和接口
在 OpenWRT LuCI 下,找到「网络 - 接口 - 设备」,添加 VLAN (802.1q)
类型的设备,基设备选择连接光猫的端口,VLAN ID 为你刚才选择的用户侧 VLAN ID,其他设置一般无需改变(IPTV 相关的稍后再说)。
然后在「接口」下新建对应的需要的接口,如 wan
用于上网,vwan
作为 Macvlan 多拨接口的前缀,wan_iptv
作为 IPTV 的接口,wan_tr069
作为 TR069 的接口等。
修改接口的高级设置,「使用网关跃点」为每个接口填上不一样的跃点,如果多拨则每个虚拟接口跃点都要不同,并保证上网接口的跃点最小。
举例,我为 vwan0~3
配置的跃点是 50~52,IPTV 是 60,TR069 是 70。
接口设置完毕之后,为各接口配置正确协议,以及可选的多拨等。
2. IPTV 组播转发、组播转单播
1. 根据实际情况配置 IPTV 接口
下面配置 IPTV 接口(wan_iptv
),根据实际情况选择 DHCP 客户端。
成都电信的 IPTV DHCP 配置如下:
- 接口 - 常规设置 - 请求 DHCP 时发送的主机名:盒子背面的 32 位字符(有的盒子可能标注为
STBID
),该字符结尾 12 位是盒子的 MAC 地址 - 接口 - 高级设置 - 请求 DHCP 时发送的 Vendor Class 选项:
SCITV
- 设备 - 对应 IPTV VLAN 的设备 - 常规设备选项 - MAC 地址:盒子的 MAC 地址
完成之后,启动或重启该接口,你应该能获得一个私网地址。
如果你的地区和我不一样,请考虑使用具有端口镜像功能的设备(如另一台 OpenWRT 路由器或专用设备等),然后使用 Wireshark 进行抓包。你也可以将 IPTV VLAN 接口和一个 LAN 端口桥接,然后使用 tcpdump
等方式抓包分析,同时还能获取到节目组播地址。
2. 获取组播地址
成都电信的组播地址在 这里 有一份,你需要对这张表格进行一定处理,将其转为 M3U 播放列表。(我暂时不知道他们有没有 M3U 直接对外提供)
如果你的地区和我不一样,刚才已经提到了抓包可以获取组播地址,你也可以在 恩山无线论坛 - IPTV 信源、网络视频直播 IP 资源、直播代码 板块碰碰运气。
扫描组播地址
除此之外,如果你知道了你所在地区 IPTV 所使用的组播 IP 大致范围,如 239.93.0.0/23
,你也可以扫描。
扫描需要组播转发配置正确,确认有线接入的设备可以通过组播观看节目。
工具有三:Python 版 / Windows 版 / Linux 版
其中 Python 版来得比较粗暴,需要你预先给定端口号。我自己稍微修改过一点的版本在 Gist 上,有需要可以自行取用。
Windows 和 Linux 版原理差不多,通过发 IGMP 包然后自己抓,获取组播地址和端口号。Windows 需要安装 npcap
,Linux 则需要 libpcap
的头文件并自行编译,好在不用自设端口号,缺点是相对于 Python 版可能会扫漏。
有了组播地址之后,最好将其制作成 M3U 播放列表,可以根据播放需要(内网组播 / 内网单播 / 外网单播)再制作几个差分版本,就可以在各种设备上通过这个播放列表方便地收看节目了。
3. 使用 udpxy
组播转单播
udpxy
可以将 UDP 的组播流量转为 HTTP 的单播,这样就可以实现在内外网观看 IPTV,而且操作门槛极低,所以优先介绍配置。
安装:
1 | opkg update |
在「服务 - udpxy」找到配置页,直接对自带配置进行修改即可。
- 勾选「已启用」、「刷新」和「状态」
- 「端口」根据实际修改或不修改
- 「源 IP/接口」输入你的 IPTV VLAN 接口名称,如
eth3.20
- 如需要留存日志文件,在「日志文件」填入日志保存路径;注意这个日志会比较占空间。
保存之后,可以访问 http://<路由器 IP>:<udpxy 端口>/status
检查 udpxy 是否在正常运行。如果你已经有了组播地址,你可以将其改写为 http://<路由器 IP>:<udpxy 端口>/<组播协议>/<组播 IP>:<端口>
,即可通过 udpxy 转为单播。
示例:
- 组播地址为
rtp://239.93.0.1:5140
,udpxy 运行在192.168.1.1:8888
- 单播地址为
http://192.168.1.1:8888/udp/239.93.0.1:5140
(协议写 rtp 或者 udp 都可以)
同时,利用可信的组播地址,你可以确认你的 IPTV 接口是否真的正常工作,以及 udpxy 是否能正常触达接口(在未错误配置的情况下一般是可以的)。
4. 使用 omcproxy 进行组播代理
安装:
1 | opkg update |
以下设置建议一次性应用。
- 「网络 - 接口 - 设备 - br-lan 网桥设备 - 高级设备选项」
启用 IGMP 嗅探
:启用 - 「服务 - 组播代理」如没有默认实例则新建一个,
上行链路接口
为 IPTV 接口(如我的wan_iptv
),下行链路接口
为lan
- 「网络 - 防火墙 - 常规设置 - 区域」为 IPTV 新建一个区域
iptv
,设置参考 wan 的填写,涵盖的网络
自然是wan_iptv
,允许来自源区域的转发
选上lan
- 「网络 - 防火墙 - 通信规则」为
iptv
区域新建三条规则[1],配置和结果见下
1 | config rule |
保存。接下来你可以测试一下 udpxy 是否正常工作、有线网是否能观看 IPTV,如果一切正常则可以开始使用。
总结
购置这台软路由,当然是希望能提升家庭网络的稳定性和性能。无线目前有 2 个有线回程的 AP 和一个无线回程的 AP,基本实现了我家众多墙之间的 5GHz 全覆盖。而软路由对于有线网络应该有一定提升,另外 PVE 也给我留下了很大的可能性。
近年来家庭宽带速率越来越高,但是套餐资费其实越来越坑,连公网 IP 也开始受到威胁,而且上行也并不比我现有的套餐更高。单从套餐上来讲,我很可能不会在近期更换套餐来提升网速。
千兆应该还能满足我两三年以内的内网需求,等到时候再换更猛的设备吧。也是软路由吊着 7621 打的性能才让我有了多拨和 IPTV 的信心和动力。
年末大出血,现在好穷((
参考
本文参考了包括但不限于以下文章,在此向它们的作者表示感谢:
- [OpenWrt Wiki] OpenWrt on x86 hardware (PC / VM / server)
- 单线融合IPTV到家庭局域网最简单的方法:路由+桥接混合模式 - 川叶 :: 不舍昼夜
- IPTV 与互联网融合 - 蠢黑通行
- …
虽然
omcproxy
会自动向防火墙中添加前两条规则,但是保险起见还是自己新建一次 ↩︎
在 Proxmox VE 中安装 OpenWRT