6. 使用iStoreOS作为旁路由
在接触 Proxmox VE 前,我时常会被 VPS 和本地虚拟机来回折磨,前者拥有便捷的网络环境和羸弱的计算存储资源,而后者正好相反,当时我能想到的最好办法就是斥巨资买一台国外的顶配 VPS,幸好由于预算不足搁置了下来。
早期使用 Proxmox VE 时,网络问题继续困扰着我,每个 LXC 容器和 KVM 虚拟机都需要:配置命令行代理、配置 Docker Daemon 代理、配置容器代理、配置构建镜像代理……如果可以在网关上配置自动代理就不需要这么折腾了。
但之前用过 openwrt 作为主路由的体验不是很好,域名的分流规则不准确加上代理服务器网络不稳定,导致手机、平板访问国内网站偶尔卡死,而且手上的光猫无法做桥接,使用 openwrt 做主路由的话又会多一层 NAT~直到后来发现 iStoreOS 还有一个旁路由模式。
旁路由模式下,iStoreOS 只为特定设备提供代理,不影响未手动配置网关的网络设备,这样即使出现异常也不会导致全军覆没。
Proxmox VE 里可以在控制台上为 LXC 容器和 KVM 虚拟机设置网关和 DNS 服务器为 iStoreOS 地址,在过去半年内,我认为它基本解决了 Proxmox VE 上访问外网的问题,目前家里的网络结构如下:
下面是使用 iStoreOS 作为旁路由的操作记录。
首先从 iStoreOS 官网下载 x86_64 平台的镜像:iStoreOS x86_64 固件,这里使用的是 2024071911 版本:
wget -c https://fw0.koolcenter.com/iStoreOS/x86_64/istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img.gz
gunzip istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img.gz
下载后解压得到一个 img 文件,使用 file 命令检查可以看到它使用 MBR 分区:
➜ ~ ls /root/istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img
/root/istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img
➜ ~ file /root/istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img
/root/istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img: DOS/MBR boot sector
接下来创建一个空的 Linux 虚拟机,机型选择默认的 i440fx,BIOS 选择默认的 SeaBIOS,不挂载光驱和硬盘,规格选择 2C4G:
这个虚拟机的 ID 为 103,下面为它导入上一步解压得到的 img 文件,命令格式为:qm disk import 虚拟机ID 虚拟机磁盘文件 存储
:
qm disk import 103 /root/istoreos-22.03.6-2024071911-x86-64-squashfs-combined.img intel
然后回到 PVE 控制台,可以看到新增了一个 未使用的磁盘 0,编辑硬盘挂载到 SCSI 总线的 0 号设备即可:
然后在 选项-> 引导顺序 中,选择 scsi0 并设置为优先:
最后开机,这里会完成一次初始化,并通过 DHCP 获取到一个地址:
我们希望静态配置 iStoreOS 的 IP 地址,需要先访问 DHCP 得到的地址配置路由,修改 IP 地址并设置旁路由模式,iStoreOS 的默认账户密码为:root/password,我们在网络向导中选择 旁路由 -> 手动配置 -> 配置旁路由:
这里设置静态 IP 为 192.168.1.3,子网掩码为 255.255.255.0,网关地址(即主路由地址)为 192.168.1.1,关闭 提供DHCPv4 服务(继续由主路由提供 DHCP 服务),启用 自动获取 IPv6,保存后会应用配置,等待配置完成就可以使用 192.168.1.3 访问 iStoreOS:
iStoreOS 的官方仓库中没有提供常用的网络插件,我们需要从一些网络大善人的仓库中下载:github.com/AUK9527/Are-u-ok。
选择使用的是 X86_64 平台的软件包:
下载到的软件包是一个 run 文件,可以在 iStore 商店的手动安装里上传安装:
也可以 scp 拷贝到 iStoreOS 里手动执行 sh 包名.run
安装,如:sh PassWall_4.77-6_x86_64_all_sdk_22.03.6.run
。
在安装完成后,就可以添加代理节点,默认的规则中已经包含了常用受限的网址,比如 docker.io:
在 PVE 的控制台页面上,可以直接设置 LXC 容器的网络参数,如下:
这里设置了 LXC 容器的静态地址为 192.168.1.20/24,网关与 DNS 服务器为 iStoreOS 地址 192.168.1.3。
KVM 虚拟机可以使用 cloudinit,给虚拟机添加 cloudinit 设备后,就可以在 Cloud-Init 选项里做自定义配置:
为了确保流量都经过旁路由处理,除了在控制台上选择静态 IPv6 外,还需要在系统中配置内核参数禁用 IPv6,Linux 系统需要在 /etc/sysctl.conf 中添加以下内核参数并重启:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
完成配置后命令行访问谷歌测试链接:
➜ ~ curl -v https://google.com
* Trying 142.251.32.46:443...
* Connected to google.com (142.251.32.46) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
...
完成上述配置后,Proxmox VE 中的虚拟机已经相当于国外的 NAT 网络类型 VPS,常见的网站都可以通过自动分流经过代理服务器访问,遇到特殊需求要全局转发流量的,也可以在 PassWall 上通过 访问控制,将虚拟机的出向流量绑定到指定代理服务器:
其他内网设备如游戏主机、掌机等,遇到需要网络层流量代理时,只需要修改默认网关为 iStoreOS 的地址即可享受自动代理。
除了充当网关外,iStoreOS 还有许多玩法:
- 挂载 SATA 硬盘或者 USB 硬盘提供内网共享存储,支持 SMB、WebDAV、NFS 三种协议
- 部署 KMS 服务器,自动激活内网的 Windows 产品
- 其他通过 Docker 支持的应用
解决完出向流量问题后,下一步是入向流量,这里就需要一些内网穿透工具来支持在外网访问内网的 LXC 容器与 KVM 虚拟机。