PVE8.2双网卡(有线+无线)自动切换并通过NAT+OpenVPN访问虚拟机

前言

在网上没有找到PVE8.2双网卡自动切换并通过NAT+OpenVPN访问虚拟机的教程,所以自己摸索着配置了一遍,记录一下。

网络环境说明

本教程中,我们将配置双网卡自动切换的网络环境,具体网络结构如下:

  • 主链路:vmbr0 → eno1(192.168.1.0/24,metric 100)
  • 备链路:wlp4s0(192.168.137.0/24,metric 200)
  • 双路由表 + 策略路由
  • 内部网络隔离桥接:vmbr1(10.10.254.0/24)

这个配置方案可以实现在有线网络断开时自动切换到无线网络,确保PVE服务器管理界面的持续可访问性。

一、安装必要软件

首先需要离线安装无线网络工具。PVE是默认没有安装无线网卡驱动和配置工具的,需要手动安装:

1
2
# 离线安装wpasupplicant(提前下载好相应的deb包)
dpkg -i wpasupplicant_*.deb

如果没有离线安装包,也可以在PVE连接有线网络的情况下在线安装:

1
2
apt-get update
apt-get install wpasupplicant ifupdown2

二、配置无线网络

  1. 使用以下命令生成无线网络的配置信息:
1
wpa_passphrase YourSSID YourPassword
  1. 命令输出类似如下内容,记录其中psk的值,后续会用到:
1
2
3
4
5
network={
ssid="YourSSID"
#psk="YourPassword"
psk=deb2e549f3157f7e8685b98c30365697af89f1cea54fc89f9c2573977844b1c0
}

三、修改网络配置文件

接下来修改PVE的网络配置文件/etc/network/interfaces

1. 无线网卡配置(备用链路)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
allow-hotplug wlp4s0
iface wlp4s0 inet static
address 192.168.137.111/24
gateway 192.168.137.1
metric 200
wpa-ssid YourSSID
wpa-psk deb2e549f3157f7e8685b98c30365697af89f1cea54fc89f9c2573977844b1c0

up ip route add 192.168.137.0/24 dev wlp4s0 table 2
up ip route add default via 192.168.137.1 dev wlp4s0 table 2
up ip rule add from 192.168.137.111/32 table 2 priority 200
down ip rule del from 192.168.137.111/32 table 2
down ip route del default via 192.168.137.1 dev wlp4s0 table 2
down ip route del 192.168.137.0/24 dev wlp4s0 table 2

这里需要将YourSSIDwpa-psk的值替换为你的实际的无线网络名称和之前生成的psk值。同时,addressgateway也需要根据你的实际网络环境进行调整。

2. 有线网络桥接配置(主链路)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
auto vmbr0
iface vmbr0 inet static
address 192.168.1.100/24
gateway 192.168.1.1
metric 100
bridge-ports eno1
bridge-stp off
bridge-fd 0

up ip route add 192.168.1.0/24 dev vmbr0 table 1
up ip route add default via 192.168.1.1 dev vmbr0 table 1
up ip rule add from 192.168.1.100/32 table 1 priority 100
down ip rule del from 192.168.1.100/32 table 1
down ip route del default via 192.168.1.1 dev vmbr0 table 1
down ip route del 192.168.1.0/24 dev vmbr0 table 1

根据你的实际网络环境修改IP地址和网关信息。

完整的配置文件

完整的/etc/network/interfaces配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual

iface enp3s0 inet manual

allow-hotplug wlp4s0

iface wlp4s0 inet static
address 192.168.137.111/24
gateway 192.168.137.1
metric 200

wpa-ssid AAA
wpa-psk deb2e549f3157f7e8685b98c30365697af89f1cea54fc89f9c2573977844b1c0

up ip route add 192.168.137.0/24 dev wlp4s0 table 2
up ip route add default via 192.168.137.1 dev wlp4s0 table 2
up ip rule add from 192.168.137.111/32 table 2 priority 200
down ip rule del from 192.168.137.111/32 table 2
down ip route del default via 192.168.137.1 dev wlp4s0 table 2
down ip route del 192.168.137.0/24 dev wlp4s0 table 2


auto vmbr0
iface vmbr0 inet static
address 192.168.1.100/24
gateway 192.168.1.1
metric 100
bridge-ports eno1
bridge-stp off
bridge-fd 0

up ip route add 192.168.1.0/24 dev vmbr0 table 1
up ip route add default via 192.168.1.1 dev vmbr0 table 1
up ip rule add from 192.168.1.100/32 table 1 priority 100
down ip rule del from 192.168.1.100/32 table 1
down ip route del default via 192.168.1.1 dev vmbr0 table 1
down ip route del 192.168.1.0/24 dev vmbr0 table 1

