通過我的自定義路由器喚醒區域網路
我想通過我的自定義路由器在區域網路上使用喚醒。下圖是我的網路圖像。我可以使用Google云平台和VPN(softether)從智能手機連接到raspi3,並在台式機打開時從raspi3連接到台式機。
但是,當台式電腦關閉時,
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 **:**:**:**:**:**
。但是PC現在還在睡覺…… :(
簡單的答案
我認為你的做法是錯誤的。實現這一點的簡單方法是您無需為其分配 IP 地址。將 WOL 數據包發送到您 LAN 的廣播地址。這幾乎總是子網中的最後一個地址。因此,如果您的 LAN
192.168.1.x
使用子網遮罩打開,255.255.255.0
則廣播地址將為192.168.1.255
.這將被發送到 LAN 上的所有機器(至少同一子網中的所有機器)。這沒關係!WOL“魔術包”必須包含您要喚醒的機器的 MAC 地址。因此,您網路上的所有其他機器都會收到數據包並忽略它。
複雜的答案
在乙太網 LAN 上,數據包總是發送到硬體 (MAC) 地址而不是 IP 地址。當機器 A
192.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 地址。所以ARP不能在機器B關閉的情況下工作。幸運的是,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:我應該創建虛擬橋來實現這一點嗎?
不