在 Proxmox VE (PVE) 环境中配置网卡冗余,实现有线网卡和无线网卡的混合使用。通过 Linux Bonding 技术,可以在保持单一 IP 地址的情况下,实现网络连接的自动切换和冗余备份。
应用场景
在我的使用环境中,由于物理限制(显示器和网线接口位于不同位置),需要在连接显示器时临时断开网线。通过配置网卡冗余,可以:
- 实现有线网卡和无线网卡的无缝切换
- 保持 WebUI/SSH 访问的 IP 地址不变
- 提供网络连接的冗余保障
网络结构
bash
+----------------------------+
| PVE 主机 |
| (WebUI / SSH / VM) |
+-------------+--------------+
|
+----------+-----------+
| vmbr0 (桥接接口) | <-- 主机 IP: 192.168.1.10
+----------+-----------+ 网关: 192.168.1.1
|
+----------+-----------+
| bond0 (网卡绑定) | <-- 模式: active-backup
+----------+-----------+
/ \
/ \
+--------+ +---------+
| |
[ eno1 ] [ wlxe84e0679ad17 ]
(主有线网卡) (备用无线网卡)
active backup
网络层级关系:
scss
vmbr0 (192.168.1.10)
└─ bond0 (active-backup)
├─ eno1 (有线网卡,主用)
└─ wlxe84e0679ad17 (无线网卡,备用)
前期准备
安装必要工具
bash
apt update
apt install wpasupplicant iw -y
说明:
wpasupplicant
:用于处理 Wi-Fi 网络的 WPA/WPA2 安全认证iw
:用于配置无线网卡接口的现代化工具,替代了旧版的iwconfig
注意:请确保在安装工具前系统能够连接网络,离线安装这些包会比较复杂。
识别网卡设备
使用以下命令查看系统中的网络接口:
bash
ip link
输出示例:
bash
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP mode DEFAULT group default qlen 1000
link/ether b4:xx:99:60:xx:d2 brd ff:ff:ff:ff:ff:ff
altname enp0s31f6
3: wlxe84e0679ad17: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether e8:xx:06:79:xx:17 brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether b4:xx:99:60:xx:d2 brd ff:ff:ff:ff:ff:ff
网络接口说明:
lo
:本地回环接口eno1
:内置有线网卡wlxe84e0679ad17
:USB 无线网卡vmbr0
:PVE 默认的桥接网络接口
配置网络接口
修改网络配置文件
编辑网络配置文件:
bash
nano /etc/network/interfaces
配置内容:
bash
# 回环接口
auto lo
iface lo inet loopback
# 有线网卡配置
auto eno1
iface eno1 inet manual
# 无线网卡配置
auto wlxe84e0679ad17
iface wlxe84e0679ad17 inet manual
# 配置网卡绑定
auto bond0
iface bond0 inet manual
bond-slaves eno1 wlxe84e0679ad17
bond-mode active-backup
bond-primary eno1
bond-miimon 100
bond-downdelay 200
bond-updelay 200
# 配置桥接接口
auto vmbr0
iface vmbr0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
bridge-ports bond0
bridge-stp off
bridge-fd 0
source /etc/network/interfaces.d/*
配置参数说明:
-
网卡绑定(bond0)配置:
bond-slaves
:指定要绑定的物理网卡bond-mode active-backup
:使用主备模式,同一时间只有一个网卡工作bond-primary
:指定主用网卡bond-miimon
:链路监控间隔(毫秒)bond-downdelay
:确认链路故障的延迟时间(毫秒)bond-updelay
:确认链路恢复的延迟时间(毫秒)
-
桥接接口(vmbr0)配置:
bridge-ports
:指定要桥接的接口bridge-stp
:禁用生成树协议bridge-fd
:设置转发延迟
应用网络配置:
bash
ifreload -a
# 或者
systemctl restart networking
验证配置:
bash
# 检查网络接口状态
ip a
# 检查路由表
ip r
# 检查网卡绑定状态
cat /proc/net/bonding/bond0
配置WIFI网卡连接到网络
配置无线网络连接
创建 wpa_supplicant 配置文件:
bash
nano /etc/wpa_supplicant/wpa_supplicant-wlxe84e0679ad17.conf
注意:配置文件命名格式为
wpa_supplicant-<网卡名称>.conf
,这是 systemd 服务查找配置文件的标准格式。
配置文件内容:
bash
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN
network={
ssid="您的Wi-Fi名称"
psk="您的Wi-Fi密码"
key_mgmt=WPA-PSK
disabled=0
scan_ssid=1
priority=1
}
配置参数说明:
-
基础配置
ctrl_interface
:指定控制接口目录和访问权限update_config
:允许动态更新配置country
:指定国家/地区代码,影响频段和功率限制
-
网络配置
ssid
:Wi-Fi 网络名称psk
:Wi-Fi 密码key_mgmt
:认证方式(WPA-PSK)disabled
:是否禁用该配置(0表示启用)scan_ssid
:启用对隐藏网络的扫描priority
:连接优先级,数值越大优先级越高
启用无线网络服务
创建并启用 wpa_supplicant 服务:
bash
# 创建服务链接
sudo ln -s /lib/systemd/system/[email protected] /etc/systemd/system/[email protected]
# 设置开机启动
sudo systemctl enable wpa_supplicant@wlxe84e0679ad17
# 启动服务
sudo systemctl start wpa_supplicant@wlxe84e0679ad17
验证服务状态:
bash
sudo systemctl status wpa_supplicant@wlxe84e0679ad17
检查无线连接状态:
bash
iw dev wlxe84e0679ad17 link
经常掉线的问题
在配置完 bonding 后,访问 PVE 的 webui 和 ssh 隔一段时间都会出现网络错误和卡掉的情况。
禁用wifi 网卡后就没事了:
bash
ip link set wlxe84e0679ad17 down
查询日志:
bash
journalctl -u wpa_supplicant@wlxe84e0679ad17 -n 100
bash
Apr 21 22:29:44 pve wpa_supplicant[738]: wlxe84e0679ad17: WPA: Key negotiation completed with dc:xx:93:b7:xx:9e [PTK=CCMP GTK=CCMP]
Apr 21 22:29:44 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-CONNECTED - Connection to dc:xx:93:b7:xx:9e completed [id=0 id_str=]
Apr 21 22:29:44 pve wpa_supplicant[738]: wlxe84e0679ad17: TRANSITION-DISABLE 01
Apr 21 22:30:44 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-DISCONNECTED bssid=dc:xx:93:b7:xx:9e reason=4 locally_generated=1
Apr 21 22:30:44 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
Apr 21 22:30:44 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=CN
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: SME: Trying to authenticate with dc:xx:93:b7:xx:9e (SSID='ci0n' freq=2447 MHz)
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: Trying to associate with dc:xx:93:b7:xx:9e (SSID='ci0n' freq=2447 MHz)
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: Associated with dc:xx:93:b7:xx:9e
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=COUNTRY_IE type=COUNTRY alpha2=CN
Apr 21 22:30:45 pve wpa_supplicant[738]: RRM: Ignoring radio measurement request: Not associated
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: WPA: Key negotiation completed with dc:xx:93:b7:xx:9e [PTK=CCMP GTK=CCMP]
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-CONNECTED - Connection to dc:xx:93:b7:xx:9e completed [id=0 id_str=]
Apr 21 22:30:45 pve wpa_supplicant[738]: wlxe84e0679ad17: TRANSITION-DISABLE 01
Apr 21 22:30:56 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-DISCONNECTED bssid=dc:xx:93:b7:xx:9e reason=4 locally_generated=1
Apr 21 22:30:56 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
Apr 21 22:30:56 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=CN
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: SME: Trying to authenticate with dc:xx:93:b7:xx:9e (SSID='ci0n' freq=2447 MHz)
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: Trying to associate with dc:xx:93:b7:xx:9e (SSID='ci0n' freq=2447 MHz)
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: Associated with dc:xx:93:b7:xx:9e
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=COUNTRY_IE type=COUNTRY alpha2=CN
Apr 21 22:30:57 pve wpa_supplicant[738]: RRM: Ignoring radio measurement request: Not associated
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: WPA: Key negotiation completed with dc:xx:93:b7:xx:9e [PTK=CCMP GTK=CCMP]
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-CONNECTED - Connection to dc:xx:93:b7:xx:9e completed [id=0 id_str=]
Apr 21 22:30:57 pve wpa_supplicant[738]: wlxe84e0679ad17: TRANSITION-DISABLE 01
Apr 21 22:31:08 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-DISCONNECTED bssid=dc:xx:93:b7:xx:9e reason=4 locally_generated=1
Apr 21 22:31:08 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD
Apr 21 22:31:08 pve wpa_supplicant[738]: wlxe84e0679ad17: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=CN
Apr 21 22:31:15 pve wpa_supplicant[738]: wlxe84e0679ad17: SME: Trying to authenticate with dc:xx:93:b7:xx:9e (SSID='ci0n' freq=2447 MHz)
Apr 21 22:31:15 pve wpa_supplicant[738]: wlxe84e0679ad17: Trying to associate with dc:xx:93:b7:xx:9e (SSID='ci0n' freq=2447 MHz)
日志很明确了:Wi-Fi 接口 wlxe84e0679ad17 在频繁断线重连,每隔 10~60 秒就掉线,这正是导致 WebUI 报错 / SSH 卡顿的根源。
在 PVE webui 的系统日志中也可以看到这个网卡在刷屏
查看这个网卡的驱动:
bash
ethtool -i wlxe84e0679ad17
bash
driver: rtl8192cu
version: 6.8.12-9-pve
firmware-version: N/A
expansion-rom-version:
bus-info: 1-4:1.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
这个网卡有三个驱动,以下是比较:
特性 | rtl8192cu | rtl8xxxu | rtl8188eus (Aircrack-ng) |
---|---|---|---|
来源 | Realtek 官方(也有社区版) | Linux 内核主线 | Aircrack-ng 社区维护 |
支持芯片 | RTL8192CU、RTL8188CU 等 | RTL8188CU、RTL8192CU、RTL8723BU 等 | RTL8188EU、RTL8188EUS 等 |
内核支持 | 不包含,需手动安装 | 已集成内核,开箱即用 | 不包含,需自行编译 |
Monitor Mode 支持 | 否(或需打补丁) | 否 | 是(默认支持) |
Packet Injection 支持 | 否(或需打补丁) | 否 | 是(默认支持) |
驱动稳定性 | 一般,需自行调试 | 高,适合普通用途 | 中,适用于特定任务 |
安装难度 | 中,需要编译或 DKMS | 低,系统自动加载 | 高,需要手动编译安装 |
社区活跃度 | 低(已停止维护) | 高(Linux 内核维护) | 中等(活跃在安全圈) |
典型用途 | 普通无线联网 | 普通无线联网(推荐) | Wi-Fi 安全测试(抓包、破解) |
兼容性问题 | 常见,需手动禁用其他驱动 | 少见,推荐优先使用 | 可能与内核冲突,需 blacklist 其他驱动 |
如表格所示,我们应该切换到 rtl8xxxu 驱动。
bash
# 禁用当前驱动
echo "blacklist rtl8192cu" | tee /etc/modprobe.d/blacklist-rtl8192cu.conf
# 卸载旧驱动
modprobe -r rtl8192cu
# 加载新驱动
modprobe rtl8xxxu
# 重启系统使更改生效
reboot
附录:网卡管理
添加新网卡
还有一张玩黑苹果剩下的 BCM94360,天线不见了,改天要替换掉现在的 usb 网卡。
如需添加新的无线网卡(例如 wlan2),按以下步骤操作:
- 修改网络配置:
bash
nano /etc/network/interfaces
diff
+ auto wl2
+ iface wl2 inet manual
auto bond0
iface bond0 inet manual
+ bond-slaves eno1 wlxe84e0679ad17 wlan2
- bond-slaves eno1 wlxe84e0679ad17
- 配置无线连接:
bash
# 创建 wpa_supplicant 配置
nano /etc/wpa_supplicant/wpa_supplicant-wlan2.conf
# 启用服务
systemctl enable wpa_supplicant@wlan2
systemctl start wpa_supplicant@wlan2
- 应用更改:
bash
ifreload -a
- 检查连接状态
bash
iw dev wlan2 link
移除网卡
如需移除网卡(例如 wlxe84e0679ad17),步骤如下:
- 修改网络配置:
bash
nano /etc/network/interfaces
diff
- auto wlxe84e0679ad17
- iface wlxe84e0679ad17 inet manual
auto bond0
iface bond0 inet manual
+ bond-slaves eno1 wlan2
- bond-slaves eno1 wlxe84e0679ad17 wlan2
- 停用服务:
bash
systemctl stop wpa_supplicant@wlxe84e0679ad17
systemctl disable wpa_supplicant@wlxe84e0679ad17
- 清理配置文件(可选):
bash
rm /etc/wpa_supplicant/wpa_supplicant-wlxe84e0679ad17.conf
- 应用更改:
bash
ifreload -a