今回は手持ちのルーターCisco 892を使ってVLANの挙動を確かめてみた。
Vagrantで仮想マシンを4台起動させてUSB-LANアダプターへブリッジネットワークを作成し、ルーターと次のように接続している。
4台の仮想マシンをそれぞれのLANアダプターへブリッジさせる方法は以下の記事参照。
thom.hateblo.jp
ルーターは内部的にはスイッチング機能とルーター機能に分かれていて、スイッチング機能のほうは実質L2スイッチとなっている。各FastEthernetポートはデフォルトではVLAN 1が割り当てられており、たとえネットワークセグメントが違ったとしてもポートに接続された機器同士は通信ができてしまう。
ここで今回ややこしいのが、VMにネットワークの出口が2つあるということだ。
ひとつはeth0で、ホストPCへ繋がっている。
もう一つはeth1で、ルーターのスイッチポートへ繋がっている。
何がややこしいかというと、eth1と異なるネットワークへ通信しようとした場合、通常はeth0へ探しに行ってしまうということ。
なのでVM側で経路設定してやらないと、先ほど書いた「たとえネットワークセグメントが違ったとしてもポートに接続された機器同士は通信ができてしまう。」ということを検証できない。
VM側で経路設定するにはip routeコマンドを使用する。
例えばVM-A(10.1.10.2)とVM-B(10.1.10.3)で以下のコマンドを入力することで、10.1.20.0/24ネットワークへ向かう場合の出口はeth1だということを教えてやることができる。
sudo ip route add 10.1.20.0/24 via 0.0.0.0 dev eth1
VM-C(10.1.20.2)とVM-D(10.1.20.3)では反対に10.1.10.0/24への経路を設定する。
sudo ip route add 10.1.10.0/24 via 0.0.0.0 dev eth1
何とも面倒な話なので、以前はデフォルトゲートウェイをeth1側にすれば良いのではと思ってたんだけど、そうするとaptコマンドで特定のパッケージをインストールするのにネットに繋げたいというときに不便なので、これくらいの検証ならスタティックに経路設定するというところに落ち着いた。
さて、この設定が終わると、例えばVM-AからVM-Cへのpingが疎通するようになる。
IPアドレスのネットワークセグメントが違うのにどうして通信できるのか?
ルーターだからルーティングしてるのでは?と思うかもしれないけどルーティングはしてない。
答えは単純で、スイッチングはそもそもL2(データリンク層)の話なので、IPアドレスなんて最初から見てなくて、MACアドレスで通信してるから。
これを論理的にネットワーク分割する機能がVLAN。
以下のようにVLAN 10とVLAN 20に分けた場合、VM-AからVM-Cへのpingは通らなくなる。
ルーターやL3スイッチの場合はVLANの仮想インターフェースにIPアドレスを設定することでVLAN間がルーティングされ、再びVM-AからVM-Cへpingが疎通するようになる。
もともと1つだったものをVLANで分けて、またルーターで繋げるなんて、なんでそんなややこしいことをするのか?
私が理解したメリット以下の3つである。
- VLANで分割することによりブロードキャスト(全員宛通信)の範囲を絞ることができる。
- どのVLANの通信を優先的にインターネットと通信させるかなど、通信の優先度をコントロールできる。
- VLAN間をルーターで接続することで特定の相手との通信は可能になり、さらにどんな通信を通してどんな通信をブロックするのか細やかに制御できる。
ということで今回はVLANで分割したり、VLAN間をルーティングさせたりということを1台のルーターを使ってやってみた。
やはり書籍を読んだだけでは理解がおぼつかなかった部分も実機を触ってみるとスッキリと理解できるということを改めて実感した。