wakeonlanをインターネット越しにやってみた

/ Linux/Unix / Comment[0]
wakeonlanの仕組みは
foreach (split /:/, ハードウェアアドレス) {
$pkt .= chr(hex($_));
}
$pkt = chr(0xFF) x 6 . $pkt x 16;
このように生成されるマジックパケットをwakeonlan対応イーサネットデバイスが受信すると、電源がonになるというもの。
マジックパケットがイーサネットデバイスに流れれば良いわけだから、ルーター越しでも出来るはず。

というわけでポート開放

プロトコルはUDPで
 ポートは9番(Intel Atom D410オンボードで試してみたらどのポートでもおkらしい)
  アドレスは内部のブロードキャストアドレス

この間書いたスクリプトを使って
#!/usr/bin/perl
use Net::hostent;
use Socket;

($HWADDR, $BCADDR, $PORT) = @ARGV;
if(!$BCADDR){ $BCADDR = '255.255.255.255'; }
if(!$PORT){ $PORT = getservbyname('discard', 'udp'); }

$HWADDR_ = join(':', ('[0-9A-Fa-f]{1,2}') x 6);
if ($HWADDR =~ m/^$HWADDR_$/) {
$hwaddr = $HWADDR;
}

foreach (split /:/, $hwaddr) {
$pkt .= chr(hex($_));
}
$pkt = chr(0xFF) x 6 . $pkt x 16;

$raddr = gethostbyname($BCADDR)->addr;
$them = pack_sockaddr_in($PORT, $raddr);
$proto = getprotobyname('udp');

socket(S, AF_INET, SOCK_DGRAM, $proto) or die "socket : $!";
setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt : $!";

send(S, $pkt, 0, $them) or die "send : $!";
close S;

マジックパケットを送る
$ ./wake.pl 00:27:0e:**:**:** グローバルIP 9
内部から自分のグローバルIPに送ることは無理なんで、cpl氏に頼んで外から送ってもらいますた。

D410たんの電源を落っことして、別PCでtcpdumpを使ってマジックパケットのモニタリング
# tcpdump -nX udp and port 9
よっしゃきたー 電源も入ったー
というわけでグローバル越しでwakeonlanが出来たわけです(´・◡・`)
関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可