はじめに
仕事で使っていた SoftEther VPN がここ2~3か月調子が悪くなり、とうとう全くつながらなくなってしまいました(正確には、VPN セッションは張れるが IP が取れない状態)。しばらく諦めていたのですが、接続先の中の人と切り分けを行った結果、どうもクライアント(Windows 11 22H2)側の問題らしいということになりました。
そういえばこの数ヶ月、ネットワーク周りがなんだか不安定に感じていました(起動後に接続できるようになるまで非常に時間がかかる、等)。また先日 VirtualBox を 7.0.8 に上げた時、ネットワークデバイスが無くなってしまって一時的に仮想マシンにつながらなくなったりしていました(これはリブートで解消)。その後コンパネのネットワーク接続を見ると、ひどい状態になっていました。イーサネット100って何だよ…。
SoftEther のフォーラムを見ても似たような報告は特にないので、これはひょっとして、この大量の仮想ネットワークアダプターが悪さをしているのではないかと仮定して調査を開始しました。
- Virtual Box 6.1 creates multiple network adapters on Windows host
- How to stop VirtualBox from creating Host-Only Ethernet Adapters?
これにしたがって、デバイスマネージャーで「表示>非表示デバイスの表示」を選んでみると、
同じ名前で複数の隠れエントリがありますね。これはひどい…。
VirtualBox の GUI で見ると以下のような感じです。
これはいったん VirtualBox(および Windows )が作成した仮想ネットワークアダプターをばっさり削除するしかなさげです。というわけで、そのためのスクリプトを PowerShell で書き始めようとしましたが、そもそも PowerShell でネットワークアダプターを削除するのはどうすればいいのだろう?ということで検索してみました。
Using Powershell to remove non present network adapters
この中に、似たような機能のスクリプトを作ったよ、という書き込みがあったので早速試してみましたが、なぜか削除対象の一覧表に出て来ません。
VSCode で追ってみたら、スクリプトの先頭に明示されているように “InstallState” が false のものしか削除対象としてくれないようです(というか、そういう「ゾンビデバイス」を消すためのスクリプトのようです)。
かなりいいところまで作り込まれているので、後は “InstallState” に関わらず削除する、というオプションがあればよさそうということで追加してみました。その結果、なんとか削除に成功したようです。
PS C:\Users\hotta\pss> .\removeGhosts.ps1 -narrowByFriendlyName Virtualbox -regardlessOfInstallState -Force
NarrowByFriendlyName: Virtualbox
Each removal will happen without any confirmation: True
Each removal will happen regardless of its InstallState: True
Filter matched. Skipping Bluetooth 周辺デバイス
Filter matched. Skipping Microsoft IPP Class Driver
(中略)
Attempting to remove device VirtualBox Host-Only Ethernet Adapter #17
Removed device VirtualBox Host-Only Ethernet Adapter #17
Attempting to remove device VirtualBox Host-Only Ethernet Adapter #4
Removed device VirtualBox Host-Only Ethernet Adapter #4
(以下、大量に削除が続く)
この結果、ようやくキレイな身体に戻りました😅
VirtualBox Host-Only Ethernet Adapter が一切合切消えてしまっていますが、vagrant up すると、足りないアダプターを自動的に作ってくれます。
この後、SoftEther VPN の方も、問題なくつながるようになりました。
作成したスクリプトは hotta/tools に置いていますので、もしお困りの方がおられましたら自己責任でお試しください。それにしても、PowerShell ってインラインで C# のコードが使えるとか、かなり強力ですね。使いこなせるようになれたらいいなぁ。