やりたいこと
サーバー機では、ホストOSとゲストOS群とでネットワークを分けたいことがしばしばある。
ゲストOSが提供するサービスをユーザーから到達可能にしつつ、ハイパーバイザー管理であるホストOSにはユーザーから到達不可能にしておきたいケースなどが典型的だ。
その際、さらにゲストOS間のネットワークも分離したいケースでは、VLANのトランクリンクをハイパーバイザーの仮想スイッチに通し、それぞれのゲストOSは仮想スイッチのアクセスポートを通して独立のネットワークに接続させる。このような構成にしておくと、特定の部署向けのネットワークにのみ公開したいサービスを提供する仮想マシン(ゲストOS)をどのハイパーバイザー上で動作させるべきか、ということを、VLANのID以外で意識しなくて済む。
ホストOSでハイパーバイザーとして Hyper-V を利用するケースでこれをどのように実現するのか経験が無かったため、事前に実験して作業手順を確立しておきたい。しかし、実験に利用できるのはごくふつうのオフィスマシンで、 Hyper-V は導入できるもののネットワークインターフェースカード (NIC) が1枚しか挿さっていない。
このマシンに USB to LAN アダプターを挿し、 NIC が 2 枚の状況を作成して前述の実験を試みたい、と考えた。
実験内容
- NIC1 として Realtek PCIe GBE Family Controller
- 192.168.0.0/24
- NIC2 として ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter
- NIC2 のトランクリンクには VLAN タグ 10, 20 のフレームを流す
- 10: 192.168.10.0/24
- 20: 192.168.20.0/24
- 仮想スイッチはホストOSの Hyper-V 上から作成
- [管理オペレーティングシステムにこのネットワーク アダプターの共有を許可する] はチェックを外す
- 仮想マシン1は仮想スイッチに VLAN ID 10 で接続。 IP アドレスは DHCP に任せる
- 仮想マシン2は仮想スイッチに VLAN ID 20 で接続。 DHCP サーバーを立てていないので IP アドレスは手動で固定
この手順で間違えることもなく設定完了。
何も問題なさそう……
と思っていたが、仮想マシンから上流に疎通が取れない。
一時的に [管理オペレーティングシステムにこのネットワーク アダプターの共有を許可する] にチェックを入れて、ホストOSから NIC2 のパケットをキャプチャしてみたが、タグ付きフレームが流れてきていないように見える。
トランクリンクの上流と NIC2 の間に挟んでいるスイッチングハブを外して直接接続にしてみたり、ネットワークアダプターの設定を見直してみたり、いろいろ試したのだが、どうにもうまくいかない。
解決
検索していて以下の情報を発見した。
この記事によれば
No known USB-to-Ethernet adapters that provides a Windows driver (for any version of Windows) with multiple VLAN support.
ということで、 USB to Ethernet には複数 VLAN をサポートするドライバーが無いらしい。
これを受けて NIC1, NIC2 を交換し
- NIC1 として ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter
- NIC2 として Realtek PCIe GBE Family Controller
としたところ、無事仮想マシンから上流に疎通が取れるようになった。
トランクリンクの上流と NIC2 の間にスイッチングハブを挟んでも問題なかった。
(デフォルトの挙動が「すべての VLAN タグを通す」ではなく「選択した VLAN タグのみを通す」というスイッチングハブも存在するので、これ自体は注意すべきポイントの一つであると思っている)
IEEE 802.1q はデフォルトでサポートされているものだと思い込んでいたが、今回のケースでそうではないと分かったのが学びであった。