web-dev-qa-db-ja.com

ICMP:ポートが開いていてもポート到達不能エラー

いくつかのNmapポートスキャンでDebianサーバーをテストしています。私のDebianはブリッジ接続で実行されている仮想マシンです。

TCP SYN要求を使用したクラシックポートスキャンは正常に動作し、ポート80が開いていることを検出します(これは正しいことです):

nmap -p 80 192.168.1.166   

Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-10 21:36 CET
Nmap scan report for 192.168.1.166
Host is up (0.00014s latency).
PORT   STATE SERVICE
80/tcp open  http
MAC Address: xx:xx:xx:xx:xx:xx (Cadmus Computer Systems)

Nmap done: 1 IP address (1 Host up) scanned in 0.51 seconds

しかし、UDPポートスキャンを実行すると失敗し、DebianサーバーはICMP:Port unreachableエラーで応答します。

nmap -sU -p 80 192.168.1.166

Starting Nmap 6.47 ( http://nmap.org ) at 2016-02-10 21:39 CET
Nmap scan report for 192.168.1.166
Host is up (0.00030s latency).
PORT   STATE  SERVICE
80/udp closed http
MAC Address: xx:xx:xx:xx:xx:xx (Cadmus Computer Systems)

Nmap done: 1 IP address (1 Host up) scanned in 0.52 seconds

Wiresharkレコード:

wireshark record


そんなことがあるものか ?私のポート80は開いていますが、DebianがICMP:Port unreachableエラーで応答するのはなぜですか?これはセキュリティの問題ですか?

3
hg8

TCPおよびUDPはTCP/IPの一部ですが、どちらも同じTCP/IPまたはOSIレイヤーに属しており、どちらもIPの上のレイヤーであり、異なるプロトコルです。

http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/

伝送制御プロトコル(TCP)とユーザーデータグラムプロトコル(UDP)は、インターネットプロトコルスイートのコアプロトコルの2つです。 TCPとUDPはトランスポート層のTCP/IPモデルで動作し、両方の使用法は大きく異なります。TCPは接続指向のプロトコルです。UDPはコネクションレス型プロトコル。

tcp ip model
(ソース: ml-ip.com

一部のサービスは実際にTCPおよびUDPポートに同時に応答します。DNSおよびNTPサービスの場合と同様ですが、必ずしもそうではありません通常はデフォルトでポート80/TCPにのみ応答するWebサーバーを使用(UDPで動作/待機しない)

次のコマンドを使用して、LinuxシステムのUDPリスニングポートを一覧表示できます。

$Sudo netstat -anlpu
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address             State       PID/Program name  
udp        0      0 0.0.0.0:1900            0.0.0.0:*                           15760/minidlnad   
udp        0      0 0.0.0.0:5000            0.0.0.0:*                           32138/asterisk  
udp        0      0 0.0.0.0:4500            0.0.0.0:*                           1592/charon     
udp        0      0 0.0.0.0:4520            0.0.0.0:*                           32138/asterisk  
udp        0      0 0.0.0.0:5060            0.0.0.0:*                           32138/asterisk  
udp        0      0 0.0.0.0:4569            0.0.0.0:*                           32138/asterisk  
udp        0      0 0.0.0.0:500             0.0.0.0:*                           1592/charon     
udp        0      0 192.168.201.1:53        0.0.0.0:*                           30868/named     
udp        0      0 127.0.0.1:53            0.0.0.0:*                           30868/named     
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2055/dhcpd      
udp        0      0 0.0.0.0:14403           0.0.0.0:*                           1041/dhclient   
udp    17920      0 0.0.0.0:68              0.0.0.0:*                           1592/charon     
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1041/dhclient   
udp        0      0 0.0.0.0:56417           0.0.0.0:*                           2055/dhcpd      
udp        0      0 192.168.201.1:123       0.0.0.0:*                           1859/ntpd       
udp        0      0 127.0.0.1:123           0.0.0.0:*                           1859/ntpd       
udp        0      0 192.168.201.255:137     0.0.0.0:*                           1777/nmbd       
udp        0      0 192.168.201.1:137       0.0.0.0:*                           1777/nmbd       
udp        0      0 0.0.0.0:137             0.0.0.0:*                           1777/nmbd       
udp        0      0 192.168.201.255:138     0.0.0.0:*                           1777/nmbd       
udp        0      0 192.168.201.1:138       0.0.0.0:*                           1777/nmbd       
udp        0      0 0.0.0.0:138             0.0.0.0:*                           1777/nmbd       
udp        0      0 192.168.201.1:17566     0.0.0.0:*                           15760/minidlnad 

そして、あなたのリスニングTCPポートをコマンドで:

$Sudo netstat -anlpt
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 0.0.0.0:5060            0.0.0.0:*               LISTEN      32138/asterisk  
tcp        0      0 192.168.201.1:8200      0.0.0.0:*               LISTEN      15760/minidlnad   
tcp        0      0 192.168.201.1:139       0.0.0.0:*               LISTEN      2092/smbd       
tcp        0      0 0.0.0.0:2000            0.0.0.0:*               LISTEN      32138/asterisk  
tcp        0      0 192.168.201.1:80        0.0.0.0:*               LISTEN      7781/nginx      
tcp        0      0 192.168.201.1:53        0.0.0.0:*               LISTEN      30868/named     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      30868/named     
tcp        0      0 192.168.201.1:22        0.0.0.0:*               LISTEN      2023/sshd       
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      1919/Perl       
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      30868/named     
tcp        0      0 192.168.201.1:445       0.0.0.0:*               LISTEN      2092/smbd       
tcp        0    224 192.168.201.1:22        192.168.201.12:56820    ESTABLISHED 16523/sshd: rui [pr

現在、NMAPは通常、スキャンされているポートにSYNを送信し、TCPプロトコルに従って、デーモン/サービスがポートにバインドされている場合、SYN + ACKとnmapで応答します開いていると表示されます。

TCP/IP接続ネゴシエーション:3ウェイハンドシェイク

接続を確立するには、TCPは3ウェイハンドシェイクを使用します。クライアントがサーバーとの接続を試みる前に、サーバーはまずポートにバインドしてリッスンして、接続用に開く必要があります。これはパッシブオープンと呼ばれます。パッシブオープンが確立されると、クライアントはアクティブオープンを開始できます。接続を確立するには、3ウェイ(または3ステップ)ハンドシェイクが発生します。

SYN:アクティブなオープンは、サーバーにSYNを送信するクライアントによって実行されます。クライアントは、セグメントのシーケンス番号をランダムな値Aに設定します。SYN-ACK:サーバーはSYN-ACKで応答します。

3 way handshake

ただし、サービスがそこで実行されていない場合、TCP/IPは、カーネルがICMPメッセージをUDPサービスの「ポート到達不能」メッセージとともに送信することを定義し、TCP RSTメッセージTCPサービス。

ICMP宛先に到達できません

到達不能な宛先は、ホストまたはそのインバウンドゲートウェイ[3]によって生成され、何らかの理由で宛先に到達できないことをクライアントに通知します。 Destination Unreachableメッセージは、TCP、UDP、または別のICMP送信の結果として生成される場合があります。 Unreachable TCPポートは、予期したとおり、特に、Destination Unreachableタイプ3ではなく、TCP RSTで応答します。

そのため、実際には、ポート80/UDPへのUDPスキャンは、その組み合わせまたはプロトコル/ポートをリッスンしているサービスがないため、単にICMP到達不能メッセージを受信します。

セキュリティに関する考慮事項として、デフォルトですべてのメッセージを削除するファイアウォール/ iptablesルールを定義し、マシンが外部に提供するポートでのみ許可する場合、それらのICMP宛先到達不能メッセージは確実にブロックされます。これにより、特にネットワークで開いているすべてのポートに対してnmapスキャンが遅くなり、サーバーが使用するリソースが少なくなります。

追加の利点として、デーモン/サービスが追加のポートを開くか、新しいサービスが誤って追加された場合、新しいファイアウォールルールで明示的に許可されるまで、サービスはリクエストを処理しません。

IptablesでDROPを使用する代わりにREJECTルールを使用する場合、カーネルはスキャン/ TCP/IPネゴシエーションの試行を無視せず、宛先に到達できない、コード13のICMPメッセージで応答することに注意してください。 (管理フィルタリングにより、パケットが転送されなくなります)」。

ipchainsとiptablesでSSH/HTTP以外のすべてのポートをブロック

8
Rui F Ribeiro

TCP/80とUDP/80は2つの異なるプロトコルです(/etc/protocols)たまたま同じポート番号を共有しています。 TCP/80は開いており、UDPにはICMP応答を生成する他のルールがあります。

3
thrig