TCP および UDP ポートスキャン

NmapBeginner
オンラインで実践に進む

はじめに

TCP および UDP ポートスキャン実験へようこそ。ポートスキャンは、ネットワーク管理者やセキュリティ専門家がコンピュータネットワーク上のアクティブなサービスを発見するために使用する基本的な手法です。ターゲットに対して特定のネットワークパケットを送信し、その応答を分析することで、どのポートが開いているか、閉じているか、あるいはファイアウォールによってフィルタリングされているかを判断できます。

ポートが開いているからといって、必ずしも「脆弱である」とは限りませんが、「到達可能なサービス境界」が存在することを意味します。そのため、ポートスキャンは偵察活動において中心的な役割を果たします。システムがネットワークに対してどのような入り口を公開しているかを特定するのです。

この実験では、ネットワーク探索の業界標準ツールである Nmap(Network Mapper)を使用して、ポートスキャンの低レベルなメカニズムを探ります。信頼性の高い TCP コネクトスキャン、ステルス性の高い TCP SYN スキャン、そしてコネクションレスな UDP ポートスキャンという、3 つの異なるスキャン手法の実行方法を学びます。実践を通じて、ネットワークプロトコルがスキャン用のプローブに対してどのように応答するかを理解しましょう。

TCP コネクトスキャンの実行 (-sT)

このステップでは、TCP コネクトスキャンから始めます。現在の作業ディレクトリは ~/project です。

TCP コネクトスキャンは、最も単純なポートスキャン手法です。オペレーティングシステムの組み込みネットワーク機能を利用して、ターゲットポートとの完全な接続を確立します。つまり、TCP の 3 ウェイ・ハンドシェイクをすべて完了させます。具体的には、SYN パケットを送信し、ターゲットから SYN-ACK パケットを受け取り、最後に ACK パケットを返して接続を確立します。

通常のネットワークスタックを使用するため、概念的にシンプルで信頼性が高いのが特徴です。また、スキャンとは本質的に、プロトコルの設計された挙動に対する制御された対話であるということを再認識させてくれます。

接続を完了させるため、このスキャンは非常に信頼性が高い反面、非常に「ノイズが多い」という欠点もあります。完全な接続が行われるため、ターゲットシステムのアプリケーションログには接続試行がほぼ確実に記録され、管理者にスキャンを検知されやすくなります。

それでは、Nmap を使用して、バックグラウンドで Web サービスが動作しているローカルマシン(localhost)の 8080 ポートに対して TCP コネクトスキャンを実行してみましょう。-sT フラグは Nmap に TCP コネクトメソッドを使用するよう指示し、-p フラグはポート番号を指定します。

ターミナルで以下のコマンドを実行してください。

nmap -sT -p 8080 localhost

コマンドを実行すると、以下のような出力が表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-07 15:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds

出力から、ポート 8080 が open であり、TCP プロトコルを使用していることが明確にわかります。サービスは http-proxy(Nmap のバージョンにより多少異なる場合があります)として識別されており、これはバックグラウンドで実行中の Python HTTP サーバーと一致します。

ステルス SYN スキャンの実行 (-sS)

このステップでは、より高度で一般的に使用される手法である TCP SYN スキャン(「ハーフオープン」スキャンとも呼ばれます)を探ります。

TCP コネクトスキャンとは異なり、SYN スキャンは 3 ウェイ・ハンドシェイクを完了させません。SYN パケット(接続要求)を送信し、応答を待ちます。ターゲットポートが開いている場合、SYN-ACK パケットが返されます。この時点で、接続を完了させるための ACK を送信する代わりに、Nmap は即座に RST(リセット)パケットを送信して、接続が完全に確立される前に切断します。

これが、SYN スキャンが「ハーフオープン」と呼ばれる理由です。ターゲットの TCP 挙動を利用しつつ、接続の完了を最小限に抑えています。

この手法は、多くのアプリケーションが完全に確立された接続のみをログに記録するため、「ステルス性が高い」と見なされます。接続を早期に切断することで、SYN スキャンはアプリケーションレベルのログ記録を回避できることが多いのです。ただし、標準的な OS 機能ではなく生のネットワークパケットを生成する必要があるため、このスキャンには root(sudo)権限が必要です。

