Atlantis
GitHub 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

6. 使用iStoreOS作为旁路由

Created At 2024-07-21 Updated on 2025-10-25

1. 前言

在接触 Proxmox VE 前,我时常会被 VPS 和本地虚拟机来回折磨,前者拥有便捷的网络环境和羸弱的计算存储资源,而后者正好相反,当时我能想到的最好办法就是斥巨资买一台国外的顶配 VPS,幸好由于预算不足搁置了下来。

早期使用 Proxmox VE 时,网络问题继续困扰着我,每个 LXC 容器和 KVM 虚拟机都需要:配置命令行代理、配置 Docker Daemon 代理、配置容器代理、配置构建镜像代理……如果可以在网关上配置自动代理就不需要这么折腾了。

但之前用过 openwrt 作为主路由的体验不是很好,域名的分流规则不准确加上代理服务器网络不稳定,导致手机、平板访问国内网站偶尔卡死,而且手上的光猫无法做桥接,使用 openwrt 做主路由的话又会多一层 NAT~直到后来发现 iStoreOS 还有一个旁路由模式。

旁路由模式下,iStoreOS 只为特定设备提供代理,不影响未手动配置网关的网络设备,这样即使出现异常也不会导致全军覆没。

Proxmox VE 里可以在控制台上为 LXC 容器和 KVM 虚拟机设置网关和 DNS 服务器为 iStoreOS 地址,在过去半年内,我认为它基本解决了 Proxmox VE 上访问外网的问题,目前家里的网络结构如下:

alt text

下面是使用 iStoreOS 作为旁路由的操作记录。

2. 创建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:

alt text

这个虚拟机的 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 号设备即可:

alt text

然后在 选项-> 引导顺序 中,选择 scsi0 并设置为优先:

alt text

最后开机,这里会完成一次初始化,并通过 DHCP 获取到一个地址:

alt text

我们希望静态配置 iStoreOS 的 IP 地址,需要先访问 DHCP 得到的地址配置路由,修改 IP 地址并设置旁路由模式,iStoreOS 的默认账户密码为:root/password,我们在网络向导中选择 旁路由 -> 手动配置 -> 配置旁路由

alt text

alt text

alt text

这里设置静态 IP 为 192.168.1.3,子网掩码为 255.255.255.0,网关地址(即主路由地址)为 192.168.1.1,关闭 提供DHCPv4 服务(继续由主路由提供 DHCP 服务),启用 自动获取 IPv6,保存后会应用配置,等待配置完成就可以使用 192.168.1.3 访问 iStoreOS:

alt text

3. 安装PassWall插件

iStoreOS 的官方仓库中没有提供常用的网络插件,我们需要从一些网络大善人的仓库中下载:github.com/AUK9527/Are-u-ok

选择使用的是 X86_64 平台的软件包:

alt text

下载到的软件包是一个 run 文件,可以在 iStore 商店的手动安装里上传安装:

alt text

也可以 scp 拷贝到 iStoreOS 里手动执行 sh 包名.run 安装,如:sh PassWall_4.77-6_x86_64_all_sdk_22.03.6.run

在安装完成后,就可以添加代理节点,默认的规则中已经包含了常用受限的网址,比如 docker.io:

alt text

4. 配置LXC容器与KVM虚拟机

在 PVE 的控制台页面上,可以直接设置 LXC 容器的网络参数,如下:

alt text

alt text

这里设置了 LXC 容器的静态地址为 192.168.1.20/24,网关与 DNS 服务器为 iStoreOS 地址 192.168.1.3。

KVM 虚拟机可以使用 cloudinit,给虚拟机添加 cloudinit 设备后,就可以在 Cloud-Init 选项里做自定义配置:

alt text

为了确保流量都经过旁路由处理,除了在控制台上选择静态 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
...

5. DHCPv6异常

在使用 iStoreOS 的过程中,我遇到了一个比较奇怪的问题,iStoreOS 从上游光猫 DHCP 获取 IPv6 的操作可能发生异常,但同子网下其他 Linux 设备未见异常,如果无法更新 IPv6 导致,PassWall 就会因为网络不通导致 DNS 解析异常,需要等待请求超时后再访问备用 DNS 服务器获取解析结果,因此网络访问变得异常缓慢。iStoreOS 的 issue 中也没查到靠谱的解决办法,于是写了一个简单的自动重启脚本,如下:

#!/bin/bash

# 定义域名
domain="aliyun.com"

# 定义连续 ping 失败次数
ping_fail_count=3

# 定义网卡名称
network_interface="lan6"

# 检查网络是否可达
ping_count=0
while [ $ping_count -lt $ping_fail_count ]; do
    ping -6 -c 1 $domain > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "$(date) [$ping_count] Ping $domain failed!"
        ping_count=$((ping_count+1))
    else
        echo "$(date) [$ping_count] Ping $domain succeeded!"
        break
    fi
done

# 判断网络是否可达
if [ $ping_count -eq $ping_fail_count ]; then
    echo "$(date) Network is not reachable, restarting $network_interface..."
    # 重启网卡
    ifdown $network_interface && sleep 3s && ifup $network_interface
    echo "$(date) Network interface $network_interface restarted."
else
    echo "$(date) Network is reachable."
fi

连续 ping6 三次 aliyun.com,都失败的话就重启 lan6 来触发重新执行 DHCPv6,脚本保存成 ipv6.sh,通过 crontab 定时 10 分钟执行一次:

*/10 * * * * /usr/bin/ipv6.sh

6. 写在最后

完成上述配置后,Proxmox VE 中的虚拟机已经相当于国外的 NAT 网络类型 VPS,常见的网站都可以通过自动分流经过代理服务器访问,遇到特殊需求要全局转发流量的,也可以在 PassWall 上通过 访问控制,将虚拟机的出向流量绑定到指定代理服务器:

alt text

其他内网设备如游戏主机、掌机等,遇到需要网络层流量代理时,只需要修改默认网关为 iStoreOS 的地址即可享受自动代理。

除了充当网关外,iStoreOS 还有许多玩法:

  1. 挂载 SATA 硬盘或者 USB 硬盘提供内网共享存储,支持 SMB、WebDAV、NFS 三种协议
  2. 部署 KMS 服务器,自动激活内网的 Windows 产品
  3. 其他通过 Docker 支持的应用

alt text

解决完出向流量问题后,下一步是入向流量,这里就需要一些内网穿透工具来支持在外网访问内网的 LXC 容器与 KVM 虚拟机。