朝から昼寝

整理しておきたいIT関連の小ネタ

Hyper-VのDefault Switchの正体を調べる

概要

Hyper-VのDefault Switchは便利なのですが、「これが具体的に何者なのか」というMicrosoftの公式情報が見当たらなかったりして不思議です。
本記事は、Hyper-VのDefault Switchは一体何なのかという点について調べた際のメモです。主にWindows 10 1809以降のDefault Switchについて調べたものですが、Windows Serverでも同様です。

関連記事として、Hyper-Vの仮想ネットワークでゲストの通信をホスト側で制限(拡張ACL: Add-VMNetworkAdapterExtendedAcl)する方法についても別記事にまとめてあります。

本記事の目的

  • Hyper-VのDefault Switchについて(できるだけ)理解する。


目次

基本

Default Switchの外部仕様

まずDefault Switchを使えば分かる外部仕様について記載します。

  • Hyper-Vインストール時点の初期状態で使用可能な仮想スイッチ
  • ゲストのインタフェース設定は自動(DHCP任せ)のままでネットワーク利用可能
    • Hyper-VホストのDefault Switch側インタフェースをゲートウェイとして使用可能
    • Hyper-VホストのDefault Switch側インタフェースにてNAT、DHCPDNSを使用可能
  • Hyper-Vホストを再起動すると少し不可解な動作

ゲストのネットワーク設定の手間を省けるため便利な反面、ホスト再起動時にネットワークアドレスが変わってしまうため、同じIPアドレスを使用し続けたい場合には使いづらいです。

Default Switchの内部仕様

次に、このDefault Switchの内部仕様やコンポーネントについて簡単に記載します。

  • Hyper-Vが利用するHNS(Host Networking Service)によりDefault Switchが作成される
  • Default SwitchのTypeは"ICS"(Internet Connection Sharing)
    • "外部ネットワーク(External)"や"内部ネットワーク(Internal)"や"プライベート(Private)"ではない
    • ホストWindowsネットワークアダプタ設定上、ICSの設定(ネットワークのほかのユーザーにこのコンピュータのインターネット接続をとおしての接続を許可する)が有効になっている訳ではない
    • Hyper-V上の"仮想スイッチマネージャー"上は"内部ネットワーク(Internal)"が選択されているように見える
  • ICSにより以下の機能が提供される
    • NAT機能(手動で作成したWinNATと異なりGet-NetNatでは表示されない)
    • DHCPサーバ機能(Windowsの役割のDHCPサーバによるものではない)
    • DNSサーバ機能(Windowsの役割のDNSサーバによるものではない)

使いやすい管理ツールがある訳ではないので、なかなか上記の詳細は把握しづらいところです。
続いて、できる限り詳細を確認していきます。

詳細

IPアドレス、ネットワークアドレス

Default Switch用のネットワークアダプタには、自動的にIPアドレスが設定されます。
Hyper-VのホストWindowsを再起動すると、このIPアドレス(ネットワークアドレス)は変わります。
内部的には、再起動のたびに仮想スイッチが再作成されているようです(後述の参考URLに解説ページあり)。

Default Switch用のネットワークアダプタ
Default Switch用のネットワークアダプタ

NAT

Default Switchに接続する仮想マシンは、ホストWindowsIPアドレスデフォルトゲートウェイとして使用することにより、NAT経由でHyper-Vホストの外と通信可能です。

このNATは、内部的にはWinNATを使用していると思われますが、Get-NetNatでは表示されません。その他、このNAT実装の詳細を確認する方法は見つけられませんでした。

ちなみにNATと記載していますが1対多のNAPTのことです。

DHCP

Default Switchに接続する仮想マシンは、DHCPによるネットワーク自動設定が可能です。
ホストWindowsのDefault Switch側のIPアドレスでは、DHCPサーバ相当のサービス(67,68/UDP)が動作しています。

> netstat -anb
…
 [svchost.exe]
  UDP         172.27.160.1:67        *:* ←Default Switch側のIPアドレス
  SharedAccess
 [svchost.exe]
  UDP         172.27.160.1:68        *:* ←Default Switch側のIPアドレス
  SharedAccess
…

netstatによる確認結果です。その他、このDHCPサーバ相当の実装の詳細を確認する方法は見つけられませんでした。

このサービスは、以下の動作です。

DNS

Default Switchに接続する仮想マシンは、ホストWindowsIPアドレスDNSサーバとして使用することにより、名前解決が可能です。
おそらくホストWindowsDNS設定に従い、再帰的に名前解決してくれるようです。
ホストWindowsでは、DNSサーバ相当のサービス(53/UDP)が動作しています。なお、TCPの方(53/TCP)はサービスしていません。

