我一直在尝试为我的虚拟机管理程序设置一个环境,它只是一个运行 qemu 的 Debian Bookworm。
当终端太干燥时,我一直使用 Web 界面 Cockpit 来帮助我查看内容。但这样做时,我不得不从使用切换systemd-nerworkd
到NetworkManager
.
最近,我学习了如何创建桥接网络,以便我的虚拟机和主机可以相互通信。但这样做之后,我的唤醒网络停止工作了。我知道这是预期的,因为路由器现在“看到”网桥的 MAC 地址,而不是来自网卡的 MAC 地址。
据我了解,wakeonlan 工作在网络模型的 MAC 级别。我尝试arping
从网络中的其他客户端使用,但他们无法“看到”我的虚拟机管理程序(网桥)的 MAC 地址。
现在我开始认为,与wakeonlan同时拥有一座桥可能是不可能的。这可能吗?如果是这样,我该怎么办?最好使用NetworkManager
.
答案1
LAN 唤醒是一项硬件功能:它并非旨在到达参与路由的主接口:桥接器,而是始终到达物理接口:设置为桥接端口的实际 NIC 接口。 Wake-On-LAN 的常用方法是使用 Magic Packet(1995 年原始 AMD 白皮书:PDF),而不是其他方法(例如单播、广播或 ARP),以避免虚假的不需要的唤醒。
ethtool
通常,可以使用(例如: on eth0
)通过以下方式启用 LAN 唤醒:
ethtool --change eth0 wol g
给予:
# ethtool eth0 | grep -i wake
Supports Wake-on: pumbg
Wake-on: g
但实际上,如果没有另外告知,NetworkManager 可能会在挂起之前或之后再次禁用其管理的接口上的 LAN 唤醒,从而导致第一次或第二次(以及重新启动后)失败。所以这还不够。必须告知 NetworkManager 在此接口上使用 LAN 唤醒。
nmcli
如果 GUI 可用,则可以使用 GUI 小程序来完成以下命令。
例如,如果 NetworkManager 具有以下连接名称:Bridge connection 1
且作为从属接口Ethernet connection 1
,则必须在 上激活该功能Ethernet connection 1
。
# nmcli connection show id 'Ethernet connection 1' | grep -i wake
802-3-ethernet.wake-on-lan: default
802-3-ethernet.wake-on-lan-password: --
这记录在nm-settings-nmcli(5)
:
802-3-ethernet.wake-on-lan
要启用的 NMSettingWiredWakeOnLan 选项。并非所有设备都支持所有选项。可以是“phy”(0x2)、“单播”(0x4)、“多播”(0x8)、“广播”(0x10)、“arp”(0x20)的任意组合,“魔法”(0x40)或特殊值“默认”(0x1)(使用全局设置)和“忽略”(0x8000)(在 NetworkManager 中禁用 LAN 唤醒管理)。
虽然其他地方可能有默认值,但将其明确设置为magic
将确保 LAN 唤醒在此接口上保持启用状态。
将其设置为魔法,如下所示:
nmcli connection modify 'Ethernet connection 1' 802-3-ethernet.wake-on-lan magic
由于 NetworkManager 可能不会立即应用此设置(甚至包括之后nmcli connection reload
),因此还应该手动设置,在配置此设置后仅一次,如上所述(根据需要更改接口名称):
ethtool --change eth0 wol g
现在关于用法。网桥的以太网 MAC 地址没有理由与 NIC 的以太网 MAC 地址相同。这甚至明确不是默认的现代 systemd 系统(尽管 NetworkManager 本身可能会选择将其复制到网桥)。因此,即使 ARP 仍在同一 LAN 中的系统缓存中,它也永远不是让 Magic Packet 到达物理接口的正确方法。当挂起时,不能再依赖物理接口保持混杂模式(因为它是桥接端口)。无论如何,如果缓存条目被从系统缓存中逐出,这样的 ARP 也会失败。
如果使用 IP 作为有效负载机制,则始终使用将解析为 MAC 以太网广播目标 (FF:FF:FF:FF:FF:FF) 的目标,而不尝试 ARP 解析:LAN 广播 255.255.255.255 或定向广播(例如,在 LAN 192.168.1.0/24 中为 192.168.1.255)。
例如,如果网卡的 MAC 地址是 12:34:56:78:9a:bc,则使用wakeonlan
, 只需执行以下操作:来自同一局域网:
wakeonlan 12:34:56:78:9a:bc
或者如果系统可以访问多个 LAN,例如 192.0.2.0/24 和 192.168.1.0/24,并且要唤醒的系统位于后者:
wakeonlan -i 192.168.1.255 12:34:56:78:9a:bc
其他工具可能具有或缺乏其他功能。例如:etherwake
需要指定一个接口,并且不会使用 IP,而是使用以太网类型 0x0842,这是为 LAN 唤醒保留的事实上的类型(但不必使用),并且需要根或使用足够的能力:
etherwake -i eth0 12:34:56:78:9a:bc
这超出了问题的范围,但为了提供指导,通过互联网远程唤醒需要互联网网关的帮助:它必须运行自定义软件,或者对广播进行 NAT,并且启用路由定向广播这是出于安全原因始终默认禁用。如上所述,设置永久 ARP 地址通常对网桥没有帮助,但它可能是一个伪造的永久 ARP 地址用于唤醒系统,为此目的,通过在 LAN 中保留一个虚构的 IP 地址(未在任何地方使用,包括不存在于桥接口上)。