※当サイトの記事には、広告・プロモーションが含まれます。

Windows Server 2016でポートの80番が奪われた話。ポート番号の確認には気を付けよう

f:id:ts0818:20200627111307j:plain

港湾(こうわん、Port)とは、古くは(とまり)などから発展した港・(みなと)であり、島嶼などの天然の地勢や防波堤などの人工構造物によって風浪を防いで、船舶が安全に停泊し人の乗降や荷役が行なえる海域と陸地を指す

港湾 - Wikipedia

⇧ 「Port」は「湊(みなと)」で、「みなと」と言えば、Spitz の名曲「みなと」が有名ですね、どうもボクです。

そんな「Port」ですが、コンピューターの世界では、

なんかがありますが、今回は「ポート (コンピュータネットワーク) 」の話。

コンピュータネットワークにおいて、ポートport)とは、オペレーティングシステムデータ通信を行うためのエンドポイントである。「ポート」という言葉はハードウェア(入出力ポート)についても用いるが、ソフトウェアにおける「ポート」は、特定のプロセスやサービスの種類によって特定される論理的な構成概念である。

ポート (コンピュータネットワーク) - Wikipedia

ポートはホストIPアドレスおよび通信プロトコルの種類(プロトコル番号一覧)と密接に関係しており、この3つで通信セッションの送信元と宛先が決定する。

ポート (コンピュータネットワーク) - Wikipedia

ポートはIPアドレスプロトコルごとに16ビットの数値によって特定され、この数値のことをポート番号(port number)という。

ポート (コンピュータネットワーク) - Wikipedia

IPアドレスを建物の住所にたとえるなら、ポートは個別の部屋、ポート番号は部屋番号に相当する。

ポート (コンピュータネットワーク) - Wikipedia

⇧ そんなわけで、まぁ、突然、部屋に入れなくなったら、どう思いますか?

悲しい気持ちになりませんか?

というわけで、ポートについて、レッツトライ~。 

 

何が起きたか?

Windows Server 2016 に、某アプリケーションをインストールしていて、そのアプリケーションのWebサーバが、Apache  Httpd で 80番ポートを利用していたわけです。

で、3か月ぐらい何事もなくアクセスできたわけですが、先日、突然動かないと言われ、調べてみたところ、アプリケーションのWindows サービスが起動できなくなっていて、サービスを起動しようとすると『サービスの製造元に問い合わせてください』みたいな警告が出るというね。

って言うか、この警告からポートがバッティングしてるなんて読み取れんから...

流石、Microsoftさん、相変わらずの不親切さ。

結論から先に言ってしまうと、「IIS(Internet Information Services)」の「World Wide Web Publishing Service(自分の環境では「World Wide Web 発行サービス」と表示されていた)」が、有効になってしまっていたことによる影響らしい。

おそらく、Microsoft Update の影響とは思いますが。

 

なので、自分の場合のケースだと、Windowsの「サービス」で「IIS(Internet Information Services)」の「World Wide Web Publishing Service(自分の環境では「World Wide Web 発行サービス」にあたる「サービス」を停止すれば、80番ポートを取り戻せました。

 

80番ポートを使ってるプロセスを探せ

ってなわけで、80番ポートを使ってるプロセスを確認するために、コマンドプロンプトを起動して、

netstat -nao    

⇧ で、「PID」が特定できたんだけど、

qiita.com

⇧ ってことらしいんだけど、「タスクマネージャー」で該当する「PID」のプロセスは何なのか調べてみたら、「System(NT kernel & system)」ってものらしく、

nt-daiary.blog.ss-blog.jp

タスクマネージャーで見ると、NT Kernel & systemとある。これはネットで検索すると、Windowsのシステムそのものだという。さて困った。正体がわからない。

NT kernel & system で悩む:気まぐれ日記:SSブログ

⇧「Windowsのシステムそのもの」ってことで、「IIS(Internet Information Services)」なんて情報はどこにも出てこない。

で、「Process Explorer」ってものをダウンロードしてみました、って言うかMicrosoftで紹介されているツールらしい。

docs.microsoft.com

 

で、「Process Explorer」を使ってみたところ、プロセスとしては、

  • Interrupts(Hardware Interrupts and DPCs)
  • smss.exe(Sessions Manager Subsystem)

っていう2つが表示されたんで、調べてみたところ、 

tooljp.com

⇧「Interrupts」については、「遅延プロシージャ呼び出しと割り込みサービスルーチン」というものらしく、その中で、「smss.exe」ってものも動いてるらしく、

www.windowsfiles.jp

セッション・マネージャ・サブシステムは、Windows2000以降のバージョン下で、ユーザーのスタート、操作、終了セッションに関連した全ての動作を担っています。Windowsログオン(winlogon)及びクライアント/サーバー・ランタイム・サービス(csrss)プロセスを起動します。ターミナルサービス下での、クライアントセッションも処理します。オペレーティングシステムの核となる部分であり、削除すべきではありません。

smss.exe とは?

⇧ こっちでも「IISInternet Information Services)」はヒットせず...

