之前有介紹過如何在家透過 WOL 喚醒電腦,不過剛好有人在問,要是出門在外要怎麼喚醒電腦?當然也不是沒辦法,本文將介紹幾種方法來實作 Wake-On-Wan!

甚麼情況下會人在外面還需要打開家裡電腦?其實 Noob 覺得這種情況還蠻常發生的耶?舉幾個例子,比方說出門在外臨時需要用到某個檔案,這時就可以開機並透過遠端控制等方式取得;或是說某台電腦被拿來當作伺服器,卻意外被關機了,這時能夠從遠端喚醒就不用特定跑一趟。

在繼續從外面喚醒電腦之前,請先確定電腦可以透過網路喚醒,參考:WOL 實錄,透過 Android 手機遠端喚醒電腦

LAN:區域網路,Local Area Network

WAN:廣域網路,Wide Area Network

另外本文所討論的方法,皆必須先有固定 IP 才行。若沒有固定 IP,可詢問你的電信業者,或是申請 DDNS 來使用!

方法零,透過電話喚醒電腦

出門在外想要喚醒電腦?打通電話回家叫家裡的人打開不就得了?

好吧我知道這個方法可以淘汰了 (遭踹

方法一,透過 Port Forwarding 把 Magic-Packet 轉至廣播位址

一般來說,把 Magic Packet 傳給路由器,再交由路由器統一廣播至區域網路下的所有裝置,而目標裝置收到 Magic-Packet 後才會開機。但是今天人在外面,要怎麼把 Magic-Packet 傳進這個區域網路內呢?

這裡要用到 **Port Forwarding **的技術,它能夠把路由器在某個 port 上收到的封包,轉交給區域網路內某個 ip 的某個 port。舉例來說,我的外部 IP 可能是 122.148.150.12 之類的,而我的電腦的內部 ip 是 192.168.1.2,那我出門在外就把 Magic-Packet 丟到 122.148.150.12 的 port 9,它就會自動幫我家轉到區域網路內的 192.168.1.12 的 port 9。Port Forwarding 的基本精神就是這樣,要用來開伺服器也很好用 (?

如何取得自己的外部 IP?

試試這裡:ip.noob.tw

那就是透過 Port Forwarding 把 Magic-Packet 轉到路由器某個地方,讓它廣播就對了吧。不過要讓它廣播,需要傳到哪裡?一般來說,如果內部 ip 是 192.168.1.12 的話,廣播位址就會是 192.168.1.255,把最後一個數字改成 255 就行了。

不過也不一定啦,可以在命令提示字元裡輸入 ipconfig 指令,來查看自己的內部 ip 與廣播位址。

接下來就以 Buffalo 的路由器來示範如何設定 Port Forwarding。

首先進到路由器的設定位址,又是一個一般來說,如果你的內部 ip 是 192.168.1.12,那你的路由器應該是 192.168.1.1,把最後一個數字改成 1 就行了。包括登入帳號密碼等等,詳細請見說明書!

接著找到 Port Forwarding 的選項,如圖中把所有來自 Port 9 的封包都傳到我路由器上的廣播位址,也就是 192.168.16.255。

幸運的話設定到這裡就可以成功從外網喚醒電腦了,不過其實 Buffalo 的路由器會出現這樣的錯誤:「錯誤: LAN端IP位址。說明: 無法使用LAN端廣播位址。

真的是蠻可惜的,沒關係,我們還有下一招,試著用用看 VPN 吧!

方法二,設定 VPN,讓身在外面的你也能加入區域網路

VPN:虛擬私人網路,Virtual Private Network。感覺上有一點在區域網路內弄一個虛擬 IP 給你,你就可以透過那個 IP 跟區域網路的其他裝置做交流,跨國拿貼圖和翻牆時超好用!詳細請見維基百科

如何設定 VPN,由於不同廠商的路由器不同設置,也有可能低階一點的路由器還不能設定 VPN,所以以下就不詳細介紹 VPN 設定方式了。

VPN 都設定好了,總該可以喚醒電腦了吧?(低頭划手機…)什麼!還是不行!

某些廠商基於安全性設定,可能無法讓用戶透過 VPN 來廣播訊息,至少目前我這台路由器是沒有辦法的,難道 VPN 就毫無用武之地了嗎?後來發現啊,其實 Buffalo 的路由器可以在「網路服務」裡以 WOL 方式喚醒區網內電腦,也許別家廠牌也能夠這麼做吧?

那要是沒辦法使用 VPN 的路由器怎麼辦?沒關係,我還有招!

方法三,以 PHP 傳送 Magic-Packet,從瀏覽器喚醒電腦

什麼,只是喚醒一台電腦,沒事幹嘛去寫個 PHP 來 WOL?

好啦我知道這有點奇怪,不過要是家裡有一台 Raspberry Pi、Parallella 等東西的話,裡面裝個 Apache Server,再開個剛剛說的 Port Forwarding,就能夠在外面透過瀏覽器喚醒電腦了對吧!其實 Noob 真的曾經寫了一個小系統,能夠管理區網內的裝置並喚醒,當然不只這個,還有關機、遠端 shell 的功能之類的…

好吧這也不是重點,重點是要怎麼以 PHP 喚醒電腦呢?有個 index.php 內容如下

$broadcast = $_GET['b'];
$mac = $_GET['m'];
 
$mac = str_replace("-", ":", $mac);
$mac_array = explode(':', $mac);
 
$hwaddr = '';
 
foreach($mac_array AS $octet){
	$hwaddr .= chr(hexdec($octet));
}
 
$packet = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
 
for ($i = 1; $i <= 16; $i++){
	$packet .= $hwaddr;
}
 
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($sock){
	@$options = socket_set_option($sock, 1, 6, true);
 
	if ($options >=0){   
		$e = socket_sendto($sock, $packet, strlen($packet), 0, $broadcast, 9);
		socket_close($sock);
	}    
}

接著我只要瀏覽 index.php?m=目標電腦 MAC 位址&b=路由器廣播位址就可以了,例如 index.php?m=00-12-34-56-78-AB&b=192.168.16.225 就可以了!

以上是這次提供的 Wake-On-Wan 方法,要是以上都不適合你的話,其實可以考慮打電話給家裡的人了 (?
要是有其他更好的方法可以 Wake-On-Wan 的話,歡迎提供唷!