Linux

通過我的自定義路由器喚醒區域網路

  • May 17, 2020

我想通過我的自定義路由器在區域網路上使用喚醒。下圖是我的網路圖像。我可以使用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:我應該創建虛擬橋來實現這一點嗎?

網路形象 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 **:**:**:**:**:**。但是PC現在還在睡覺…… :(

簡單的答案

我認為你的做法是錯誤的。實現這一點的簡單方法是您無需為其分配 IP 地址。將 WOL 數據包發送到您 LAN 的廣播地址。這幾乎總是子網中的最後一個地址。因此,如果您的 LAN192.168.1.x使用子網遮罩打開,255.255.255.0則廣播地址將為192.168.1.255.

這將被發送到 LAN 上的所有機器(至少同一子網中的所有機器)。這沒關係!WOL“魔術包”必須包含您要喚醒的機器的 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 地址。所以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:我應該創建虛擬橋來實現這一點嗎?

引用自:https://unix.stackexchange.com/questions/587173