マルチプルVLANの落とし穴(SVLとIVL)
昨今の格安スイッチは、VLANを切れるものも多数あって、それらのものはマルチプルVLANという機能に対応していることが多いです。「総務部と営業部の間の通信は許可しないけど、それぞれがインターネットアクセスすることや、全社サーバーにアクセスすることは許可」といったシチュエーション等が説明に使われる奴ですね。このマルチプルVLANの詳しい話は他のサイトでいくらでも掲載されているので、そちらを参照頂くこととして、今回はこの機能を使った場合の落とし穴について紹介したいと思います。
ネットワーク構成
ちょっとポート数が少ないのでアレですが、手元で余っていたNetgearのGS105Ev2でマルチプルVLANを組んでみました。PC1とPC2間の通信は禁止し、それ以外の通信は許可する構成となります。Netgear GS105Ev2ではこの設定の方法は2通りあります。
ポートペースVLANを使った場合のマルチプルVLAN
メニューから「VLAN」→「ポートベース」→「拡張」を選択し、「拡張ポートベースVLANステータス」を有効にします。その後以下のように設定します。
表にすると以下の構成となります。
ポート | 所属VLAN | 機器 |
1 | 1,2 | ルーター |
2 | 1,2 | Server1 |
3 | 1,2 | Server2 |
4 | 1 | PC1 |
5 | 2 | PC2 |
これで、
・ルーター、Server1、Server2とPC1は同じVLAN1に所属しているので相互に通信可能
・ルーター、Server1、Server2とPC2は同じVLAN2に所属しているので相互に通信可能
・PC1とPC2は異なるVLANに所属しているので相互に通信不可能
となります。実際にPC1からPC2にpingを打っても通りません。逆もしかりです。このとき、Server1-PC1、Server2-PC2では同一スイッチに接続されているので、同時に通信してもきっちりwire speedが出ます。実際にiperf3を使って確かめました。
スループット(Mbps) | |
Server1-PC1 | 942 |
Server2-PC2 | 942 |
というわけでこの構成には全く問題がありません。
タグVLANを使った場合のマルチプルVLAN
この構成がマルチプルVLANというのかどうかのツッコミは置いておいて、PC1とPC2の相互通信だけを禁止するためには、タグVLAN(IEEE 802.1Q)を使った構成方法もあります。
メニューから「VLAN」→「802.1Q」→「拡張」を選択し、「拡張802.1Q VLANステータス」を有効にします。その後以下のように設定します。
ちょっとややこしいですが、表にすると以下となります。
ポート | PVID(入力) | VLANメンバー(出力対象) | 機器 |
1 | 1 | 1,2,3 | ルーター |
2 | 1 | 1,2,3 | Server1 |
3 | 1 | 1,2,3 | Server2 |
4 | 2 | 1,2 | PC1 |
5 | 3 | 1,3 | PC2 |
PVID(Port VLAN ID)というのは、そのポートから入力されたパケット(フレーム)が、スイッチ内でどのVLANとして処理されるのかを意味します(より正確にはタグなしパケットをどのVLANとして扱うか)。一方、ポートから出力されるパケット(フレーム)は、どのVLANのものを対象とするのかが、VLANメンバーの意味となります(Netgearでは各VLANにつき、タグなし(U)で出力するか、タグあり(T)で出力するか指定でき、またタグなし(U)を複数のVLANに対して指定可能)。
今回の設定の場合には、PC1からServer1に通信をするとき、PC1からのパケットは、PVID2として設定しているポート4から入力されますので、スイッチ側ではこれをVLAN2の通信として扱います。VLAN2が所属するポート1~3に通信相手がいれば、そのポートからパケットを出力します。
逆に、Server1からPC1に通信をするとき、Server1からのパケットは、PVID1として設定しているポート2から入力されますので、スイッチ側ではこれをVLAN1の通信として扱い、VLAN1が所属するポート1 or 3 or 4に通信相手がいれば、そのポートからパケットを出力します。このように、通信の行きと帰りで異なるVLANが使われますが、PC1とServer1は通信可能です。
一方、PC1からPC2に通信をするときは、PC1からの送信パケットはVLAN2として扱われますが、PC2はVLAN2に所属していないので、このパケットがPC2に届くことはありません。よって、PC1とPC2は相互に通信不可となります。
これでPC1とPC2は相互に通信不可であるが、他の通信は許可するという要件は満たせています。
ところが、この構成には罠があります。
先ほどと同様にServer1とPC1、Server2とPC2で同時に通信(iperf3)をしてみます。
スループット(Mbps) | |
Server1-PC1 | 478 |
Server2-PC2 | 473 |
あれれ?、wire speedが出てませんね。さらに別の実験。Server1からPC1にpingを打って、PC2が所属するポート5から入出力されるパケットをWiresharkで覗いてみます。
なんということでしょう。PC2には自分に関係のないServer1→PC1の通信が届いてしまっています(PC1→Server1の通信は届いていない)。
この構成だと、当初のPC1とPC2の相互通信は不可だが、それ以外は通信可とする要件は満たしていますが、以下の問題があります。
・L2スイッチ上の通信でwire speedが出ない
・自分と関係のない通信が届いてしまっておりセキュリティ的に問題がある
何故このようなことが起きてしまうのでしょうか?
スイッチのMACアドレスラーニング(学習)
コンピューター間の通信はMACアドレスを使って行っており、昨今のスイッチは通信を効率化するために、どのポートにどのようなMACアドレスを持つ機器がつながっているか学習し記憶しています。
ちなみに、昔使われていたリピータハブ(通称、馬鹿ハブ)だと、このような学習を行わなかったので、あるポートから入力されたパケット(フレーム)は、とりあえず残りの全ポートから出力するという極めて非効率な通信方式でした。なので、つながっている機器が多いとコリジョン(データの衝突)が発生し、通信速度(スループット)が低下する問題が起きていました。
VLANを扱う場合、一般的なスイッチは、ポートとVLANの組み合わせ毎にMACアドレスを記憶しています。この仕組みをIVL(Independent VLAN learning)と呼びます。先の例だと、以下のようなテーブルがスイッチで作成されています。
ポート | VLAN | MACアドレス |
1 | 1 | ルーターのMACアドレス |
2 | 1 | Server1のMACアドレス |
3 | 1 | Server2のMACアドレス |
4 | 2 | PC1のMACアドレス |
5 | 3 | PC2のMACアドレス |
このテーブルに従って、例えばServer1→PC1のパケット(フレーム)が処理されるわけですが、Server1からのパケットはポート2から入るので、ポート2のPVIDが1であることから、VLAN1として判断されます。この時、PC1のMACアドレスがどのポートに所属するか、スイッチは上のテーブルから判定しますが、VLAN1のパケットなので、VLAN1のデータしか見ません。
VLAN1のデータに、PC1のMACアドレスは登録されていませんので、スイッチは仕方なくVLAN1が紐づくポート1,3,4,5全てからこのパケットを出力します(これをフラッディング=洪水・氾濫と言います)。これが先ほどPC2にもServer1→PC1のパケットが届いていた理由となります。
MACアドレスの学習は、パケットがスイッチに入ってきたとき、送信元のMACアドレスがテーブルに登録されていなければ、そのポートとVLANと紐づけて記憶することになります。よって、PC1→Server1の戻りの通信が起きた時、PC1のMACアドレスが記憶されるから、次からは非効率なことが起きないんじゃないかという気もしますが、PC1→Server1の通信時は、ポート4から入力され、そのPVIDは2であるため、PC1のMACアドレスはポート4・VLAN2として記憶されるだけです。ポート4・VLAN1としては永遠に記憶されません。なおこの戻りの通信時にも、Server1のMACアドレスはVLAN2テーブルには記憶されていませんので、スイッチはVLAN2に紐づくポート1,2,3全てからパケットを出力します(フラッディング)。
このようにマルチプルVLAN的なことをタグVLANで構成し、スイッチのラーニングの仕組みがIVLの場合、意味のないラーニングが行われ、スループットの非効率やセキュリティ上の問題が発生します。
一方、SVL(Shared VLAN learning)と呼ばれるMACアドレスの学習方法もあって、こちらの場合には、VLANは無視して、ポート毎に配下のMACアドレスを記憶していきます。マルチプルVLANの場合、SVLであればスループットの非効率やセキュリティ上の問題が発生しません。
Netgear GS105Eの場合、GS105E製品FAQに以下の記載があります。
VLAN方式 | MACアドレスラーニング |
ポートベースVLAN | SVL |
タグベースVLAN | IVL |
製品毎のSVL・IVLの採用方式の違い
ややこしいことに、仕様の記載がない商品が多いですが、タグVLANの場合には基本IVLだと思います。
Buffalo
Buffaloはこのあたりキチンと仕様を開示しています(MACアドレスの学習方式(VLAN学習方式)はIVLとSVLのどちらですか)。この一覧を見ると、昔はIVL採用のものと、SVL採用の商品が混在していましたが、最近はSVLに統一したみたいです。現場でIVLに起因するトラブル等があって採用をやめたのでしょうか?
TP-Link TS-SG108E
How to configure 802.1Q VLANにタグVLANを使った場合の、「GroupAとGroupBの通信は許可しないが、他の通信は許可する」例の説明があり、実際に試してみたところIVLでした。
SVLで問題を起こすケース
さらにややこしいですが、SVLなら全て解決というわけでもないようで、MACアドレスの学習方式(VLAN学習方式)はIVLとSVLのどちらですかに不具合を起こすケースの不穏な記載があります。マルチプルVLANをSVLのスイッチで延長した際には、今度は逆に通信できるべきものが通信できなくなる不具合が発生するケースがあるようです。
時間があるときにこのケースの対応策について検証、追記したいと思います。