PVE + ImmortalWrt 旁路网关部署实战

发布于 — 2026 年 03 月 09 日
#计算机 #ImmortalWrt #OpenWrt #PVE #OpenClash #homelab

之前一直在用 eSir 的佛跳墙固件,每次升级都要重新刷机、重新配置,挺麻烦的。最近换成了 ImmortalWrt,官方源支持 sysupgrade 平滑升级,配置都能保留,省事不少。

ImmortalWrt 是 OpenWrt 的一个分支,主要是针对中国大陆用户做了一些本地化优化,比如内置了更多的驱动、默认开启了一些实用功能。部署在 PVE 上作为旁路网关使用,配合 OpenClash 做透明代理。

创建虚拟机

firmware-selector.immortalwrt.org 搜索 x86/64,下载 ext4-combined-efi.img.gz 文件。官方源下载慢的话可以用国内镜像。

在 PVE 上创建虚拟机时有个坑:必须指定 --scsihw virtio-scsi-pci,否则默认的 LSI 控制器会导致 ImmortalWrt 无法识别磁盘,系统无法正常引导。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建虚拟机
qm create 211 --name openwrt-new --memory 1024 --cores 2 --bios ovmf \
  --scsihw virtio-scsi-pci \
  --efidisk0 local-lvm:1 --net0 virtio,bridge=vmbr0 --ostype l26 \
  --serial0 socket --agent enabled=1

# 解压镜像并导入磁盘
gunzip /tmp/immortalwrt-*-combined-efi.img.gz
qm importdisk 211 /tmp/immortalwrt-*-combined-efi.img local-lvm
qm set 211 --scsi0 local-lvm:vm-211-disk-1
qm set 211 --boot order=scsi0
qm start 211

网络配置

ImmortalWrt 默认 IP 是 192.168.1.1,和我内网的 10.0.0.0/24 网段不一样,无法直接 SSH。需要通过 PVE 的串口终端先改一下 IP:

1
2
# 在 PVE 主机上连接串口(Ctrl+O 退出)
qm terminal 211

进入串口后设置 IP、网关和 DNS:

1
2
3
4
5
uci set network.lan.ipaddr='10.0.0.211'
uci set network.lan.gateway='10.0.0.1'
uci set network.lan.dns='10.0.0.1'
uci commit network
/etc/init.d/network restart

旁路网关不需要 DHCP 服务,直接关掉。如果启用了 IPv6,还需要禁用 odhcpd 的 RA 广播:

1
2
3
4
5
6
7
8
9
uci set dhcp.lan.ignore=1
uci commit dhcp
/etc/init.d/dnsmasq restart

# 如果启用了 IPv6,禁用 RA/DHCPv6
uci set dhcp.lan.ra='disabled'
uci set dhcp.lan.dhcpv6='disabled'
uci commit dhcp
/etc/init.d/odhcpd restart

安装 OpenClash

ImmortalWrt 官方源不含 OpenClash,需要从 GitHub Releases 手动下载 ipk 安装。

如果虚拟机无法直连 GitHub,可以在能访问的主机上下载后 SCP 过去:

1
2
wget https://github.com/vernesong/OpenClash/releases/download/v0.47.055/luci-app-openclash_0.47.055_all.ipk
scp -O luci-app-openclash*.ipk root@10.0.0.211:/tmp/

在 ImmortalWrt 上安装:

1
2
opkg update
opkg install /tmp/luci-app-openclash*.ipk

ImmortalWrt 默认自带 dnsmasq-fullluci-compat,不需要像官方 OpenWrt 那样手动替换 dnsmasq。OpenClash 安装后内置三个面板,无需额外安装。

配置迁移

如果是从旧的 OpenWrt 迁移,且两边 OpenClash 版本相近,可以直接打包配置文件迁移:

1
2
3
4
5
6
7
# 在旧机器上打包
ssh root@<旧机器> "tar czf /tmp/openclash-backup.tar.gz /etc/openclash/ /etc/config/openclash"

# 传到新机器并解包
scp -O root@<旧机器>:/tmp/openclash-backup.tar.gz /tmp/
scp -O /tmp/openclash-backup.tar.gz root@10.0.0.211:/tmp/
ssh root@10.0.0.211 "tar xzf /tmp/openclash-backup.tar.gz -C / && /etc/init.d/openclash restart"

QEMU Guest Agent

装一下 QEMU Guest Agent,这样 PVE 能正确获取虚拟机的 IP 地址:

1
2
ssh root@10.0.0.211 "opkg update && opkg install qemu-ga && \
  /etc/init.d/qemu-ga start && /etc/init.d/qemu-ga enable"

安装后需要在 PVE 上关机再开机(不是 reboot)让 Guest Agent 生效:

1
2
3
qm shutdown 211 --timeout 30
qm start 211
qm agent 211 ping  # 验证

客户端使用

设备端两种方式:

  • HTTP 代理:设备代理指向 10.0.0.211:7890
  • 网关模式:设备的网关和 DNS 都改为 10.0.0.211

网关模式下所有流量都走代理,适合需要全局代理的场景。HTTP 代理模式更灵活,可以按需开启。