どうやって、「IISInternet Information Services)」に辿り着けたんだ?

 

aspnet.keicode.com

IIS の「アプリケーションプール」というのは、IISウェブアプリケーションの「ワーカープロセス」の設定のことです。 そして「ワーカープロセス」というのは、そのウェブアプリケーションが実行されるプロセスのことです。

IIS のアプリケーションプールとは? - ASP.NET の仕組み - ASP.NET 入門

IIS 本体のプロセスと、アプリケーションを動かすためのプロセスを分けることによって、IIS 本体がユーザーが作ったアプリケーションの影響を極力受けないように配慮されているのです。

IIS のアプリケーションプールとは? - ASP.NET の仕組み - ASP.NET 入門

ワーカープロセスの名前は w3wp.exe といいます。一方、IIS 本体のサービスは svchost.exe というプロセス名です。

IIS のアプリケーションプールとは? - ASP.NET の仕組み - ASP.NET 入門

ちなみに、この svchost.exe というプロセスは Windows で各種サービスをホストするための汎用プロセスです。 従って svchost.exe という名前でホストされているサービスは多数ありますので、svchost.exe というプロセスが見えたからと言って、 IIS ではありませんので注意してください。

IIS のアプリケーションプールとは? - ASP.NET の仕組み - ASP.NET 入門

⇧ よく分からんのだけど、「w3wp.exe」ってやつが「IIS」に関連しているのだと。

「w3wp.exe」ってのは、「WAS(Windows Activation Services)」 の1構成要素らしい。

docs.microsoft.com

WAS は、複数のアーキテクチャ コンポーネントで構成されます。

  • リスナー アダプター : 特定のネットワーク プロトコルでメッセージを受信し、WAS と通信して、受信メッセージを適切なワーカー プロセスにルーティングする Windows サービス。

  • WAS : ワーカー プロセスの作成と有効期間を管理する Windows サービス。

  • 汎用ワーカー プロセス実行可能ファイル (w3wp.exe)。

  • アプリケーション マネージャー : ワーカー プロセス内のアプリケーションをホストするアプリケーション ドメインの作成と有効期間を管理します。

  • プロトコル ハンドラー : ワーカー プロセスで実行され、ワーカー プロセスと個々のリスナー アダプター間の通信を管理するプロトコル固有のコンポーネント プロトコル ハンドラーには、プロセス プロトコル ハンドラーと AppDomain プロトコル ハンドラーの 2 種類があります。

WAS アクティベーション アーキテクチャ - WCF | Microsoft Docs

⇧ ってことらしく、

ワーカー プロセス インスタンスをアクティブ化する場合、WAS は必要なプロセス プロトコル ハンドラーをワーカー プロセスに読み込み、アプリケーション マネージャーを使用して、アプリケーションをホストするアプリケーション ドメインを作成します。 アプリケーション ドメインは、アプリケーションのコードと、アプリケーションが使用するネットワーク プロトコルに必要な AppDomain プロトコル ハンドラーを読み込みます。

f:id:ts0818:20200626220216p:plain

WAS アクティベーション アーキテクチャ - WCF | Microsoft Docs

⇧ ってな感じで、ポートに関する情報が出てこず...

そもそも「WAS(Windows Activation Services)」って何?

Windows Process Activation Service (also known as WAS) is the process activation mechanism introduced within Internet Information Services v7.0.

Windows Activation Services - Wikipedia

⇧ ってな感じで、「IISInternet Information Services)」のバージョン7 で導入された「process activation mechanism」ってものらしい、サッパリ分からんですな。

「process activation mechanism」が何なのかは全く説明が無いというね、流石、Microsoftさん、安定の不親切さ。

 

Windows Activation Service allows the developers to choose the most appropriate protocol for their needs. For HTTP, data transfer relies on the ASP.NET HTTP. For protocols such as TCP and Named Pipes, Windows Activation Service leverages the extensibility points of ASP.NET for transferring data.

Windows Activation Services - Wikipedia

⇧ 『HTTPの場合、データ転送はASP.NET HTTPに依存します。 TCPや名前付きパイプなどのプロトコルの場合、Windows Activation ServiceはASP.NETの拡張ポイントを利用してデータを転送します。』ってことらしく、

 

These capabilities are implemented in the form of protocol handlers, which manage communication between the worker process and the Windows service. There are two types of protocol handlers loaded when the WAS activates a worker process instance: Process Protocol Handler (PPH) and App Domain Protocol Handler (ADPH).

