Debian

ICMP:即使埠打開,埠也無法訪問錯誤

  • August 1, 2021

我正在使用一些 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 記錄:

線鯊記錄


這怎麼可能?我的 80 埠是開放的,Debian 怎麼會回答ICMP : Port unreachable error ?這是一個安全問題嗎?

雖然 TCP 和 UDP 是 TCP/IP 的一部分,但它們都屬於相同的 TCP/IP 或 OSI 層,並且都是 IP 之上的一層,但它們是不同的協議。

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

傳輸控制協議 (TCP) 和使用者數據報協議 (UDP) 是 Internet 協議套件的兩個核心協議。TCP 和 UDP 都在傳輸層 TCP/IP 模型上工作,並且都有非常不同的用法。TCP 是一種面向連接的協議。UDP 是一種無連接協議。

tcp ip模型

(來源:ml-ip.com

有些服務確實會同時響應 TCP 和 UDP 埠,就像 DNS 和 NTP 服務的情況一樣,但是 Web 伺服器的情況並非如此,通常預設情況下只響應埠 80/TCP(並且確實在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 步)握手:

SYN:主動打開是由客戶端向伺服器發送一個SYN來執行的。客戶端將段的序列號設置為隨機值 A。 SYN-ACK:作為響應,伺服器回復一個 SYN-ACK。

3 次握手

但是,如果服務沒有在那裡執行,則 TCP/IP 定義核心將返回一個 ICMP 消息,其中包含用於 UDP 服務的“埠不可達”消息,以及用於 TCP 服務的 TCP RST 消息。

ICMP 目標不可達

目標不可達是由主機或其入站網關生成的

$$ 3 $$通知客戶端由於某種原因無法到達目的地。由於 TCP、UDP 或其他 ICMP 傳輸,可能會生成 Destination Unreachable 消息。無法訪問的 TCP 埠明顯響應 TCP RST 而不是預期的目標無法訪問類型 3。

因此,確實,您的 UDP 掃描到埠 80/UDP 只會收到一條 ICMP 無法訪問的消息,因為沒有服務監聽該組合或協議/埠。

出於安全考慮,如果您定義防火牆/iptables 規則以預設丟棄所有消息,並且只允許您的機器對外提供服務的埠進入,那麼這些 ICMP 目標不可達消息當然可以被阻止。這樣,nmap 掃描到所有開放埠,尤其是在網路中,會更慢,伺服器將使用更少的資源。

作為一個額外的優勢,如果一個守護程序/服務打開了額外的埠,或者一個新的服務被錯誤地添加了,它不會為請求提供服務,直到它被新的防火牆規則明確允許。

請注意,如果不是在 iptables 中使用 DROP,而是使用 REJECT 規則,核心將不會忽略掃描/TCP/IP 協商嘗試,並且會使用 Destination unreachable 的 ICMP 消息進行回答,程式碼 13:“通信管理禁止(管理過濾防止數據包被轉發)”。

在 ipchains 和 iptables 中阻止除 SSH/HTTP 之外的所有埠

引用自:https://unix.stackexchange.com/questions/261360