EdgeRouter から Wake on LAN パケットを送る

  • 0
    いいね
  • 0
    コメント

    結論だけ先に

    EdgeRouter には /usr/sbin/etherwake というコマンドが入っているのでそれ使ったら送れる\(^o^)/

    WoL パケットの NAT 越え

    外出先から自宅に VPN で繋いで、自宅ネットワーク内にあるサーバを Wake on LAN (WoL)1 で起動したい。

    VPN 接続した状態で普通に手元のマシンから WoL パケットを送れば起動するかと思ったら起動しない。VPN 接続した状態だと手元のマシンと自宅ネットワーク内のサーバとでネットワークアドレスが違うので、WoL パケットがルータを超えてサーバまで届くようにしないといけないらしい。

    なんとかする方法はふたつあって、

    • 外部から WoL パケットが飛んできたら LAN のブロードキャストアドレスに流すようにルータを設定する
    • 同じネットワークに所属している機器から WoL パケットを送る

    前者はあまりセキュアじゃなさそうなので、とりあえず後者ができるか考えてみる。

    ルータの種類によっては GUI から WoL パケットを送る機能があるらしい。2
    残念ながら我が家の EdgeRouter X の GUI にはそのような機能はついてなかったので他の方法を考える。

    EdgeRouter から WoL パケットを送る

    自宅ではルータの他にファイルサーバも動いているので、ファイルサーバに SSH ログインして WoL パケットを投げるのが一番簡単なのだけど、ファイルサーバにファイルサーバじゃない役割を担わせるのが申し訳なくて (?) まずはルータから WoL パケットが送れるかどうかを検討する。

    CentOS は wol, Ubuntu は wakeonlan というコマンドを入れれば WoL パケットを送れるらしいが、EdgeRouter の OS は Vyatta ベースなのでそのへんのコマンドは簡単には使えなさそうな雰囲気がある・・・。

    ていうかネットワーク系の OS なんだからどうせデフォで入ってるでしょ、と思って探していたら /usr/sbin/etherwake というそれっぽいのがあった。

    $ sudo etherwake -u
    usage: etherwake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55
    
        This program generates and transmits a Wake-On-LAN (WOL)
        "Magic Packet", used for restarting machines that have been
        soft-powered-down (ACPI D3-warm state).
        It currently generates the standard AMD Magic Packet format, with
        an optional password appended.
    
        The single required parameter is the Ethernet MAC (station) address
        of the machine to wake or a host ID with known NSS 'ethers' entry.
        The MAC address may be found with the 'arp' program while the target
        machine is awake.
    
        Options:
            -b  Send wake-up packet to the broadcast address.
            -D  Increase the debug level.
            -i ifname   Use interface IFNAME instead of the default 'eth0'.
            -p <pw>     Append the four or six byte password PW to the packet.
                        A password is only required for a few adapter types.
                        The password may be specified in ethernet hex format
                        or dotted decimal (Internet address)
            -p 00:22:44:66:88:aa
            -p 192.168.1.1
    

    (ヘルプ表示が --help じゃなくて -u なのわかりづらい)

    コレを使えばできそうな気がするが、単純に

    $ sudo etherwake <MACアドレス>
    

    とやってみても起動しない。
    デフォルトでは eth0 にパケットを飛ばすようになっているので、我が家の設定だと eth0 は WAN 側なので起動したいサーバまで届かない。

    $ sudo etherwake -i eth3 <MACアドレス>
    

    起動したいサーバは eth3 に直接繋がっていたので、こうすると見事起動した。

    最低限コレでもいいけど、NIC を直接指定するのなんか気持ち悪いのでもうちょっといいやり方にしたい。

    $ sudo etherwake -b -i switch0 <MACアドレス>
    

    我が家の設定だと switch0 が作られていた3ので、ここにブロードキャストすれば LAN 全体に送れるかな、と思ってやってみたらできた。

    これで外出先からでも自宅のサーバを起動できるようになった。

    めでたしめでたし。


    1. 特殊なパケットを送りつけることで遠隔で停止しているマシンを起動する技術 

    2. YAMAHA RTX シリーズとか NEC UNIVERGE IX シリーズとか 

    3. $ sudo ifconfig で確認できる