Windows Activation Services - Wikipedia

⇧ 『これらの機能は、ワーカープロセスとWindowsサービス間の通信を管理するプロトコルハンドラーの形で実装されます。 WASがワーカープロセスインスタンスをアクティブ化するときに読み込まれるプロトコルハンドラーには、プロセスプロトコルハンドラー(PPH)とアプリドメインプロトコルハンドラー(ADPH)の2種類があります。』

だそうな。

  • Process Protocol Handler (PPH)
  • App Domain Protocol Handler (ADPH)

の2種類があるってはなしなんだけど、

f:id:ts0818:20200626220216p:plain

WAS アクティベーション アーキテクチャ - WCF | Microsoft Docs

Microsoftさんのドキュメントを見る限り、

  • Process Protocol Handler (PPH)
    • HTTP PPH
    • net.tcp PPH
  • App Domain Protocol Handler (ADPH)

プロトコルハンドラーが存在するってことですかね?

 

Oreillyさんの「WCF」ってアーキテクチャの説明だと、

www.oreilly.com

プロトコルハンドラーの数が違うんだけどね...

いや~、カオスですな、まぁ、Microsoftさんが本家ということもあり、Microsoftさんのドキュメントが間違ってるわけはないと思うので、Oreillyさんのほうが間違っているということになるかと。

 

で、「WCF」って何? 

docs.microsoft.com

Windows Communication Foundation (WCF) は、サービス指向アプリケーションを構築するためのフレームワークです。 WCF を使用すると、サービスエンドポイント間で非同期メッセージとしてデータを送信できます。 

サービス エンドポイントには、IIS でホストされている、継続的に使用可能なサービスの一部を使用したり、アプリケーションでホストされているサービスを使用できます。 エンドポイントには、サービス エンドポイントからデータを要求するサービスのクライアントを使用できます。

 メッセージは XML として送信された 1 文字または 1 語の簡単なものでも、バイナリ データのストリームのような複雑なものでも構いません。

Windows Communication Foundation とは - WCF | Microsoft Docs

⇧ 「サービス指向アプリケーションを構築するフレームワーク」ということらしい。

qiita.com

サービス指向の先駆けは SOAP ですかね。そして REST もサービス指向のお仲間でしょう。WCFSOAP をベースとしてマイクロさんが持つ様々な分散テクノロジーの集合体となっています。

WCFのキホン vol.1 - Qiita

⇧ 「サービス指向」は「SOAP」とか「REST」のことらしい。

マイクロサービス化されたアプリケーションのほとんどは、「サービス指向」と言えるってことですかね?

 

一旦、ここまでをまとめると、

  • IIS の「アプリケーションプール」というのは、IISウェブアプリケーションの「ワーカープロセス」の設定のこと
  • 「ワーカープロセス」というのは、そのウェブアプリケーションが実行されるプロセスのこと
  • IIS(Internet Information Services)のワーカープロセスは「w3wp.exe」
  • IIS(Internet Information Services) 本体のサービスは svchost.exe というプロセス名
  • svchost.exe というプロセスは Windows で各種サービスをホストするための汎用プロセス(svchost.exe という名前でホストされているサービスは多数あるため、svchost.exe によるプロセス特定は無意味)
  • 「w3wp.exe」ってのは、「WAS(Windows Activation Services)」 の1構成要素
  • Windows Process Activation Service (also known as WAS) is the process activation mechanism introduced within Internet Information Services v7.0.
  • 「WAS(Windows Activation Services)」は「WCFWindows Communication Foundation)」の機能の一部
  • WCFWindows Communication Foundation)」は「サービス指向アプリケーションを構築するためのフレームワーク
  • 「WAS(Windows Activation Services)」はワーカープロセスである「w3wp.exe」をアクティブ化する(実行するってことかと)
  • 「w3wp.exe」内の各々のプロトコルハンドラーがWindowsサービス間の通信を管理する

ってことですと。

 

ちなみに、「IISInternet Information Services)」のバージョン7 の構成は、

social.msdn.microsoft.com

IIS がリクエストを処理する流れについて

それでは、クライアントからの要求がどのようにコンポーネントを通って処理され、応答が返るのかを簡単に説明します。

f:id:ts0818:20200627090459p:plain

https://social.msdn.microsoft.com/Forums/SECURITY/ro-RO/361e9953-742a-4418-a2fb-e8112fafa319/iis-70-windows-server-2008-?forum=iissupportteamja

⇧ 上図のような感じらしいですと。

