このツールが試すもの
現代のウェブ開発やネットワーク管理において,手軽にポートの状態を確認したいというニーズは根強く存在します.本ツールは,専用のソフトウェアをインストールすることなく,日常的に利用しているウェブブラウザ上でポートの簡易確認を実行する機能を提供します.ただし,本ツールが実行しているのは,ネットワークスタックの深層にアクセスするTCPスキャンではありません.
ブラウザの仕様上,JavaScriptから直接生のTCPソケットを操作したり,SYNパケットを送信したりすることは不可能です.そのため,本ツールではブラウザ標準の非同期通信インターフェースであるFetch APIを利用し,指定されたホストとポートの組み合わせに対してHTTPリクエストを試行するという代替的なアプローチを採用しています.
具体的には,入力されたホスト(URLスキームやパス,ポート番号の追記は受け付けず,IPv6アドレスはブラウザのURL機構で正規化されます)に対し,http://対象ホスト:対象ポートという形式でブラウザから通信を発生させます.これにより,バックグラウンドで稼働しているサービスが何らかの応答を返すか,あるいは通信が届かずにタイムアウトするかを観測します.
このアプローチは,ウェブサーバー以外のサービス(例えばデータベースやSSHなど)に対してもHTTPリクエストを送りつける形となりますが,相手側のアプリケーションがHTTPリクエストをどのように処理または破棄するかによって生じる挙動の違いを観察することが目的です.
ただし,ブラウザによる送信前の段階で通信が拒否される場合もあり,本ツールが提供するのは,あくまでブラウザからのHTTP接続試行に対する応答の有無という側面からの参考情報であり,ポートの開閉状態を技術的に確定させるものではないという前提を理解して利用する必要があります.
Fetchとopaque response
ブラウザからのHTTP接続試行において中心的な役割を果たすのが,Fetch APIにおけるmode: "no-cors"という設定です.通常,ブラウザは同一生成元ポリシー(Same-Origin Policy)に従い,異なるドメインやポートに対する通信を厳密に制限し,Cross-Origin Resource Sharing (CORS)の適切なヘッダーがない場合はリクエストの失敗を返します.
しかし,mode: "no-cors"では利用できるメソッドやヘッダーが制限され,取得できたcross-origin responseはopaqueになります.ただし,Mixed Contentやローカルネットワークアクセス制限等によって,リクエスト自体がブラウザで阻止される場合もあります.
この際,レスポンスは「opaque response(不透明な応答)」という特殊な形式としてJavaScript側に返却されます.opaque responseの最大の特徴は,ステータスコード,レスポンスヘッダー,そしてレスポンスボディの中身をJavaScriptから一切読み取ることができないという点にあります.
つまり,対象のポートで稼働しているサービスが正常な200 OKを返したのか,404 Not Foundを返したのか,あるいは500 Internal Server Errorを返したのかを区別することは仕様上不可能です.対象がHTTPとして解釈できる応答を返さない場合は,プロトコル不一致や接続切断などによりfetchがネットワークエラーとして終了することがあります.
この終了方法だけから,背後で動くサービスの種類やポートの開閉を逆算することはできません.本ツールは,このopaque responseの中身を解析するのではなく,「fetchの非同期処理が解決(resolve)された」あるいは「何らかのネットワークエラーで拒否(reject)された」という事実そのものを観測対象としています.
この制約があるからこそ,本ツールはサービスの種類を特定したり,応答のシグネチャを分析したりすることはできず,純粋にfetch Promiseがどのように終了したかを記録する仕組みであり,通信の到達そのものも確定しません.
結果二分類
本ツールの判定ロジックは,通信結果を非常にシンプルな「二分類」に集約して表示する設計となっています.具体的には,「fetch処理が完了したか,あるいはタイムアウト以外の理由で終了した状態」と,「1秒経過によって意図的に通信が中断された状態」の二つです.ツールは各ポートへのfetchリクエストを開始する際,同時にAbortControllerを利用して1秒(1000ミリ秒)のタイマーをセットします.
もし対象のポートが存在しない,ルーティングが設定されていない,あるいはパケットを単純に破棄(ドロップ)する設定になっている場合,ブラウザからの通信は応答を待ち続け,最終的に1秒が経過した時点でAbortControllerによって強制的にタイムアウトとして処理されます.
この場合,ツールは「1秒でタイムアウト」という分類を画面に表示します.一方で,対象のポートで何らかのプロセスが稼働しており,TCPコネクションが成立してHTTPリクエストを受け付けた場合,(たとえそれがエラー応答であっても)即座にレスポンスが返されるか,あるいはプロトコルの不一致によってコネクションが切断されます.
また,OSやネットワーク機器が明示的に通信を拒否するRSTパケットなどを返した場合や,ブラウザが送信前に通信を拒否した場合も,1秒を待たずに即座にネットワークエラーとして処理が終了します.本ツールではPromiseの解決(resolve)とAbortError以外の拒否を同じ区分として集約するため,これらの「タイムアウトする前に何らかの形で処理が終わった」ケースをすべてまとめて扱い,結果から開閉状態を確定的に判定することはできません.
この二分類は,ポートが開いているか閉じているかという単純な二元論ではなく,あくまでブラウザのタイマー設定時間内に通信の決着がついたかどうかを示す指標に過ぎません.
ブラウザ制約
ブラウザを用いたローカルポート確認において最も理解が必要なのは,ブラウザ固有のセキュリティ機構やネットワーク制約が結果に多大な影響を及ぼすという事実です.まず,近年導入が進んでいるLocal/Private Network Access(Private Network Access: PNA)の仕様により,パブリックなウェブサイトからローカルネットワーク(127.0.0.1や192.168.x.xなど)に対するリクエストは,ブラウザレベルで厳しく制限または事前確認の対象となる傾向があります.
また,本ツールがHTTPSでホストされている場合,対象がHTTP(暗号化なし)のローカルポートであっても,Mixed Content(混在コンテンツ)の制約によってブラウザがリクエストの送信自体をブロックすることがあります.さらに,一部のブラウザ拡張機能(広告ブロッカーやプライバシー保護ツール)や,PCにインストールされているエンドポイント保護ソフト(アンチウイルスソフト)が,特定のポートへの連続した通信を不審な振る舞いとして検知し,独自の判断で通信を遮断することもあります.
他にも,DNSの解決速度やブラウザ内部のコネクションプールの枯渇など,JavaScriptのコード側からは制御不能な要因が多数存在します.これらの制約により,たとえ対象ポートでサービスが稼働していたとしても,ブラウザ側の送信前拒否や接続エラーによって即座に処理が終了し,正常な応答と同じ「タイムアウト以外の終了」に分類されるケースが起こり得ます.
本ツールを使用する際は,これらのブラウザ特有のノイズや制約が常に介在していることを念頭に置き,得られた結果がネットワークの物理的な状態を直接反映しているわけではないことを考慮して解釈を行う必要があります.
入力と順次実行
本ツールにおけるポート確認の実行プロセスは,ユーザーが指定したポート番号のリストに対して,一つずつ順番に処理を進める直列的なアーキテクチャを採用しています.ホスト入力欄はURLやパス,ポート番号の追記を受け付けず,IPv6はブラウザのURL機構によって正規化されます.
ツールに入力されたポート番号は最大2000文字まで受け付けられ,カンマ区切りの文字列から先頭数値のみの部分的な受理を行わず全体が1から65535の範囲の整数であるかを厳密に検査し,1回の実行につき最大100件まで処理されます(重複したポート番号は保持されます).
処理が開始されると,ツールは各ポートに対して1秒のタイムアウトを要求するfetchリクエストを順次送信し,処理終了後に100ミリ秒の待機時間を挟んで次のポートへ進みますが,実時間や通信の完全な停止が保証されるわけではありません.また,停止ボタン(Stop)が押された場合は実行中のfetchに対してAbortControllerで中断を要求するとともに,世代番号を更新して過去のリクエスト結果が画面に反映されないように制御し,ビジー状態やアンマウント,新規実行開始時の適切なガード機構を備えています.
利用許可と正しい読み方
本ツールを利用する上で最も重要な原則は,通信先となるホストに対する適切な利用許可と,ツールの結果に対する正しい読み方の理解です.ツール上で指定されたIPアドレスやポートに対して,ブラウザはHTTPリクエストの送信を試みますが,ブラウザの制約によって送信前に拒否される場合もあります.
これはシミュレーションではなく実際の通信試行であるため,自身が所有・管理しているPC,あるいはネットワーク管理者から明示的な許可を得たローカル環境のIPアドレスに対してのみ使用しなければなりません.権限のない第三者のサーバーやネットワーク機器に対してこのツールを実行することは,ネットワーク運用ポリシーに反する行為となる可能性があります.
また,結果の読み方についても過信は禁物です.本ツールが表示する「fetch完了」や「タイムアウト」といった情報は,あくまでJavaScriptの実行環境から観測できた事象の記録であり,背後にあるファイアウォールの設定状態や,稼働しているプロセスの具体的な名称,脆弱性の有無などを証明する証拠にはなりません.
特定のサービスが動いているかどうかの当たりをつけるための初期段階の参考情報として活用し,正確な状態を把握する必要がある場合は,サーバー側にログインしてnetstatやssコマンドを実行したり,OS管理下の専門的なネットワーク診断ツールを用いたりするなどの二次的な検証作業を併用することが推奨されます.
本ツールは,ウェブブラウザという日常的なインターフェースを通じて,ローカル環境のネットワーク状況に対する初動の洞察を得るための一つの視点を提供する補助的なユーティリティとして位置づけられます.