> netstat -anb
…
 [jhi_service.exe]
  UDP         0.0.0.0:53             *:*
  SharedAccess

"jhi_service.exe"は、サービス"Intel(R) Dynamic Application Loader Host Interface Service"のプロセスのようです。
なぜこのサービスがDNSサーバ相当の機能を提供するのは不明です。
このサービスを起動状態から停止してみた場合、

 所有者情報を取得できません
  UDP         0.0.0.0:53             *:*
  SharedAccess

となり、DNSサービス自体は引き続き利用可能でした。

netstatの結果から、ホストWindowsの全てのIPインタフェースでDNSサービスが起動していますが、実際には後述のWindowsファイアウォールルールによりDefault Switch側のIPアドレスでのみ応答可能です。

(Default Switchに接続する仮想マシン上で)
> nslookup google.co.jp 172.27.160.1
サーバー:  xxxxxx-xxxxxx.mshome.net
Address:  172.27.160.1

権限のない回答:
名前:    google.co.jp
Addresses:  2404:6800:400a:80a::2003
          172.217.25.163

なお、TCPの問合せには応答不可です。

(Default Switchに接続する仮想マシン上で)
PS C:\WINDOWS\system32> nslookup -vc google.co.jp 172.27.160.1
サーバー:  UnKnown
Address:  172.27.160.1

*** UnKnown が google.co.jp を見つけられません: Unspecified error
  • (補足)nslookupコマンドは-vcオプションによりTCP接続するよう指定できます
    • Microsoft解説ページ
      "vc サーバーに要求を送信するときに常に仮想回線を使用することを指定します。"
    • TCPによる通信を"仮想回線"(Virtual Circuit)と呼ぶこともあるようです。

Windowsファイアウォール

ホストのWindowsファイアウォールが自動設定されます。
Default Switchが有効なHyper-V環境では、前述のDNSサーバ相当の機能とDHCPサーバ相当の機能を使用できるようにWindowsファイアウォールのルールが自動的に作成されるようです。

ホストのWindowsファイアウォール
ホストのWindowsファイアウォール

DNSの許可ルールについては、ホストWindowsのDefault Switch側のIPアドレスに対してのみ、53/UDPと53/TCPの接続を許可するというものです(53/TCPの許可ルールはありますが、前述の通りTCP経由ではDNSサービスされていません)。
少し困ったことに、再起動するたびにルールが増え続けるようです。
最新のルール以外は不要ですので、古いものは削除して大丈夫と思われます。

DHCPの許可ルールについては、1つだけなので増え続けることは無さそうです。

関連要素

HNS、HCS、ICS

Default Switchの実態はHNS、HCS、ICS等と関連があります。またWindowsのコンテナ関連のネットワーク機能は、こういったHyper-Vの仮想ネットワークと共通的な要素がありそうです。

  • HNS(Host Networking Service)
  • HCS(Host Compute Service)
    • (コンテナの場合に使用)

  • ICS(Internet Connection Sharing)
    • Default SwitchののTypeはICS
    • (推測)従来のインターネット接続共有の技術を継承?

Hyper-VよりWindowsコンテナ関連の方が記事が見つかりやすいです。

The Host Networking Service (HNS) and the Host Compute Service (HCS) work together to create containers and attach endpoints to a network. https://learn.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture

このHNSを管理するためのモジュール(HNS Powershell Helper Module)がMicrosoftから提供されています。
このモジュールにより、OS標準で使用できるHNS関連のコマンドレットより多くのコマンドレットが使用できます。
このHNS Moduleをインストールし実行してみましたが、Default Switchを把握する上でGet-*系の追加されたコマンドレットから新たな情報は得られませんでした。

ICSに関しては、Default Switchを使用する環境ではhosts.icsというファイルが存在します。
パスは、C:\Windows\System32\drivers\etc\hosts.icsです。 ICSが動作する環境において自動的に生成されるファイルで、ホストWindowsのDefault Switch側のIPアドレスとその名前が登録されています。

Default Switchのカスタマイズ

特に試してはいませんが、Default Switchのネットワークアドレスレンジの固定化や、Default Switchの削除を行う方法は(一応)ありそうです。

ネットワークアドレスレンジの固定化(実施はお勧めしません)

参考URLです。

Change Hyper-V (Default Switch) IP address range