処理の流れは、 

  1. HTTP要求がクライアントブラウザからサーバーへ到着します。HTTP.sys が要求を受け取ります。
  2. HTTP.sys が要求の送信先アプリケーションの構成情報が登録されているか確認をし、登録されていなかった場合は、HTTP.sys は W3SVC に問い合わせを行います。
  3. W3SVC は、WAS へ要求を渡します。
  4. WASは、IIS のサーバーレベルの構成情報である、applicationHost.config を構成ストアから取得します。
  5. WASは、要求されたアプリケーションプール内のワーカープロセスを確認します。ワーカープロセスが存在しない場合は、そのアプリケーションプール用のワーカープロセスを起動します。
  6. WASより、アプリケーションプールの情報や構成情報を W3SVC に渡します。
  7. W3SVC は、WASから受け取った構成情報に基づき、HTTP.sys へ設定および更新の通知をします。
  8. HTTP.sysは、その通知を基に、アプリケーション用のキューを作成してから、適切なワーカープロセスに要求を転送します。
  9. 要求を受け取ったワーカープロセスは、要求処理を開始します。
  10. 要求処理パイプラインのそれぞれの処理を行い、ワーカープロセスは、要求の処理結果を HTTP.sys へ返します。
  11. HTTP.sys がクライアントに応答を送信します。

https://social.msdn.microsoft.com/Forums/SECURITY/ro-RO/361e9953-742a-4418-a2fb-e8112fafa319/iis-70-windows-server-2008-?forum=iissupportteamja

⇧ ってな具合になるらしい。

 

さて、困った。

一向に「IISInternet Information Services)」の「World Wide Web Publishing Service(自分の環境では「World Wide Web 発行サービス」と表示されていた)」が、80番ポートのプロセスとして確認できなかった理由が分からない。

 

Microsoftさんのコミュニティで質問させていただきました。

answers.microsoft.com

■私の質問

つまり、「タスクマネージャー」や「ProcessExplorer」では80番を使用しているプロセスとして辿るのが困難であり、

curl」コマンドなどを使って、アプリケーション(自分の場合ですとApache Httpd上で動いていたもの)のURLに

アクセスして、

IIS

Apache Httpd

のどちらが機能しているか確認するぐらいしか

確認方法がないという感じでしょうか?

https://answers.microsoft.com/ja-jp/windows/forum/windows_other-update/systempid4%E3%81%AB%E3%81%A6%E3%83%9D%E3%83%BC/e349b52d-6bb3-44f4-8ed1-357850ad85f4?tm=1593174744191&rtAction=1593215943376

有識者の方からの回答 

そうなります。IISでの80番ポートの待ち受けは、カーネルモードのデバイスドライバでやっています。80番ポートにアクセスがあると、そのドライバからコールバックされる形で、World Wide Web Publishing Serviceなどのsvchost.exeで動作しているサービスやw3wp.exeなどのASP.NETなどの関連アプリケーションサーバが処理している形になります。ポートの待ち受けをしているプロセスと、実際にサービスを提供しているプロセスが異なるのです。

https://answers.microsoft.com/ja-jp/windows/forum/windows_other-update/systempid4%E3%81%AB%E3%81%A6%E3%83%9D%E3%83%BC/e349b52d-6bb3-44f4-8ed1-357850ad85f4?tm=1593174744191&rtAction=1593215943376

IISではなく、Apacheを使っている場合にはApacheのサービスのデーモンプロセスが80番ポートの待ち受けをしていますので確認できます。

https://answers.microsoft.com/ja-jp/windows/forum/windows_other-update/systempid4%E3%81%AB%E3%81%A6%E3%83%9D%E3%83%BC/e349b52d-6bb3-44f4-8ed1-357850ad85f4?tm=1593174744191&rtAction=1593215943376

ワーカープロセスというのは、あらかじめ起動してアイドル状態にして管理されているプロセスのことです。プロセスを起動するためにメモリやプロセス管理情報を構築するのに時間がかかるために、あらかじめ起動しておいたプロセス/スレッドをアイドル状態にして複数プールしておいて、セッション要求があった時点で、アイドル状態のプロセスにジョブを割り当てています。

https://answers.microsoft.com/ja-jp/windows/forum/windows_other-update/systempid4%E3%81%AB%E3%81%A6%E3%83%9D%E3%83%BC/e349b52d-6bb3-44f4-8ed1-357850ad85f4?tm=1593174744191&rtAction=1593215943376

⇧ むっちゃ丁寧に教えていただきました、本当にありがたいことです。

職場にもこんな先輩がいてくれたら、楽しく仕事ができるような気がしますね。

 

というわけで、ポート80番を使っているプロセスを確認する際に、「タスクマネージャー」や「Process Explorer」では、確認できないプロセスもあることを知っておくと、時間を無駄にせずに済むかもしれませんというお話。

 

今回はこのへんで。