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 記錄:
這怎麼可能?我的 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 是一種無連接協議。
(來源: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 使用三次握手。在客戶端嘗試與伺服器連接之前,伺服器必須首先綁定並監聽一個埠以打開它以進行連接:這稱為被動打開。一旦建立了被動打開,客戶端就可以發起主動打開。要建立連接,需要進行三次(或 3 步)握手:
SYN:主動打開是由客戶端向伺服器發送一個SYN來執行的。客戶端將段的序列號設置為隨機值 A。 SYN-ACK:作為響應,伺服器回復一個 SYN-ACK。
但是,如果服務沒有在那裡執行,則 TCP/IP 定義核心將返回一個 ICMP 消息,其中包含用於 UDP 服務的“埠不可達”消息,以及用於 TCP 服務的 TCP RST 消息。
目標不可達是由主機或其入站網關生成的
$$ 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:“通信管理禁止(管理過濾防止數據包被轉發)”。