我想通过我的自定义路由器使用局域网唤醒。下图是我的网络图像。我可以使用谷歌云平台和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:我应该创建虚拟桥来实现这一点吗?
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:我应该创建虚拟桥来实现这一点吗?
不