ネットワーク機器の実験手引きを作るため,実際にスイッチングハブを使ってポートがMACアドレスを記憶しているかどうかの実験を行っていたらいろいろな奇妙な現象に遭遇しハマってしまった。
実験1
- パソコンAとBをスイッチングハブを介して接続
- AからBへpingを送る
- BのLANケーブルをスイッチングハブの別にポートに付け替える
- AからBへpingを送る
この実験の結果,AからBへpingが送れなかった。ポートがBのMACアドレスを覚えておいたのかと思いきや,別のパソコンCとDの組み合わせで同じことを行うと,LANケーブルの接続ポートを変えても問題なくpingは通った。いったいこれはどうしたことか?
NLA (Networl Location Awareness)
Windowsには
NLAなるものがあり,ネットワークの構成に変更を検知すると,その情報がファイアウォールに通知され,最適なプロファイルが動的に選択される。
ファイアウォールのプロファイル
ファイアウォールのプロファイルにはドメイン,プライベート,パブリックの3つあり,この順で厳しくなる。 今回の現象は,pingの受信をプライベートとパブリックで設定が違っていたことに起因する。具体的には,パブリックプロファイルがアクティブなとき,受信の規則でパブリックのecho要求が「いいえ」に設定されていたらpingは通らない(逆に,プライベートプロファイルがアクティブなとき,受信の規則でプライベートのecho要求が「いいえ」だとpingは通らない)。今回は,まさにこの現象が起きていた。
アクティブなプロファイルが変わる現象
ただ,奇妙なことにアクティブなネットワークのプロファイルが何かのタイミングで変わるという現象が起きた。調べてみると,どのプロファイルが採用されるかはネットワークの状態(Default Gatewayの有無など)によって
判断されているようである。確かに,スイッチングハブが学内LANに接続していた場合(つまりDefault Gatewayが存在する状態)では「実験1」の4でpingが通らなかった現象は,1分ほど待てば解消された。これはプロファイルが変更されそれに伴い受信の規則でpingが通るようになったものと思われる。
パブリックかプライベートか誰が決める?
そもそもネットワークがパブリックかプライベートかどこで決まるのか? どうもインストール後ネットワークの場所を選択する画面で「ホーム」「社内」(以上プライベート),「パブリック」「ドメイン」を選んだ時に
決まるようだ。
プライベートとパブリックを切り替える方法もあるようだが,よくわからない状態でいろいろ触ると後で困ることになるかもしれないのでやっていない。
実験室のPC
さて,実験室のPCだが,ほとんどは受信の規則にパブリックのecho要求はなかった。ドメインとプライベートのみで,プライベートにチェックが入っていた。これが正しい状態だと考えられる。では,なぜパブリックになってしまったPCがあるのか(該当PC:PCD120, 121, 122, 123, 124, 127, PCE137)?これらのPCは,いずれも実験や卒研に使ったものでVMwareあるいはSoftEtherなどネットワーク関連のソフトがインストールされている。そのあたりに何か関係があるのだろうか。
さて,今回の現象がスイッチングハブのポートがMACアドレスを記憶することと何か関係があるのだろうか。おそらく関係ないと思われる。「実験1」の4でpingが通らなかったのは上述したようにファイアウォールの動的プロファイルの選択と受信の規則の齟齬に起因するものであって,スイッチングハブのポートにMACアドレスが記憶されなかったというわけではないだろう。
実際,LANケーブルをスイッチングハブから抜いて再び挿すと,様々なパケットが流れていた。おそらく自分の存在をネットワークの他のPCに伝えているのだろう。その過程で結果的にスイッチングハブのポートにMACアドレスが記憶されるのだろう。
以上から,今回のほぼ丸一日かけて取り組んだ現象は実験に使えそうにない。スイッチングハブのポートがMACアドレスを記憶するかどうかを確かめる手段がないということだ。
発想の転換
では,この「お知らせパケット」を逆手にとって,LANケーブルの抜き差しによってパケットが流れ,それによってスイッチングハブのMACアドレステーブルが更新されるというシナリオで実験させてみてはどうか?
- まず,「実験1」を行い,なぜそのような結果(pingが通る)が出たかを考察させる(スイッチングハブがMACアドレスを学習するならこのようなことは起きないはず)。
- 次に,パソコンAでパケットキャプチャを行いながらパソコンBのLANケーブルの抜き差しを行う。このとき大量のパケットが流れるとわかりにくいのでフィルタでBのIPアドレスを含むパケットのみキャプチャする。
この実験で,2でBからパケットが確認できれば,Bはスイッチングハブのポートを通過したことになり,そのタイミングでBのMACアドレスをMACテーブルに記憶したことになる。
追加実験をしてわかったこと
- 関係のないトラフィックを押さえるため,実験ではIPv6のチェックを外す。
- スイッチ間をストレートケーブルで接続してもちゃんと動く。
- よって実験では学内LANとの接続はやめ(トラフィックが多いので),スイッチ間をケーブルで接続する(長めのケーブルが6~7本必要)。
- 先にも書いたように,ネットワークの場所がプライベートになっているPC(PCD120, 121など)もあればパブリックになっているPC(PCD122, 123)もある。
- 前者は,学内LANに接続した状態でLANケーブルをスイッチングハブから抜き差しするとプライベートになる(きっとDefault GatewayのARPが解決したのだろう)。
- 一方,学内LANに接続していない状態でLANケーブルをスイッチングハブから抜き差しするとパブリックになる。
- これらのことから,Default Gatewayがなければパブリック,あればプライベートと認識しているようだ。
- したがって,pingを通すには,受信の規則でパブリックとプライベートの両方ともecho要求を「はい」にする。
- ただし,後者(PCD122, 123)は同じ操作をしてもプライベートにはならない。
- インストール時にパブリックを選択してしまったのかもしれない(ほかの原因かもしれない)。
- これらのPCはpingを通すには受信の規則でパブリックのecho要求を「はい」にする。
- 1台のPCのLANケーブルを抜き差ししたときのパケットをキャプチャすると大量のTCPパケットが流れていた。
- プロトコルの種類はIGMPv3, LLMNR, NBNSなど。
- IGMPv3は,マルチキャストグループに参加し,メンバになるためのもの
- LLMNRは,名前解決を要求するパケットをリンクローカル・マルチキャスト・アドレスあてに送信するというもの
- NBNSは,NetBIOSネームサービスで使われるプロトコル
- 要するに,LANケーブルを抜き差しすれば大量のパケットがPCからスイッチングハブに出ていっている。
- これで,MACアドレスが学習されるメカニズムが推察できる。
 |
| LANケーブルを抜き差ししたときのパケット |