Wake on LAN マジックパケットを個々の端末だけに送信する手法

Pocket

WOL(Wake on LAN)マジックパケットは通常ブロードキャストとして送信されるとのことです。その理由は単純に簡単だからだと思います。

スポンサーリンク

注意:

なお、ここで紹介しているのは、個々の端末だけにマジックパケットを送る手法に関するものです。自端末宛以外のMACアドレスが設定されたマジックパケットを受信したからと言って、必ずしも起動するわけではありません。というよりも、起動しないでしょう。設定次第だと思いますが。。。

 

ブロードキャスト宛に送信

通常、マジックパケットはMACアドレスおよびIPアドレスともにブロードキャスト宛に送信されます。

MACアドレスブロードキャスト:FF-FF-FF-FF-FF-FF
IPアドレスブロードキャスト:255.255.255.255(または、192.168.1.255など)

マジックパケットの送信方法は2通り

WOLマジックパケットは、イーサヘッダのペイロードとして送る方法とUDPヘッダのペイロードとして送信する2通りの方法が規定されているようです。

イーサヘッダのペイロードとして送る方法は、ping送信とイメージは同じです。もう一つのUDPのペイロードとして送る方法は、特に説明は必要ないでしょう。

イーサヘッダにペイロードとして送信するのは、実際にプログラミングすると大変だと感じるかもしれません(わたしは感じます)。しかし、IPブロードキャスト宛へUDPでマジックパケットを送信するには非常に簡単です。

そのため、実際の送信手段として、UDPでブロードキャスト宛へ送信する方法が採用されることが多いのだと思います。

各端末だけにマジックパケットを送信するには

では、個々の各端末にマジックパケットを送信するプログラムを作成することを考えてみます。

前提条件としては、送信先端末のMACアドレスを知っている必要があります。これは、イーサヘッダのペイロードとして送る場合も、UDPヘッダのペイロードとして送る場合も同じです。

イーサヘッダのペイロードとして送る

イーサヘッダのペイロードとして送るには、イーサヘッダから組み立てる必要があります。libpcap/WinPcapなどのライブラリ(各言語用のラッパー経由で)を使ったりして送信することができるかもしれませんが、初心者にはやはりハードルは高いでしょう。

実際に試していないので、上記ライブラリで送信できる保証はありません。名前にキャプチャとか入ってるし。

UDPヘッダのペイロードとして送る

次に、UDPのペイロードとして送る方法を考えてみます。前述の通り、各端末のみに送るには、送信先のMACアドレスを知っている必要があります。また、送信先IPアドレスも事前に知っている必要もあります。

ここで、一般的なUDP送信プログラムを考えてみます。

送信先端末のIPアドレスが静的に設定されているものとして、そのIPアドレス宛(ブロードキャスト以外)に送信した場合、arpによってMACアドレスの取得が試みられますが、端末は起動していないため、arp応答は返ってきません。その結果、宛先MACアドレスが解決できずにマジックパケットを送信することができません。

おそらくWOLでは、宛先IPアドレスは何でもいいと思われます(想像です)。

このことから、一般的なUDP送信プログラムの場合、相手のMACアドレスを事前に知っていたとしても使う場面がないのです。最初から最後まで動かない将棋の「歩」のようなものです。

「歩」は、動かなくても十分すぎるほど存在価値はありますので、あしからず。🙇余計なこと書いて、ごめんなさい。でも、消さなーい。

arpテーブルに設定する

一般的なUDP送信プログラムでは、そもそもMACアドレスは気にしません。なので、気付かない人もいるとは思いますが、事前に知っているIPアドレスとMACアドレスをarpテーブルに追加します。

すると、arpによってMACアドレスを解決する必要がなくなりますので、通常のUDP送信プログラミングでも、マジックパケットをブロードキャスト宛ではなく、各端末のMACアドレス宛に送信することができるようになります。

arpテーブルに追加するには arpコマンド(Windows/Linux共)を使用します

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *