Windows 10 で Hyper-V を有効にしています。除外されたポートを確認すると、次のメッセージが表示されます。
C:\> netsh interface ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
5357 5357
9800 9800
9801 9801
49671 49770
49871 49970
50000 50059 *
61117 61216
61220 61319
61902 62001
* - Administered port exclusions.
Hyper-V がこれらのポートを予約するのはなぜですか?
管理されたポート除外 (つまり、範囲 50000 ~ 50059) は、他のポート除外とどう違うのでしょうか?
たとえば、Golang で net.Listen() を使用してこれらすべてのポートに ping を実行しようとすると、50000 ~ 50059 を除くすべてのポートでエラーが返されます。
listen tcp 127.0.0.1:9801: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
ベストアンサー1
Windows 10 では、特定のポートでエラーが発生することがあります。
Ports are not available: listen tcp 0.0.0.0:55555: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
このエラーを見ると、必要なポートが別のアプリケーションで使用されているのではないかとまず考えます。そこで、使用中のポートを確認します。
netstat -aon | find "55555"
しかし、結果にはポートがまだ使用されていないことが示される場合があります。
問題は、Windows がいくつかのポートを予約していることかもしれません。それらは、他の目的に使用できない除外ポートです。次のコマンドでそれらのポートを一覧表示できます。
C:\Users\Xyz> netsh interface ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
1031 1130
1131 1230
1231 1330
1331 1430
1431 1530
1561 1660
2363 2462
2463 2562
2563 2662
2663 2762
2763 2862
2863 2962
5357 5357
50000 50099 *
55500 55599
* - Administered port exclusions.
Windows がこれらのポートを予約するのはなぜですか?
- これらのポートは、特定されたウイルス/マルウェアのアクティビティにより Microsoft によってブロックされている可能性があります。
- Windows のアップデート後にこの現象が発生しました。その後、次のアップデートをインストールしてマシンを再起動しました。今度は範囲が変更され、ポートが使用可能になりました。
- 場合によっては、有効になっている Hyper-V 機能 (docker-for-windows インストールでは有効になっています) がこれを実行します。
他にも理由があるかもしれません。
ただし、次のコマンドを使用してポート範囲の除外を削除しようとすると (管理者であっても)、権限がないことを示すエラーが返されます。
netsh int ipv4 delete excludedportrange protocol=tcp startport=55500 numberofports=100
Hyper-V によって導入されたポート除外
Hyper-V によってポート除外が導入された場合、最終的には 2 つの解決策が考えられます (他にも解決策がある可能性があります)。
使用しようとしていたポートを変更します。新しいポートは除外対象に含まれないものにする必要があります。
Hyper-V を無効にし、使用するためにポート範囲を予約してから、Hyper-V を再度有効にします。
2 番目の解決策に従う手順は次のようになります。
1. Hyper-Vを無効にする
方法 1 - Windows 機能ツール:
コントロールパネルで「プログラムと機能」を選択、「Windowsの機能の有効化または無効化」を選択、「Hyper-V」オプションのチェックを外す、「適用」
方法 2 - Powershell 経由:
Powershell を (管理者として) 開き、次のコマンドを実行します。
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
方法 3 - コマンドプロンプト経由:
コマンドプロンプトを(管理者として)開き、次のコマンドを実行します。
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
この後、システムを再起動する必要があります。
2. 必要なポート (範囲) を予約して、Hyper-V がそのポートを再度予約しないようにします。
再起動後、ポートの除外を一覧表示してみると、一部の範囲が存在しないことがわかります (特に、必要な範囲)。次に、必要なポート範囲を予約します。
netsh int ipv4 add excludedportrange protocol=tcp startport=55500 numberofports=100
3. Hyper-Vを再度有効にする
この機能を有効にするには、上記の 3 つの方法をすべて使用できます。たとえば、dism を使用した例を示します。
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
これにはシステムの再起動も必要になります。
システムが復旧したら、ポート除外を再度リストしてみてください。
ここで起こることは、指定されたポート範囲が追加されたことです管理ポートの除外つまり、私たちの目的のために予約したということです。
これを実行すると、Hyper-V は事前に予約された範囲の周囲に独自の予約範囲を開始できるようになります (以下の結果では、55500 ~ 55599 の範囲が保護されていることに注意してください)。
C:\Users\Xyz> netsh interface ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
1031 1130
1131 1230
1231 1330
1331 1430
1431 1530
1561 1660
2363 2462
2463 2562
2563 2662
2663 2762
2763 2862
2863 2962
5357 5357
50000 50099 *
55500 55599 *
* - Administered port exclusions.
これで、その範囲内のポートに正常にバインドできるようになります。
Windows アップデート後にポート除外が導入されました
場合によっては、Windows の更新後に、特定のポートが突然使用できなくなり、コマンドでポートの使用状況を確認しても何も表示されないことがありますnetstat
。
最も重要なのは、Hyper-V も有効になっていないことです。
この場合、試すことができる回避策が 2 つあります。
(すべての人に効果があるかどうかはわかりませんが、試してみることはできます!)
オプション1 :
除外ポート範囲を確認する
netsh interface ipv4 show excludedportrange protocol=tcp
たとえば、Windows の更新後に、ポート範囲
55485-55584
(必要なポートを含む) が除外対象としてリストされているとします。55555
Hyper-Vを有効にする
除外されたポート範囲を再度確認します。
netsh interface ipv4 show excludedportrange protocol=tcp
必要なポートがまだ除外されていると表示されることがあります。ただし今回は、除外範囲に違いがある可能性があります。
55506-555605
これはおそらく、Hyper-V によって導入されたオーバーライドです (これが実際の理由かどうかはわかりません)。Hyper-Vを無効にする
除外されたポート範囲を再度確認します。
netsh interface ipv4 show excludedportrange protocol=tcp
今回、必要なポートが除外範囲に含まれていない場合は、次の手順に進んでポートを予約してください。
必要なポート範囲を予約します:
netsh int ipv4 add excludedportrange protocol=tcp startport=55500 numberofports=100
この範囲は、管理ポートの除外としてリストされます。
次に、必要なポートを使用してみます。
オプション2:
この問題は Windows NAT ドライバー (winnat) によって発生することが多いため、そのサービスを停止して再起動すると問題が解決する場合があります。
注意!: winnat サービスを停止すると、ネットワークが切断される可能性があります。
除外ポート範囲を確認する
netsh interface ipv4 show excludedportrange protocol=tcp
winnat サービスを停止します:
net stop winnat
除外されたポート範囲に何が起こるかを確認します。
netsh interface ipv4 show excludedportrange protocol=tcp
必要なポートの動的予約を禁止するには、ポート範囲を予約します。
netsh int ipv4 add excludedportrange protocol=tcp startport=55500 numberofports=100
winnat サービスを開始します:
net start winnat
除外ポート範囲を確認する
netsh interface ipv4 show excludedportrange protocol=tcp
ポート除外があることはわかりますが、自分のポートは「管理されたポート除外」としてリストされています。
次に、必要なポートを使用してみます。
管理ポート除外とは何ですか?
だから基本的に、管理ポートの除外これらは、Windows 10 で追加して、使用するためにいくつかのポートを予約できる除外です。