概要
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を使えば分かる外部仕様について記載します。
ゲストのネットワーク設定の手間を省けるため便利な反面、ホスト再起動時にネットワークアドレスが変わってしまうため、同じ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により以下の機能が提供される
使いやすい管理ツールがある訳ではないので、なかなか上記の詳細は把握しづらいところです。
続いて、できる限り詳細を確認していきます。
詳細
IPアドレス、ネットワークアドレス
Default Switch用のネットワークアダプタには、自動的にIPアドレスが設定されます。
Hyper-VのホストWindowsを再起動すると、このIPアドレス(ネットワークアドレス)は変わります。
内部的には、再起動のたびに仮想スイッチが再作成されているようです(後述の参考URLに解説ページあり)。
NAT
Default Switchに接続する仮想マシンは、ホストWindowsのIPアドレスをデフォルトゲートウェイとして使用することにより、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サーバ相当の実装の詳細を確認する方法は見つけられませんでした。
このサービスは、以下の動作です。
- DHCPを利用する仮想マシンに対するIPアドレスの割り当て
- DHCPによりホストWindowsのIPアドレスをデフォルトゲートウェイ設定として配布(NAT経由でHyper-Vの外部と疎通可能になる)
- DHCPによりホストWindowsのIPアドレスを参照先DNSサーバ設定として配布
DNS
Default Switchに接続する仮想マシンは、ホストWindowsのIPアドレスをDNSサーバとして使用することにより、名前解決が可能です。
おそらくホストWindowsのDNS設定に従い、再帰的に名前解決してくれるようです。
ホスト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)と呼ぶこともあるようです。
- Microsoft解説ページ
Windowsファイアウォール
ホストのWindowsファイアウォールが自動設定されます。
Default Switchが有効なHyper-V環境では、前述のDNSサーバ相当の機能とDHCPサーバ相当の機能を使用できるように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
PowerShellのGet-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