Get-NetIPAddress -InterfaceIndex (Get-NetAdapter -Name 'vEthernet (Default Switch)').ifIndex | Remove-NetIPAddress -confirm:$false
New-NetIPAddress -InterfaceAlias 'vEthernet (Default Switch)' -IPAddress '10.0.0.1' -PrefixLength 24
Set-DnsClientServerAddress -InterfaceAlias 'vEthernet (Default Switch)' -ServerAddresses ("10.0.0.15","8.8.8.8")

Default Switchの削除(実施はお勧めしません)

参考URLです。

Removing the vEthernet (default switch) from network connections list

Disable DNScache/"Dns Client" and use a third party client such as acrylic or simple dnscrypt. Thats the only solution to disappear vEthernet with hyper-v enabled.
HKLM\SYSTEM\CurrentControlSet\Services\VMSMP\Parameters\SwitchList
"I deleted the entry then rebooted and now the switch is gone"

Microsoftの説明ページ には、Default Switchは"You can’t delete it."と書かれています。

その他、参考情報として、Remove-VMSwitchでは、"The automatic Internet Connection Sharing switch cannot be modified."というエラーで削除失敗するようです。

Get-HnsNetwork

PowerShellGet-HnsNetworkコマンドレットにより、Default Switchが定義されていることを確認できます。

PS C:\WINDOWS\system32> Get-HnsNetwork

ActivityId             : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
AdditionalParams       :
CurrentEndpointCount   : 0
Extensions             : {@{Id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; IsEnabled=False; Name=Microsoft Windows フィルタリ
                         ング プラットフォーム}, @{IdXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; IsEnabled=False; Name=Micro
                         soft Azure VFP Switch Extension}, @{Id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; IsEnabled=True; N
                         ame=Microsoft NDIS キャプチャ}}
Flags                  : 11
GatewayMac             : XX-XX-XX-XX-XX-XX
Health                 : @{AddressNotificationMissedCount=0; AddressNotificationSequenceNumber=11; DHCPNotificationMiss
                         edCount=0; DHCPNotificationSequenceNumber=0; DNSCacheNotificationMissedCount=0; DNSCacheNotifi
                         cationSequenceNumber=0; DNSNotificationMissedCount=0; DNSNotificationSequenceNumber=0; Interfa
                         ceNotificationMissedCount=0; InterfaceNotificationSequenceNumber=0; LastErrorCode=0; LastUpdat
                         eTime=xxxxxxxxxxxxxxxxxx; MacAddressNotificationMissedCount=0; MacAddressNotificationSequenceN
                         umber=0; NeighborNotificationMissedCount=0; NeighborNotificationSequenceNumber=0; RouteNotific
                         ationMissedCount=0; RouteNotificationSequenceNumber=0; XlatNotificationMissedCount=0; XlatNoti
                         ficationSequenceNumber=0}
ID                     : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
IPv6                   : False
LayeredOn              : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
MacPools               : {@{EndMacAddress=00-xx-xx-xx-1F-FF; StartMacAddress=00-xx-xx-xx-10-00}}
MaxConcurrentEndpoints : 0
Name                   : Default Switch ★
NatName                : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Policies               : {}
State                  : 1
Subnets                : {@{AdditionalParams=; AddressPrefix=172.27.160.0/20; Flags=0; GatewayAddress=172.27.160.1; Hea
                         lth=; ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; IpSubnets=System.Object[]; ObjectType=5; Polici
                         es=System.Object[]; State=0}}
SwitchGuid             : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
SwitchName             : Default Switch ★
TotalEndpoints         : 0
Type                   : ICS ★
Version                : 47244640267
Resources              : @{AdditionalParams=; AllocationOrder=2; Allocators=System.Object[]; CompartmentOperationTime=0
                         ; Flags=0; Health=; ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; PortOperationTime=0; State=1; Swi
                         tchOperationTime=0; VfpOperationTime=0; parentId=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

WSL(WSL2)が有効な環境の場合、さらにWSL用のスイッチも表示されます。 "Default Switch", "WSL"、どちらの仮想スイッチもHNSが管理していることを確認できます。

Name                   : WSL
NatName                : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Type                   : ICS

ネットワークアドレス情報のみを確認することもできます。

PS C:\WINDOWS\system32> (Get-HnsNetwork).Subnets

AdditionalParams :
AddressPrefix    : 172.27.160.0/20
Flags            : 0
GatewayAddress   : 172.27.160.1
Health           : @{LastErrorCode=0; LastUpdateTime=xxxxxxxxxxxxxxxxxx}
ID               : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
IpSubnets        : {@{AdditionalParams=; Flags=3; Health=; ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; IpAddressPrefix=172
                   .27.160.0/20; ObjectType=6; Policies=System.Object[]; State=0}}
ObjectType       : 5
Policies         : {}
State            : 0

参考URL等