简单的答案

简单的答案

我想通过我的自定义路由器使用局域网唤醒。下图是我的网络图像。我可以使用谷歌云平台和VPN(softether)从智能手机连接到raspi3,并从raspi3连接到台式电脑当台式电脑打开时

但是,当台式 PC 关闭时,eth1不会分配 IP 地址。所以我无法使用局域网唤醒(无法使用Python将魔术包发送到台式电脑)。这是ifconfig输出;

sudo ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.20  netmask 255.255.254.0  broadcast 172.16.1.255
        inet6 fe80::51dd:e5ef:c061:adb9  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:df:31:9c  txqueuelen 1000  (Ethernet)
        RX packets 158  bytes 26655 (26.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 168  bytes 42199 (41.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 04:ab:18:3b:af:e2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4  bytes 240 (240.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 240 (240.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vpn_vpn_nic: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.20  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::ebcc:65ba:a7f4:a21e  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::5cab:14ff:fe17:ae3a  prefixlen 64  scopeid 0x20<link>
        ether 5e:ab:14:17:ae:3a  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 122 (122.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 34  bytes 5198 (5.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:8a:64:c9  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1问题1:当设备连接eth1关闭时,如何分配IP地址?

问题2:我应该创建虚拟桥来实现这一点吗?

网络图像 UPDATE1:我尝试了菲利普的回答,比如

sudo arp -s 192.168.1.19 **:**:**:**:**:**

然而,输出是

SIOCADDRT: Network is unreachable

没有建立网络导致这个?我应该创建 192.168.1.0 吗?

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

我添加后

ip route add 192.168.1.0/24 dev eth1

/etc/dhcpcd.exit-hook,我可以通过sudo arp -s 192.168.1.19 **:**:**:**:**:**。但电脑现在还在睡觉......:(

答案1

简单的答案

我认为你处理这个问题的方式是错误的。实现此目的的简单方法是您不需要为其分配 IP 地址。将 WOL 数据包发送到您的 LAN广播地址。这几乎总是子网中的最后一个地址。因此,如果您的 LAN 使用192.168.1.x子网掩码,255.255.255.0则广播地址将为192.168.1.255

这将被发送到 LAN 上的所有计算机(至少同一子网上的所有计算机)。这没关系!沃尔”魔法包" 必须包含您要唤醒的计算机的 MAC 地址。因此网络上的所有其他计算机都会收到该数据包并忽略它。


复杂的答案

在以太网 LAN 上,数据包是总是发送到硬件 (MAC) 地址而不是 IP 地址。当机器A192.168.1.2尝试向机器B发送消息时192.168.1.3时,它使用ARP查找关联的 mac 地址192.168.1.3,然后将消息发送到该 mac 地址。

通常 ARP 的工作方式是 A 广播“谁是192.168.1.3”,而机器 B 响应“是我”。但是当机器 B 关闭时,机器 B 无法响应,甚至不知道自己的 IP 地址。因此,当机器 B 关闭时,ARP 无法工作。

幸运的是,Linux 允许您静态设置与 IP 地址关联的 MAC 地址并绕过 ARP。在您的情况下,您可以在 r-pi 自定义路由器上执行此操作:

sudo arp -s <ip address> <PC's mac address>

例如:

sudo arp -s 192.168.1.3 00:0a:29:10:24:af

现在,您的路由器(并且只有您的路由器)知道如何192.168.1.3在不打开的情况下进行通信。只要该计算机上已设置 WOL 并且已正确插入,您就可以将 WOL 数据包寻址到 PC 的 IP 地址。

为此,您需要确保它192.168.1.3永远不会被另一台机器使用。确保您的 PC 始终具有此 IP 地址很有帮助,否则事情会变得非常混乱。


问题1:当连接eth1的设备关闭时,如何为eth1分配IP地址?

sudo arp -s <ip address> <mac address>在想要与之对话的机器上使用。

问题2:我应该创建虚拟桥来实现这一点吗?

相关内容