複数NICを持つホストのNode.jsでWakeOnLANする

Node.jsのWakeOnLANサンプルはよくあるが、複数NICを持つホストで実行した場合正しく動かない可能性がある。

RaspberryPi3にインストールしたUbuntuから、有線LAN側でWakeOnLANをしたかったが、サンプル通りでは正しく働かなかったのでメモ。

普通にやると

対象ホストには2つのNICがあり、デフォルトゲートウェイを持つ192.168.100.1/24のwlan0と、10.0.0.1/8のeth0。
10.0.0.100に相当するeth0側のリモートホストを起こしたい。

var wol = require('wake_on_lan');


function wakeUp() {
    var ipaddr = '10.0.0.100';
    var macaddr = '01:23:45:67:89:ab'; // Wakeする対象
    console.log(ipaddr + '[' + macaddr + ']' + 'を起動中...');

    wol.wake(macaddr, function(error) {
        if (error) {
            console.log('エラーが発生しました:' + error);
        }
        else {
            console.log('マジックパケットを' + macaddr + 'におくりました');
        }
    });
}

wakeUp();

実行しても、eth0側から何もパケットが送られている様子がない。
また当然、対象ホストは起動する気配もない。

NICを間接的に指定する

ここからは推測だが、おそらくOSがデフォルトルートをもつNICをプライマリとして扱っていることが原因だと思う。
調べてみると、wake_on_lanモジュールはIPアドレスも指定できる様子。
https://github.com/agnat/node_wake_on_lan

なので、IPアドレスを指定してこのNICから送り出すんだよ、と間接的に教えてやれば正しく動作した。

var wol = require('wake_on_lan');


function wakeUp() {
    var ipaddr = '10.0.0.100';
    var macaddr = '01:23:45:67:89:ab'; // Wakeする対象
    var opt = {
        address: ipaddr
    };

    console.log(ipaddr + '[' + macaddr + ']' + 'を起動中...');

    wol.wake(macaddr, opt, function(error) {
        if (error) {
            console.log('エラーが発生しました:' + error);
        }
        else {
            console.log('マジックパケットを' + macaddr + 'におくりました');
        }
    });
}

wakeUp();

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です