トップ回答者
TCPポート除外範囲を設定しているアプリ(サービス)の確認方法

質問
-
Windows起動直後に、TCPポートの除外範囲を確認するためコマンド
netsh int ipv4 show excludedportrange tcp
を実行したところ
開始ポート 終了ポート
---------- --------
1689 1788
1789 1888
28385 28385
50000 50059 *
と表示されました
除外範囲を設定しているアプリまたはサービスを特定する方法はありますでしょうか?
ちなみに、OSを再起動するたびに
1689 1788 <------------- 不定だがこのあたりの番号
1789 1888 <------------- 不定だがこのあたりの番号
28385 28385 <------------- 常に固定
50000 50059 * <------------- 常に固定
と、値が変わるPORTがあります。
*特に、
1689~1788
1789~1888
の値が微妙に変動するため、ほかのアプリといつか競合するのではないかと気になっています。
アプリまたはサービスを特定する方法が不明でも、この除外ポートを設定しているのが何なのかご存じの方がいらっしゃいましたら教えてください。
環境
Windows10 pro 1903 OSビルド18362.267
ファイヤーオール:無効
アンチウイルスソフト:TREND MICRO・ウイルスバスタークラウド (停止しても症状変わらず(アンインストールは検証していない))
- 編集済み KOMA 2019年7月30日 1:49 誤字修正・補足情報追加
回答
-
“「TCPポートの除外範囲」とは、待ち受けを制限(禁止)する設定のことです。”が、私の認識と異なります。もちろん、私の認識が間違っているのかもしれませんが、私の認識では“「ポート除外範囲」とは、ランダムなポートを要求するTCP/UDPアプリによって使用されないように、「動的ポート範囲」から除外するために何かしらが予約したポートまたはポート範囲”だと理解しています。予約したのが何者であるかは、重要ではありません(※除外範囲のテーブルにとって重要でないという意味、ここに範囲を予約したアプリにとってはもちろん重要なこと)。
「動的ポート範囲」は、ランダムに使用されるポート範囲です。XP以前は1025-5000、Vista以降は49152-65535の範囲であり、netsh int ipv4 show dynamicportrange tcp(またはudp)で確認できます。TCPアプリでは、TCPクライアントの発信元ポートとして動的ポート範囲からエフェメラル(短命)ポートが使用されます(UDPアプリは実装の仕方によります)。Microsoft RPCのように 135/TCP(エンドポイントマッパー)に加えて、複数のランダムなポートに動的ポート範囲を使用するものもあります。
XP以前は「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ReservedPorts」レジストリで動的ポート範囲からの除外を設定できました。Vista以降は「netsh int ipv4 add excludedportrange ・・・・」コマンドによる追加(excludedportrangeに*が付きます)、または CreatePersistentTcpPortReservation 関数で予約する形に変更になりました。ポート除外範囲の設定はレジストリに格納されているのかもしれませんが、そうであったとしてもnetshの他の設定項目がそうであるのと同じようにバイナリ形式(REG_BINARY)で格納されていて人が分かる形で取り出すにはnetshコマンドを使う以外にないと思います。(※おそらくアプリのコードやマニフェストの中に従って追加されるもので、除外範囲として保存される設定にアプリとの紐づけはないと思います)
「ポートの除外範囲」は、「動的ポート範囲」からの除外設定であり、そのポートをバインドできるかできないかは別の話だと思います。ランダムなポートを要求するアプリなら、ポートが競合することを考える必要はないはずです。システム(WinSock/WinSock2 API)が「ポートの除外範囲」を除く「動的ポート範囲」から空きポートを渡してくれるからです。
参考:
You cannot exclude ports by using the ReservedPorts registry key in Windows Server 2008 or in Windows Server 2008 R2
https://support.microsoft.com/ja-jp/help/2665809/
How to reserve a range of ephemeral ports on a computer that is running Windows Server 2003 or Windows 2000 Server
https://support.microsoft.com/ja-jp/help/812873/競合の問題というのは、アプリが既に別の誰かがバインド中(TCPならLISTEN中)のポートをバインドしようとしたときに発生するもので、それはアプリ側が解決策を用意しておくべきものです(例えば、別のポートに変更できる機能など)。『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』は使用中のポートをバインドしようとしたときの通常のエラーであり、「ポートの除外範囲」とは関係ないと思います。今使えてもいつ使えなくなるか分からないという懸念があるなら、それこそ「netsh int ipv4 add excludedportange・・・」を使えばいいのだと思います。
少し試してみました。Windows 10 ver 1903を新規インストールした直後だと、ポートの除外範囲は空っぽです。その状態でIISとHyper-V、WinRMを有効化すると、次のようになりました。
netsh int ipv4 show excludedportrange tcp
開始ポート 終了ポート
---------- --------
80 80 (IISで追加された範囲)
5357 5357 (WinRMで追加された範囲)
5985 5985 (WinRMで追加された範囲)
47001 47001 (WinRMで追加された範囲)
49696 49795 (Hyper-Vで追加された範囲)
49796 49895 (Hyper-Vで追加された範囲)
50000 50059 * (Hyper-Vで追加された範囲)
* - 管理されている除外ポートnetstat -ano の結果で関連するものは次の通り。PID 4はSystem(ntoskrnl.exe)です。
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:5357 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:5985 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:47001 0.0.0.0:0 LISTENING 4この状態で、ポート80、5357、5985、47001を別のアプリがバインドしようとすれば、「アクセス許可で禁じられた方法でソケットにアクセスしようとしました。」と表示されますが、未使用の49696-49795、49796-49895、50000-50059の範囲にあるポートは、固定ポートとしてバインドすることが禁止されることはありません。また、IISのサービスを停止すれば、別のアプリで80をバインドできますし、WinRMサービスを停止すれば5985をバインドできるようになります。つまり、「ポートの除外範囲」は、ポートの使用を禁止しているわけではありません。単に、「動的ポート範囲」から除外されているので、ランダムなポートとして選択されることがなくなるだけです。
既定の動的ポート範囲である49152-65535より小さい番号が除外されていることに違和感があると思いますが、これはnetsh int ipv4 set dynamicportrange・・・ で調整できる範囲だから範囲を限定せずに設定されているのだと思います。ちなみに、動的ポート範囲の最大設定は 1024-65536(netsh int ipv4 set dynamicportrrange protocol=tcp startport=1024 numberofports=64512)でした。
以下の画面の例では、固定ポートをバインドする別のアプリとして Windows Sysinternals の PsPing のサーバーモード(指定したポートをバインドできる)を利用しています。
↓ Hyper-V によって予約された 50000 は未使用であり、別のアプリがバインドできます。
↓ WinRM によって予約された 5985 は使用中ですが、WinRM サービスを停止すれば別のアプリでバインドできるようになります。
※長文になってしまいましたが、上の 2 つの画面は除外範囲に登録があっても、ポートの使用が特定のアプリやサービス専用に紐づいているわけでも、ポートの使用を禁止するわけでもないということを確かに示していると思います。何者が予約したのか知るには、その範囲のポートをバインドしているものがないか調べるか、アプリやサービスのアンインストール/インストールで範囲の増減を調べるしかないと思います。
- 編集済み Yamauchi KazuoMVP 2019年8月2日 9:43 追記※
- 回答としてマーク KOMA 2019年8月8日 5:18
-
Yamauchi Kazuo さま
2019年8月2日 にご返信いただいた情報を読み返し再検証してみました。
その結果、除外ポート
1689~1788
1789~1888
を設定しているのは『Hyper-Vホストコンピューティングサービス』でした。
*Yamauchi Kazuo さま の情報をスルーしてしまったのは、拙のPCが以前別の問題で『Hyper-Vサービス』を無効にしていたので関係ないと判断したためでした。(いつの間にかサービスが開始設定になっていました(おそらくWindowsUpdate時だと思われます))
*Yamauchi Kazuo さま がご指摘のように拙のPCの動的ポート範囲設定がYamauchi Kazuo さま と異なっていたのが番号の違いとなっていたようです。(いいわけですが、この番号の違いからもこの情報をスルーしてしまいました(Yamauchi Kazuo さま 申し訳ないです))されど、動的ポート範囲設定を変更した覚えがないのにこの値になっているのが引っかかります。(Windows10の新規インストールとアップグレードインストールなどの導入条件の違いが影響しているのでしょうか?不明です)
ただし、Yamauchi Kazuo さま は使用中のポートをバインドしようとしたときの通常のエラーとご指摘いただいたが、やっぱりその時のエラーは
『10048:通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。 』
のはずで、
本件の『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』とは異なるのでは?と疑問が残ります。
また、Yamauchi Kazuo さま は
未使用の49696-49795、49796-49895、50000-50059の範囲にあるポートは、固定ポートとしてバインドすることが禁止されることはありません。
とあるが、拙の検証では、『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』が発生する。
*これも何かしらの環境の違いなのか?(検証ソフトのバインドオプションの違いか?)は今だ不明です。
今までの調査内容(判ったこと)まとめ
①:TCPポートの除外範囲は 『netstat』 では確認できない *ただし、『netsh int ipv4 show excludedportrange tcp』で確認可
②:TCPポートの除外範囲を設定しているソフト・サービスを簡単に特定する手段は(今のところ)ない
③:TCPポートの除外範囲のポートにバインド(ソケットオープン)をかけると失敗するPC(質問者のPC)と成功するPC(返答者のPC)がある
④:Windows10の動的ポートの範囲は通常Port:49152~ 16384個 近位だが、PC(質問者のPCのように)によってPort:1024~ 64511個 etc など 異なる場合がある *『netsh int ipv4 show dynamicport tcp』 で確認可
⑤:『Hyper-Vホストコンピューティングサービス』 は、TCPポートの除外範囲を200個程度使用(設定?)する(PCの動的ポート範囲設定、およびOSの起動の毎に値が変わる)
⑥:『Hyper-Vホストコンピューティングサービス』 は無効にしても(WindowsUpdate等?)再設定(実行)される場合がある
②に関しては引き続き調査しようと思います(ご存じの方がいれば是非ご連絡ください)- 回答としてマーク KOMA 2019年8月8日 6:20
-
追加の調査内容(判ったこと)まとめ
⑦:TCPポートの除外範囲は動的ポートから除外させるものと、固定オープン(バインド)も禁止させるものがある。
設定(解除)方法として、
動的ポートから除外させる:コマンド、netsh int ipv4 add excludedportrange
固定オープンも禁止させる:IPHLPAPI.DLL から、CreatePersistentTcpPortReservationをロード実行
解除方法として、
コマンド、netsh int ipv4 delete excludedportrange
IPHLPAPI.DLL から、DeletePersistentTcpPortReservationロード実行
があげられる。
(一時設定オプションを立てずに)設定したTCPポートの除外範囲は設定したモジュールを停止しても、OSを再起動しても解除するまで設定が消えないことから注意が必要- 回答としてマーク KOMA 2019年8月13日 1:07
すべての返信
-
チャブーンです。
この件ですが、素で対応なら、「ポート待ち受け状況」を確認するコマンド、netstatで待ち受けポートとPIDの紐づけを確認し、PIDから何のプログラムが動作しているのか、tasklistコマンドで確認するといいでしょう。
netstat -ano REM <ポート番号からPIDを確認する> tasklist /fi "PID eq <PID番号>" REM PIDから実行プロセスのブログラムを確認する(<>はいりません)
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
チャブーン さま
ご助言ありがとうございます。
今回知りたいのは、「TCPポートの除外範囲」であり、「ポート待ち受け状況」ではありません。
netstatでは「ポート待ち受け状況」の確認ですので、今回懸念しているポートの番号は当然出力されません。
*「TCPポートの除外範囲」に設定されているので当然ですが
「TCPポートの除外範囲」とは、待ち受けを制限(禁止)する設定のことです。
*具体的には、Window設定、サービス、ファイヤーウォール(またはアンチウイルスソフト)などになると思われます。
また新たな情報がありましたらまたらよろしくお願いいたします。
-
TCPとUDPのポート除外範囲は、何かしらのサービスやアプリが使用するポートを予約しているもので(XP 以前の ReservedPorts レジストリに相当するもの)、他のアプリやサービスが使用しないようにするためのものです。そのため、競合について心配する必要はないと思います。
予約されているTCPポートが現在使用中である場合、netstat -anoでPIDを確認できます。既に使用が終わって時間が経っている場合や、まだ使用されていない場合は確認できませんが、同じポート除外範囲に含まれる場合は同じサービスやアプリ由来であることが想像できます。誰がどこで予約したものであるのかは、バイナリにハードコードされているかもしれず、調べるのは難しいのではないでしょうか。
-
Yamauchi Kazuo さま
TCPとUDPのポート除外範囲は、競合について心配する必要は多いにあります。
*この範囲のポートに対し、待ち受けポートとしてアプリケーションを実行すると、『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』が発生します。
*拙の質問にも書かせていただいたように、OSの起動毎に値が変えられてしまっては、待ち受けポートを持つアプリケーションがいつ起動できなくなるか危惧するのは当然かと・・・
*コマンド「netsh int ipv4 delete excludedportrange」で解除できればよいのですが、一部の設定は管理者権限でも解除できないようです
ちなみに、コマンド「netsh advfirewall firewall show rule name=all」でfirewallの禁足設定を確認することができました。
*残念ながら、拙が気にしている設定は判明できませんでしたが・・・
捕捉:
チャブーン さまのご助言の返信にも記載しましたが、「除外範囲」は、予約されているTCPポートを表しているものではないので、netstatの確認は当件ではあまり意味がないように思います。
また、バイナリにハードコードされているにしても、「netsh int ipv4 show excludedportrange tcp」では確認できる以上、レジストリ情報などで確認方法をご存じの方がいればと思い質問させていただいた次第です。
- 編集済み KOMA 2019年7月31日 9:17 誤字修正
-
“「TCPポートの除外範囲」とは、待ち受けを制限(禁止)する設定のことです。”が、私の認識と異なります。もちろん、私の認識が間違っているのかもしれませんが、私の認識では“「ポート除外範囲」とは、ランダムなポートを要求するTCP/UDPアプリによって使用されないように、「動的ポート範囲」から除外するために何かしらが予約したポートまたはポート範囲”だと理解しています。予約したのが何者であるかは、重要ではありません(※除外範囲のテーブルにとって重要でないという意味、ここに範囲を予約したアプリにとってはもちろん重要なこと)。
「動的ポート範囲」は、ランダムに使用されるポート範囲です。XP以前は1025-5000、Vista以降は49152-65535の範囲であり、netsh int ipv4 show dynamicportrange tcp(またはudp)で確認できます。TCPアプリでは、TCPクライアントの発信元ポートとして動的ポート範囲からエフェメラル(短命)ポートが使用されます(UDPアプリは実装の仕方によります)。Microsoft RPCのように 135/TCP(エンドポイントマッパー)に加えて、複数のランダムなポートに動的ポート範囲を使用するものもあります。
XP以前は「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ReservedPorts」レジストリで動的ポート範囲からの除外を設定できました。Vista以降は「netsh int ipv4 add excludedportrange ・・・・」コマンドによる追加(excludedportrangeに*が付きます)、または CreatePersistentTcpPortReservation 関数で予約する形に変更になりました。ポート除外範囲の設定はレジストリに格納されているのかもしれませんが、そうであったとしてもnetshの他の設定項目がそうであるのと同じようにバイナリ形式(REG_BINARY)で格納されていて人が分かる形で取り出すにはnetshコマンドを使う以外にないと思います。(※おそらくアプリのコードやマニフェストの中に従って追加されるもので、除外範囲として保存される設定にアプリとの紐づけはないと思います)
「ポートの除外範囲」は、「動的ポート範囲」からの除外設定であり、そのポートをバインドできるかできないかは別の話だと思います。ランダムなポートを要求するアプリなら、ポートが競合することを考える必要はないはずです。システム(WinSock/WinSock2 API)が「ポートの除外範囲」を除く「動的ポート範囲」から空きポートを渡してくれるからです。
参考:
You cannot exclude ports by using the ReservedPorts registry key in Windows Server 2008 or in Windows Server 2008 R2
https://support.microsoft.com/ja-jp/help/2665809/
How to reserve a range of ephemeral ports on a computer that is running Windows Server 2003 or Windows 2000 Server
https://support.microsoft.com/ja-jp/help/812873/競合の問題というのは、アプリが既に別の誰かがバインド中(TCPならLISTEN中)のポートをバインドしようとしたときに発生するもので、それはアプリ側が解決策を用意しておくべきものです(例えば、別のポートに変更できる機能など)。『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』は使用中のポートをバインドしようとしたときの通常のエラーであり、「ポートの除外範囲」とは関係ないと思います。今使えてもいつ使えなくなるか分からないという懸念があるなら、それこそ「netsh int ipv4 add excludedportange・・・」を使えばいいのだと思います。
少し試してみました。Windows 10 ver 1903を新規インストールした直後だと、ポートの除外範囲は空っぽです。その状態でIISとHyper-V、WinRMを有効化すると、次のようになりました。
netsh int ipv4 show excludedportrange tcp
開始ポート 終了ポート
---------- --------
80 80 (IISで追加された範囲)
5357 5357 (WinRMで追加された範囲)
5985 5985 (WinRMで追加された範囲)
47001 47001 (WinRMで追加された範囲)
49696 49795 (Hyper-Vで追加された範囲)
49796 49895 (Hyper-Vで追加された範囲)
50000 50059 * (Hyper-Vで追加された範囲)
* - 管理されている除外ポートnetstat -ano の結果で関連するものは次の通り。PID 4はSystem(ntoskrnl.exe)です。
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:5357 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:5985 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:47001 0.0.0.0:0 LISTENING 4この状態で、ポート80、5357、5985、47001を別のアプリがバインドしようとすれば、「アクセス許可で禁じられた方法でソケットにアクセスしようとしました。」と表示されますが、未使用の49696-49795、49796-49895、50000-50059の範囲にあるポートは、固定ポートとしてバインドすることが禁止されることはありません。また、IISのサービスを停止すれば、別のアプリで80をバインドできますし、WinRMサービスを停止すれば5985をバインドできるようになります。つまり、「ポートの除外範囲」は、ポートの使用を禁止しているわけではありません。単に、「動的ポート範囲」から除外されているので、ランダムなポートとして選択されることがなくなるだけです。
既定の動的ポート範囲である49152-65535より小さい番号が除外されていることに違和感があると思いますが、これはnetsh int ipv4 set dynamicportrange・・・ で調整できる範囲だから範囲を限定せずに設定されているのだと思います。ちなみに、動的ポート範囲の最大設定は 1024-65536(netsh int ipv4 set dynamicportrrange protocol=tcp startport=1024 numberofports=64512)でした。
以下の画面の例では、固定ポートをバインドする別のアプリとして Windows Sysinternals の PsPing のサーバーモード(指定したポートをバインドできる)を利用しています。
↓ Hyper-V によって予約された 50000 は未使用であり、別のアプリがバインドできます。
↓ WinRM によって予約された 5985 は使用中ですが、WinRM サービスを停止すれば別のアプリでバインドできるようになります。
※長文になってしまいましたが、上の 2 つの画面は除外範囲に登録があっても、ポートの使用が特定のアプリやサービス専用に紐づいているわけでも、ポートの使用を禁止するわけでもないということを確かに示していると思います。何者が予約したのか知るには、その範囲のポートをバインドしているものがないか調べるか、アプリやサービスのアンインストール/インストールで範囲の増減を調べるしかないと思います。
- 編集済み Yamauchi KazuoMVP 2019年8月2日 9:43 追記※
- 回答としてマーク KOMA 2019年8月8日 5:18
-
Yamauchi Kazuo さま
追加のご助言ありがとうございます。
「動的ポート範囲」の制御は、netsh int ipv4 set dynamicport を使うのが常識と考えていました。
*こちらだと動的ポートのみ作用し、待ちポートはオープンできるわけですから(コマンド名もdynamicportとなっていますし)
netsh int ipv4 add excludedportrange は、CreatePersistentTcpPortReservation(持続的TCPポート予約)のコマンド版の機能だと思います。
アプリケーション起動時に、機能全ての待ち受けポートを使用しなくても状況によって使用することが想定される場合、事前に動的だろうが静的だろうがその時までほかのサービスは使わないでねといったシチュエーションを想定していると考えると個人的に納得できます。
*netshにまでこの機能(コマンド)を付けたのには疑問も残りますが(マイクロソフトの問題解決サイトに引用されている場合があるので検証用でしょうかね?)
さらに、Yamauchi Kazuo さま身でWindows 10 ver 1903を新規インストールまで試していただいてありがとうございます。
拙は質問に、『Windows起動直後』とは記載しましたが、Yamauchi Kazuo さまのレスのように『新規インストールした直後』では無いので環境が異なるようですね
ご自身のパソコンの状態を詳しく送っていただいて恐縮なのですが拙が懸念しております、OSを再起動するたびに数値が微妙に変わる
1689 1788
1789 1888
この番号に対しての情報がいただければと思います。
*ハードウェアのドライバーアップデート用かもしれませんし、Yamauchi Kazuo さまで再現が取れないなど情報をお持ちでないならご返信なさらなくて構いません
*XP以前の情報や、IISとHyper-V、WinRM など有意義な情報ではありますが、本レスの本筋から少し離れてしまいますのでその旨もご了承ください。
拙の質問の仕方が原因ですが、Yamauchi Kazuo さまには拙が何を問題視しているか伝わっていないようで申し訳けないです。
そもそも、認識の違いなどの議論をするために立ち上げたスレットではないですし、今後も貴重な情報はお待ちしておりますが、Yamauchi Kazuo さまが、予約したのが何者であるかを重要と感じていなかったり、「ポートの除外範囲」とは関係ないとかんがえているようでしたら無理にご返信なさらなくて大丈夫です。
-
チャブーンです。
Yamauchiさんとのやりとりを確認しましたが(結構勉強になりました)、質問者さんがおっしゃりたいのは、「netsh int ipv4 show excludedportrange tcp」では未待ち受けのポート予約が問題になっているので、待ち受け済みポートの話しをしても意味がない、ということかと思います。Yamauchiさんや私(私もYamauchiさんの検証内容はざっと確認したうえ投稿していました)の方では、Windowsコンポーネントで追加機能で利用されるポートについては、(おそらく)未待ち受けポート扱いでいったん予約され、それが可及的速やかに実際待ち受けされている状況を確認したので、netstatの有用性について、話しをした理解です。
環境の違いと状況の違いが生んだ齟齬かと思いますが、(言葉を選ばれてはいますが)的外れで無意味な情報、とご指摘いただいても、私はともかくYamauchiさんは困ってしまうと思います。フォーラムは「情報交換」の場である以上、こういうことはよくあることかと思いますので。
話しを戻しますが、別の視点でコメントすると、「99個ものポートを同時予約するプロセスって何だっけ?」と考えると、MS-RPCがすぐに思い浮かぶと思います。実際MS-RPCに関する資料には「2次ポートには最低100ポートは必要」といった記述があり、いただいた内容から常に99個のポートをハイポート(かつてのWindowsの一時ポート)範囲から予約しています。
ではWindowsコンポーネントでMS-RPCを直接利用しているのか、といわれると、おそらくそうではないと思います。なぜなら現在のWindowsの一時ポートは49152~であり、標準のMSコンポーネントがRPCを使うなら、このポート以降を2次ポートに使うはずだからです。
ところでウイルスバスター製品についてですが、製品情報を検索すると(クライアント側で使われる)エージェント類については、RPC機能が必要、という情報が散見されます。そう考えてみると、何らかの理由でウイルスバスバスターがかつてのWindowsの一時ポートをRPC2次ポートと見立てて予約している、可能性があるのではないでしょうか?
ちなみにアンチウイルスソフトは一般に、OS動作(ネットワーク・I/O)をフックするフィルタードライバと吸い上げた情報を制御するサービスとの多段構成になっていますので、「サービスを止めただけ」ではおそらく機能そのものは無効になっていません。
私であればですが、機能を「全有効」にしたうえ、netstat -anoで「99個のどれかのポート」が使われているサービスは何か、を探すか、逆にフィルタードライバ含め全機能を「アンロード」したうえ、ポートの予約が消えるかどうか、を確かめると思います。アンロードに方法については、アンチウイルスソフトベンダーにおたずねいただければ、情報は入手可能かと思います。フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
チャブーン さま
ご感想ありがとうございます
予約ポートと、待受けポート、および動的ポートを混合しないでほしいとの意味での返信でした。(失礼しました)
「情報交換」の場である以上、質問の趣旨にそった情報を残せればとの思いからの返信です。チャブーン さまのコメントのように『的外れで無意味な情報』と指摘したつもりは全くありませんでした。
*私はともかく、当案件について見に来られた方が困ってしまうと思ってのコメントです。ご了承ください
話しを戻します。
MS-RPCについて拙は詳しくないのですし断定はしませんが、今回の件とは無関係のように思います。
*本PCにてMS-RPCの設定およびサービスを開始していないですし、そもそもMS-RPCで利用するポートと本案件のポートの番号がかなりことなるので
*チャブーン さまのコメントに、Windowsの一時ポートは49152~ とありますが、拙のPC(およびほかのPC数台)でnetsh int ipv4 show dynamicport tcpで確認したところ
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 1024
ポート数 : 64511
とあります。(チャブーン さまはどのようにWindowsの一時ポートは49152~とご確認されたのでしょうか?)
*一般的には49152~と言われていましたがどうなんでしょう?拙の近辺のPCが特殊なのでしょうかね?
アンチウイルスソフトに関しましては、単なる機能停止ではなく、ベンダーへ連絡確認したうえでの全サービス・ドライバのモジュール停止にて行っております。
*これについても拙がもっとはっきりコメントすればよかったですね
チャブーン さま のご返信に、私であればですが、機能を「全有効」にしたうえ、netstat -anoで「99個のどれかのポート」が使われているサービスは何か、を探す・・・『チャブーン さまの返信一部抜粋』
これも、チャブーン さまへの私の返信(2019年7月31日 6:30)にもコメントしましたが、この範囲(近辺)で使われている待受けポートはありません。
*質問前にすでにnetstatで確認済み(そういった意味で何度も今回の件はnetstatは役に立たないとお伝えしていたつもりなのですが、それでもなおチャブーン さまが何度もnetstat -anoのご説明をなさるのは何か別の意味があるのに私が読み違えているのでしょうか・・・) -
Hebikuzure aka Murachi Akira さま
ご質問に関するご質問とご感想ありがとうございます。
【ご質問に関するご質問[以下、Hebikuzure aka Murachi Akira さま 引用]】
待ち受けするネットワーク アプリケーションで待ち受けポートにエフェメラル ポートを使うのであれば、使おうとしたポートがエラーになったらリトライして別のポートを利用するような実装にはできないのでしょうか?
【拙の返答】
使おうとしたポートがエラーになったらリトライするというのは有効かとは思います。(ただし、サーバプログラムで、ソケット生成、ソケット登録(bind時)に失敗してリトライをかけるソフトを私は見かけたことはないですけど)
サーバ自身のアプリがエラーになったからといって別のポートを利用するというのはどうなんでしょう・・・(クライアントはそのサーバの何番ポートにアクセスするのか困りそうですね)実装は可能でしょうけど使い物にならないと思います。
【ご感想[以下、Hebikuzure aka Murachi Akira さま 引用]】
エフェメラル ポートを(自分自身で除外範囲に登録することなく)決め打ちで待ち受けに利用しようとするのはあまり賢明ではないように思うのですが。
【拙の返答】
サーバアプリケーション(例えばプロキシサーバがよく8080ポート固定で待ち受けているように)が、決め打ちで待ち受けるのは当然と考えている拙には、Hebikuzure aka Murachi Akira さまのお考えがよく理解できません(知識不足ですみません)
Hebikuzure aka Murachi Akira さまが、『この話のそもそものシナリオが良く分からない』ということなので一言でまとめます。
DOSコマンド”netsh int ipv4 show excludedportrange tcp”で表示される除外範囲ポート番号を設定しているアプリケーション(またはサービスなど)を特定する方法をご存じな方はいませんか?
ということです。 -
待ち受けポートは一般的に Well known port を利用する(HTTPであれば 80 など)のでなければ自由に決めて使うことは可能ですが、だからといって他の誰か(プログラムやサービス)がそのポートを使っていないことは保証されません。
一般的なサービス プログラム(サーバー)であればわざわざポート割り当ての再試行をしないで単にエラーを出してユーザーにポートの確保を指示するメッセージを出すものが多いでしょうが、P2P 動作を行うようなアプリケーションの場合は動的な待ち受けポートが確保できるまで一定範囲内でランダムに再試行するものもあるようです(コントロール サーバーなどを通じて待ち受けポートを相手に通知すれば良いのでポートが固定でなくとも問題ない実装であれば)。
ポートを決め打ちしてそれが確保できなければ実行できないように実装するか、ポートが確保できるまで再試行するかはアプリケーション(サーバー)の用途や目的、ユーザー エクスペリエンスのあり方などで変わってくるので一概には言いにくいところですが、動作させようとしているアプリケーション(サーバー)の用途目的などに即して最適なやり方を考えれば良いのでしょう。
ちなみに独自のプロトコル(で利用するポート)は IANA に登録することで公告され、他のプログラムが利用を避けるように情報提供することは可能です。ただそれを尊重するかどうかは別の話なので、登録したからそのポートを排他的に利用できるわけではありません。
大元の質問に戻れば、結局利用したいポートが利用できなかった場合に、どのような動作になるようアプリケーション(サーバー)を実装されたいのでしょうか?
Hebikuzure aka Murachi Akira
-
Hebikuzure aka Murachi Akira さま
ネットワークポートについての基本的な情報ありがとうございます。
Hebikuzure aka Murachi Akira さま と当レス(質問)で情報交換するにあたり認識の確認をさせてください。
【以下、Hebikuzure aka Murachi Akira さま 引用]】
待ち受けポートは一般的に Well known port を利用する(HTTPであれば 80 など)のでなければ自由に決めて使うことは可能ですが、だからといって他の誰か(プログラムやサービス)がそのポートを使っていないことは保証されません。
【以下、拙の認識]】
ポートを使っていない(使わせない)ことを保証する機能(サービス)かWindiowsにはあるようです。(RFCに規定されているかどうかは定かではないです(多分ないのではと考えています))
*Hebikuzure aka Murachi Akira さま のレス引用で返信するので↑日本語が若干変なのはご了承ください。
*今回の質問の本質はここなんですが、どうもご返信いただく方の多くが保証されない(保証する方法がない)との認識の方が多い様に思います(以前の私もそうでしたが)
【以下、Hebikuzure aka Murachi Akira さま 引用]】
一般的なサービス プログラム(サーバー)であればわざわざポート割り当ての再試行をしないで単にエラーを出してユーザーにポートの確保を指示するメッセージを出すものが多いでしょうが、P2P 動作を行うようなアプリケーションの場合は動的な待ち受けポートが確保できるまで一定範囲内でランダムに再試行するものもあるようです(コントロール サーバーなどを通じて待ち受けポートを相手に通知すれば良いのでポートが固定でなくとも問題ない実装であれば)。
ポートを決め打ちしてそれが確保できなければ実行できないように実装するか、ポートが確保できるまで再試行するかはアプリケーション(サーバー)の用途や目的、ユーザー エクスペリエンスのあり方などで変わってくるので一概には言いにくいところですが、動作させようとしているアプリケーション(サーバー)の用途目的などに即して最適なやり方を考えれば良いのでしょう。
ちなみに独自のプロトコル(で利用するポート)は IANA に登録することで公告され、他のプログラムが利用を避けるように情報提供することは可能です。ただそれを尊重するかどうかは別の話なので、登録したからそのポートを排他的に利用できるわけではありません。
【以下、拙の認識]】
ネットワークポートについての基本的な情報ありがとうございます。(当質問と別な話になっておりますが特に異論ございません)
【以下、Hebikuzure aka Murachi Akira さま 引用]】
大元の質問に戻れば、結局利用したいポートが利用できなかった場合に、どのような動作になるようアプリケーション(サーバー)を実装されたいのでしょうか?
【拙の大元の質問]】
利用したいポートが、別サービスによって利用できなかった場合、 『プロトコル ポート除外範囲』『[netsh int ipv4 show excludedportrange tcp で確認可]』 除外範囲を設定しているサービス(ソフトやWindows設定 など)をどう特定し、除外範囲をどう解除するのか?という質問です。
Hebikuzure aka Murachi Akira さま のコメントにあるように、『どのような動作になるようアプリケーション(サーバー)を実装』したいかは次のステップの話になります(その場合は別レスを立てますのでよろしくお願いいたします)
Hebikuzure aka Murachi Akira さま のように、『ポートは保証されない』との一般認識が強いようでそれを前提にしたコメントが今回多い様に思います。(ご返信いただいた、チャブーン さま は途中からご理解いただいたように思うのですが)(拙もこの問題を考えるまで同程度の知識しかありませんでした)
拙の質問、説明がいたらないせいなので誤解させてしまっているようですが、事前にポート保証(確保という表現が適切なのかな?)する機構をご確認(netsh int ipv4 show excludedportrange tcp など)のうえ、当レスを再読しご返信いただければ幸いです。 -
チャブーンです。
この件ですが、質問者さんへの「直接の回答」は、おそらくダンプファイルを取得して、中身を解析するしかない、ように思います。事前の設定ファイル類はわからないので、オンメモリの中身をみるしかない、のではないでしょうか。この方向に倒したいのならば、USフォーラムに聞いても意味がないので、ご自身でMS有償サポートにお問い合わせください。
それと2点コメントですが、
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 1024
ポート数 : 64511
とあります。(チャブーン さまはどのようにWindowsの一時ポートは49152~とご確認されたのでしょうか?)
*一般的には49152~と言われていましたがどうなんでしょう?拙の近辺のPCが特殊なのでしょうかね?この設定は、Windows 10の標準の設定ではないです。明らかに修正が入り「Windows XP以前の設定」に塗り替えられています。ご自身でコマンドから行われたのか、外部プログラムがそう設定したのはわかりません。基本的にはWindows Vista以降のOSの一時ポートは49152以降がデフォルトです。
したがって質問者さんの最初の不安点である、
*特に、
1689~1788
1789~1888
の値が微妙に変動するため、ほかのアプリといつか競合するのではないかと気になっています。については、一時ポート範囲を「デフォルトに戻すことによって」そこにはポート予約は割り当てられなくなりますので、問題は解消されると思います。
もう1点は、この設定(99個ずつの予約)は「インストール直後のWindowsには存在しない」という点です。なんらかのWindows内梱のUWPアプリを使用し始めるといったことで、状況変化で設定される可能性もあるでしょうが、ここはほぼ正しいと思います。
ですから、現状利用の状態から「msconfig」を起動し、「クリーンブート」状態で起動し、予約ポートが有効になっていないことを確認したうえ、スタートアップのアプリケーションを1つずつ追加していく、という地道な作業をすれば、特定できる可能性はあるでしょう。
もっとも、私であれば「一時ポートを49152以降に設定する」時点で、問題解決はできるので、それ以上の深追いは手間がかかりすぎるので、やらないと思います。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
- 編集済み チャブーンMVP 2019年8月7日 3:52
-
チャブーン さま
貴重な情報とご感想ありがとうございます。
無知な拙にはわからなくても、無料とはいえフォーラムですぐに情報が得られる案件と思っていました。
*『ダンプファイルの中身を解析したり、MS有償サポートにお問い合わせ』するほどの案件と思っていませんでした。
*実際問題、『ダンプファイルの中身を解析したり、MS有償サポートにお問い合わせ』することは難しいので、引き続き調査・詳しい方からの情報収集をしたいと思います。
動的ポートの範囲の件につきまして、Windows Vista以降のOSについての情報は、チャブーンさまにご提示いただいたサイトとは違えど拙も確認し承知していました。そのうえで自身のPC及び周りのPC(Windows10、7、WindowsServer2012)を確認したところ規定値と違ったのでチャブーンさまのPCは実際のところどうなのかと思い伺った次第です。
*Microsoftが公開されている規定値と実際の値が異なるのは珍しくないので今回もそうなのかと思った次第です。(どういったタイミングで規定値が変えられるのか気になりますがコメントし始めるとまた本題から外れそうなので割愛します)
しかし、拙の不安点は動的一時ポートの件とはまったく無関係(『まったく』は言い過ぎですが影響は極めて小さい)ですので、この設定を「デフォルトに戻すことによって」解決することはありません。(当質問を再度お読みくださればご理解いただけるかと思います)
「インストール直後のWindowsには存在しない」という点、拙も同意見です(だからこそ簡単に調べる方法を詳しい方に質問した次第です)
「msconfig」を利用する方法はまだ試していませんが有効な手段だと思います。(今後有効な情報が得られなかった場合、まとまった時間が取れた際に試そうと思います)
再度申し上げると、チャブーンさまは「一時ポートを49152以降に設定する」時点で、問題解決はできると考えているようですが、拙はそう思えません(当質問を再度お読みください)
調査に『手間がかかりすぎる』は同意見ですが、大きな問題なったときに備えて余裕のある今のうちに知見を蓄えておこうとしている次第です。 -
チャブーンです。
この件については、深く立ち入りません。
一時ポートを変えればおそらく直る、の根拠ですが、私の環境でも似た状況(管理されていない予約ポートが99個単位で複数設定されている)を確認したからです。この環境は49152以降の一時ポートの環境で、かつ「49685-49784」が最も若い複数の99個単位の未管理予約ポートがある環境でした。
未管理の予約ポートをなんのアプリが指示しいているかは知りませんが、おそらく設定された一時ポートの比較的若い番号から自動的に設定していく状況なのではないか、と思い、コメントした次第です。
私のコメントに対して(正しいかどうかを含め)、確認いただくのは、一般的には質問者さん側でお願いする建て付けです。少なくともこの設定に関しては、質問者さん側で対応できる話しかと思います。100%納得しなければ手を動かしたくない、ということなら、それはそれで了解しましたので、ご自身の責任で情報収集と解決を図っていただければと思います。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
> 除外範囲を設定しているサービス(ソフトやWindows設定 など)をどう特定し、除外範囲をどう解除するのか?
そもそも他のアプリケーションなりサービスなりが何らかの理由で除外指定しているものを勝手に解除することができるとも思えませんし、仮にできるとしてもやるべきではない(当然そのことによって除外を指定したアプリケーションやサービスの動作に支障が出る可能性がある)ですね。
そのようなウイルス/マルウエアまがいの動作をさせたいという話に付き合うつもりも義務もありません。やりたいのであれば自分で調べて何とかしてください。
Hebikuzure aka Murachi Akira
-
Hebikuzure aka Murachi Akira さま
ご感想ありがとうございます。
Hebikuzure aka Murachi Akira さまへのご感想に関しての情報を提供します。
【以下、Hebikuzure aka Murachi Akira さま 引用]】
そもそも他のアプリケーションなりサービスなりが何らかの理由で除外指定しているものを勝手に解除することができるとも思えませんし
【以下、拙の知識]】
解除は、
方法①:コマンド『netsh int ipv4 delete excludedportrange』
方法②:ポート除外範囲を設定しているソフト・サービス 等を停止する
で可能です
*詳しい方はほかの方法をご存じかもしれません(ご存じの方はご連絡ください)
【以下、Hebikuzure aka Murachi Akira さま 引用]】
仮にできるとしてもやるべきではない
【以下、拙の認識]】
それはPC利用者(もしくはシステム管理者)が決めることです。(考慮したうえで不必要とされるソフト、サービスを停止するのは至極当然)
【以下、Hebikuzure aka Murachi Akira さま 引用]】
当然そのことによって除外を指定したアプリケーションやサービスの動作に支障が出る可能性がある
【以下、拙の認識]】
支障をきたすかどうか、これもPC利用者(もしくはシステム管理者)が決めることです。
【以下、Hebikuzure aka Murachi Akira さま 引用]】
そのようなウイルス/マルウエアまがいの動作をさせたい
【以下、拙の返答]】
本質問が、『ウイルス/マルウエアまがいの動作』に当たるとは全く思えません(無知からくる誤解のように思います)
【以下、Hebikuzure aka Murachi Akira さま 引用]】
話に付き合うつもりも義務もありません
【以下、拙の返答]】
質問という形で当レスを立ち上げましたが、Hebikuzure aka Murachi Akira さま 個人にご依頼かけたつもりはございませんので、お付き合い頂かなくて大丈夫です。(当然、Hebikuzure aka Murachi Akira さま にはそのような義務はありません)
【以下、Hebikuzure aka Murachi Akira さま 引用]】
やりたいのであれば自分で調べて何とかしてください。
【以下、拙の返答]】
自分でも調べますが、Hebikuzure aka Murachi Akira さま 以外の方のお力を借りつつ、薄い情報のひけらかし・感情論によるコメント etc. に惑わされないで解決していければと思います。
- 編集済み KOMA 2019年8月8日 5:04 誤字修正
-
チャブーン さま
貴重な情報とご感想ありがとうございます。
チャブーン さま がご確認された、「49685-49784」複数の99個単位 のポートは、2019年8月2日 Yamauchi Kazuo さまに情報提供いただいたものと多分(99%)同じのようですね。
チャブーン さま は、未管理の予約ポートをなんのアプリが指示しいているかは知らないようなのでお教えしますが 『Hyper-Vホストコンピューティングサービス』だと思います。(強制は一切しませんが機会があればサービスを停止して再起動後再度ご確認してみてください一度)
100%納得しなければ手を動かしたくない、とのコメントの趣旨が拙には理解しかねますが、『ご自身の責任で情報収集と解決を図って』というのは言わずもどがなことなのでそうさせていただきます。フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
-
Yamauchi Kazuo さま
2019年8月2日 にご返信いただいた情報を読み返し再検証してみました。
その結果、除外ポート
1689~1788
1789~1888
を設定しているのは『Hyper-Vホストコンピューティングサービス』でした。
*Yamauchi Kazuo さま の情報をスルーしてしまったのは、拙のPCが以前別の問題で『Hyper-Vサービス』を無効にしていたので関係ないと判断したためでした。(いつの間にかサービスが開始設定になっていました(おそらくWindowsUpdate時だと思われます))
*Yamauchi Kazuo さま がご指摘のように拙のPCの動的ポート範囲設定がYamauchi Kazuo さま と異なっていたのが番号の違いとなっていたようです。(いいわけですが、この番号の違いからもこの情報をスルーしてしまいました(Yamauchi Kazuo さま 申し訳ないです))されど、動的ポート範囲設定を変更した覚えがないのにこの値になっているのが引っかかります。(Windows10の新規インストールとアップグレードインストールなどの導入条件の違いが影響しているのでしょうか?不明です)
ただし、Yamauchi Kazuo さま は使用中のポートをバインドしようとしたときの通常のエラーとご指摘いただいたが、やっぱりその時のエラーは
『10048:通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。 』
のはずで、
本件の『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』とは異なるのでは?と疑問が残ります。
また、Yamauchi Kazuo さま は
未使用の49696-49795、49796-49895、50000-50059の範囲にあるポートは、固定ポートとしてバインドすることが禁止されることはありません。
とあるが、拙の検証では、『10013:アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 』が発生する。
*これも何かしらの環境の違いなのか?(検証ソフトのバインドオプションの違いか?)は今だ不明です。
今までの調査内容(判ったこと)まとめ
①:TCPポートの除外範囲は 『netstat』 では確認できない *ただし、『netsh int ipv4 show excludedportrange tcp』で確認可
②:TCPポートの除外範囲を設定しているソフト・サービスを簡単に特定する手段は(今のところ)ない
③:TCPポートの除外範囲のポートにバインド(ソケットオープン)をかけると失敗するPC(質問者のPC)と成功するPC(返答者のPC)がある
④:Windows10の動的ポートの範囲は通常Port:49152~ 16384個 近位だが、PC(質問者のPCのように)によってPort:1024~ 64511個 etc など 異なる場合がある *『netsh int ipv4 show dynamicport tcp』 で確認可
⑤:『Hyper-Vホストコンピューティングサービス』 は、TCPポートの除外範囲を200個程度使用(設定?)する(PCの動的ポート範囲設定、およびOSの起動の毎に値が変わる)
⑥:『Hyper-Vホストコンピューティングサービス』 は無効にしても(WindowsUpdate等?)再設定(実行)される場合がある
②に関しては引き続き調査しようと思います(ご存じの方がいれば是非ご連絡ください)- 回答としてマーク KOMA 2019年8月8日 6:20
-
追加の調査内容(判ったこと)まとめ
⑦:TCPポートの除外範囲は動的ポートから除外させるものと、固定オープン(バインド)も禁止させるものがある。
設定(解除)方法として、
動的ポートから除外させる:コマンド、netsh int ipv4 add excludedportrange
固定オープンも禁止させる:IPHLPAPI.DLL から、CreatePersistentTcpPortReservationをロード実行
解除方法として、
コマンド、netsh int ipv4 delete excludedportrange
IPHLPAPI.DLL から、DeletePersistentTcpPortReservationロード実行
があげられる。
(一時設定オプションを立てずに)設定したTCPポートの除外範囲は設定したモジュールを停止しても、OSを再起動しても解除するまで設定が消えないことから注意が必要- 回答としてマーク KOMA 2019年8月13日 1:07