source /etc/network/interfaces.d/*

配置完成后,可以使用以下命令使配置立即生效:

1
ifreload -a

如果未安装ifupdown2,先离线安装,否则无法使用ifreload命令。

四、配置路由表

修改/etc/iproute2/rt_tables文件,在文件末尾添加:

1
2
1   eno1
2 wlp4s0

这样会创建两个路由表,分别用于有线网卡和无线网卡的路由控制。

五、启用链路失效自动忽略功能

创建或修改文件/etc/sysctl.d/99-linkdown.conf,添加以下内容:

1
2
net.ipv4.conf.all.ignore_routes_with_linkdown = 1
net.ipv4.conf.vmbr0.ignore_routes_with_linkdown = 1

这个配置使系统在网络链路失效时会自动忽略对应的路由表,从而切换到可用的链路。使用以下命令使配置立即生效:

1
sysctl -p /etc/sysctl.d/99-linkdown.conf

六、NAT配置

  1. 开启系统IP转发功能

首先需要开启系统的IP转发功能,编辑/etc/sysctl.conf文件:

1
nano /etc/sysctl.conf

在文件中找到net.ipv4.ip_forward = 0这一行,将其修改为net.ipv4.ip_forward = 1,然后保存并退出。

使用以下命令使配置立即生效:

1
sysctl -p
  1. 配置内网隔离桥接

在配置文件/etc/network/interfaces中,可以配置内网隔离桥接(vmbr1):

1
2
3
4
5
6
7
8
auto vmbr1
iface vmbr1 inet static
address 10.10.254.254/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up bash /root/iptables.config.sh

将上面的内容加到/etc/network/interfaces文件source /etc/network/interfaces.d/*前即可。

  1. 自定义NAT脚本

创建文件/root/iptables.config.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env bash
set -euo pipefail

##################### 可调参数 #####################
EXT_IFACES=(vmbr0 wlp4s0) # 外网接口,可按需增删
LAN_CIDR="10.10.254.0/24" # 内部虚网段

# 端口映射表:格式 外部端口:协议:VM_IP:内部端口
MAPPINGS=(
"2222:tcp:10.10.254.1:22" # VM1 ssh
"2223:tcp:10.10.254.2:22" # VM2 ssh
"1194:udp:10.10.254.3:1194" # VM3 openvpn
)
###################################################

# 开启 IPv4 转发
sysctl -qw net.ipv4.ip_forward=1

# 清空旧 NAT 规则
iptables -t nat -F

# 源 NAT
iptables -t nat -A POSTROUTING -s "$LAN_CIDR" ! -d "$LAN_CIDR" -j MASQUERADE

# 端口转发
for entry in "${MAPPINGS[@]}"; do
IFS=: read -r EXT_PORT PROTO VM_IP INT_PORT <<< "$entry"
for IFACE in "${EXT_IFACES[@]}"; do
iptables -t nat -A PREROUTING -i "$IFACE" -p "$PROTO" --dport "$EXT_PORT" \
-j DNAT --to-destination "$VM_IP:$INT_PORT"
done
done

脚本自己写有点垃圾,最后还是让O3帮我优化了一版。
只需要在MAPPINGS里加入你需要的端口映射就可以了,格式一定要写成外部端口:协议:VM_IP:内部端口,比如2222:tcp:10.10.254.1:22

注意:在这里一定要配置好1194端口,后续OpenVPN连接的时候需要。

确保创建此脚本并给予执行权限:

1
chmod +x /root/iptables.config.sh

七、OpenVPN配置

为什么会有这个配置呢,是因为如果虚拟机里服务太多得经常更新NAT脚本文件,还不如直接用vpn连到内网像调用本地一样方便,我是将Docker安装OpenVPN放到虚拟机里的。

  1. 环境准备

需要安装Docker。

1
curl -fsSL https://get.docker.com | sh
  1. 创建持久化目录并修改权限
1
2
sudo mkdir -p /opt/openvpn-data
sudo chmod 700 /opt/openvpn-data
  1. 初始化配置
1
2
3
4
5
6
7
8
9
export OVPN_DATA_HOST="/opt/openvpn-data"

docker run --rm -v ${OVPN_DATA_HOST}:/etc/openvpn \
kylemanna/openvpn ovpn_genconfig \
-u udp://vpn.example.com \
-p "push \"route 10.10.254.0 255.255.255.0\""

docker run --rm -it -v ${OVPN_DATA_HOST}:/etc/openvpn \
kylemanna/openvpn ovpn_initpki
  1. 启动容器
1
2
3
4
5
6
docker run -d --name openvpn \
--cap-add=NET_ADMIN \
-v /opt/openvpn-data:/etc/openvpn \
-p 1194:1194/udp \
--restart unless-stopped \
kylemanna/openvpn
  1. 生成客户端证书
1
2
3
4
5
6
CLIENT="client"
docker run --rm -it -v /opt/openvpn-data:/etc/openvpn \
kylemanna/openvpn easyrsa build-client-full $CLIENT nopass

docker run --rm -v /opt/openvpn-data:/etc/openvpn \
kylemanna/openvpn ovpn_getclient $CLIENT > ${CLIENT}.ovpn
  1. Windows 客户端导入与连接

将生成的.ovpn文件导入到Windows的OpenVPN客户端中,然后连接即可。

八、测试网络切换

完成上述配置后,您可以测试网络切换功能:

  1. 拔掉有线网络,确认PVE会自动切换到无线网络
  2. 通过OpenVPN连接到PVE,尝试访问内部虚拟机

总结

通过以上配置,实现了:

  1. PVE 8.2使用双网卡(有线+无线)自动切换功能
  2. 通过双路由表和策略路由确保网络的连续性
  3. 内部虚拟机通过NAT访问外部网络
  4. 通过OpenVPN从外部网络安全访问内部虚拟机