それでは、ローカルマシンの同じ 8080 ポートに対して SYN スキャンを実行してみましょう。-sS フラグを使用して SYN スキャンメソッドを指定します。

ターミナルで以下のコマンドを実行してください。

sudo nmap -sS -p 8080 localhost

先ほどのステップと同様の出力が表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-07 15:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000042s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds

結果は同一であり、ポートは依然として open と識別されています。違いは、舞台裏でネットワークパケットがどのようにやり取りされたかという点にあります。SYN スキャンは、その速度とステルス性から、sudo 権限で実行した場合の Nmap のデフォルトスキャンタイプとなっています。

UDP ポートスキャンの実行 (-sU)

最後のステップでは、TCP から UDP(User Datagram Protocol)に焦点を移します。

UDP はコネクションレスなプロトコルです。TCP とは異なり、データを送信する前に接続を確立するためのハンドシェイクプロセスが存在しません。UDP パケットをポートに送信しても、通常、ポートが開いていても確認応答は返されません。ポートが閉じている場合にのみ、「ICMP Port Unreachable(ポート到達不能)」エラーが返されます。

この非対称性のため、UDP スキャンは解釈が困難です。沈黙は、成功、フィルタリング、あるいは単なる無応答のいずれをも意味し得るからです。そのため、分析者は TCP の結果よりも慎重に UDP の結果を読み解く必要があります。

このため、UDP スキャンは非常に困難で時間がかかります。Nmap が UDP パケットを送信して応答がない場合、ポートが開いていて黙ってデータを受け入れているのか、それともファイアウォールがパケットを破棄しただけなのかを確実には判断できません。そのため、Nmap はこれらのポートを open|filtered と報告することがよくあります。

ローカルマシン上でサービスが動作していないことがわかっている任意のポート(5353 など)に対して UDP スキャンを実行してみましょう。これにより、ポートが明示的に閉じられている場合にオペレーティングシステムがどのように応答するかを確認できます。SYN スキャンと同様に、UDP スキャンも生のパケットを生成するために root 権限が必要です。

ターミナルで以下のコマンドを実行してください。

sudo nmap -sU -p 5353 localhost

このスキャンは TCP スキャンよりも少し時間がかかる場合があります。完了すると、以下のような出力が表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-07 15:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000038s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE  SERVICE
5353/udp closed zeroconf

Nmap done: 1 IP address (1 host up) scanned in 1.09 seconds

状態が closed と報告されていることに注目してください。Nmap が閉じているポートに UDP パケットを送信すると、ターゲットの OS は通常「ICMP Port Unreachable」エラーメッセージを返します。Nmap はこの明示的なエラーを受け取ったため、自信を持ってポートを closed とマークできます。もしこのポートでサービスが動作していて単に応答しなかった場合(UDP アプリでは一般的です)、Nmap はこの ICMP エラーを受け取れず、ポートの状態を open|filtered と曖昧に報告することになります。この ICMP エラーメッセージへの依存こそが、UDP ポートスキャンの特徴です。

まとめ

お疲れ様でした!TCP および UDP ポートスキャン実験を無事に完了しました。

この実験では、Nmap を使用してさまざまな種類のネットワークスキャンを実行する方法を学びました。信頼性は高いがノイズの多い TCP コネクトスキャン(-sT)から始め、これは完全な 3 ウェイ・ハンドシェイクを完了させるものでした。次に、ステルス性の高い TCP SYN スキャン(-sS)に進み、これは接続をハーフオープン状態のままにすることで基本的なログ記録を回避し、オープンポートを特定する手法でした。最後に、コネクションレスな UDP スキャン(-sU)の複雑さを探り、なぜ UDP ポートが open|filtered と表示されることが多いのかを理解しました。

これらの基本的なスキャン技術は、ネットワークトポロジーを理解し、不正アクセスからシステムを保護するための不可欠なスキルです。