リモート コンピュータが認識しない限り、どのポートが開いているかを知る方法はありません。しかし、ポート上で実行されているプログラムが認識しなくても (つまり、プログラムに干渉することなく) 情報を判別できます。
SYN スキャンを使用します。
接続を確立するために、TCP はスリーウェイ ハンドシェイクを使用します。これを悪用して、プログラムが知らないうちにポートが開いているかどうかを調べることができます。
ハンドシェイクは次のように機能します。
- クライアントは、SYN をサーバーに送信することにより、アクティブなオープンを実行します。
- サーバーは SYN-ACK で応答します。
- 通常、クライアントはサーバーに ACK を返します。しかし、このステップはスキップされます。
SYN スキャンは、TCP スキャンの最も一般的な形式です。ポート スキャナは、オペレーティング システムのネットワーク機能を使用するのではなく、生の IP パケット自体を生成し、応答を監視します。このスキャン タイプは、実際には完全な TCP 接続を開かないため、「ハーフ オープン スキャン」とも呼ばれます。ポート スキャナーは SYN パケットを生成します。ターゲット ポートが開いている場合は、SYN-ACK パケットで応答します。スキャナ ホストは RST パケットで応答し、ハンドシェイクが完了する前に接続を閉じます。
raw ネットワークの使用にはいくつかの利点があり、送信されたパケットと応答のタイムアウトをスキャナが完全に制御できるようになり、応答の詳細なレポートが可能になります。どちらのスキャンがターゲット ホストへの影響が少ないかについては議論があります。SYN スキャンには、個々のサービスが実際には接続を受信しないという利点がありますが、一部のサービスは接続スキャンでクラッシュする可能性があります。ただし、ハンドシェーク中の RST は、一部のネットワーク スタック、特にプリンターなどの単純なデバイスで問題を引き起こす可能性があります。どちらにしても決定的な議論はありません。
ソースウィキペディア
後述するように、 nmapは SYN スキャンを実行できると思います。
TCP ポート スキャンにソケットを使用する:
どのポートが開いているかを判断する 1 つの方法は、そのポートへのソケットを開くことです。または、あなたが言及したように、あなたのための情報を見つける別のポートに。
たとえば、コマンド プロンプトまたはターミナルから:
telnet google.com 80
UDP ポートのスキャン:
開いていないポートに UDP パケットが送信されると、システムは ICMP ポート到達不能メッセージで応答します。このメソッドを使用して、ポートが開いているか閉じているかを判断できます。しかし、受信プログラムは知っています。