ICMP:即使端口打开,端口也无法访问错误

hg8*_*hg8 5 security debian nmap tcp-ip 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
Run Code Online (Sandbox Code Playgroud)

但是当运行 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
Run Code Online (Sandbox Code Playgroud)

Wireshark 记录:

线鲨记录


这怎么可能?我的 80 端口是开放的,Debian 怎么回答ICMP : Port unreachable错误?那是安全问题吗?

Rui*_*iro 10

虽然 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 
Run Code Online (Sandbox Code Playgroud)

使用以下命令监听 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
Run Code Online (Sandbox Code Playgroud)

现在通常 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 目标不可达

Destination unreachable 是由主机或其入站网关生成的[3],以通知客户端由于某种原因目的地不可达。作为 TCP、UDP 或其他 ICMP 传输的结果,可能会生成 Destination Unreachable 消息。不可达的 TCP 端口特别以 TCP RST 响应,而不是像预期的那样使用目标不可达类型 3。

因此,确实,您扫描到端口 80/UDP 的 UDP 只会收到一条 ICMP 无法访问的消息,因为没有服务侦听该组合或协议/端口。

出于安全考虑,如果您定义防火墙/iptables 规则默认丢弃所有消息,并且只允许您的机器对外服务的端口,则肯定可以阻止那些 ICMP 目标不可达消息。这样,nmap 扫描所有开放端口,尤其是在网络中,会更慢,服务器将使用更少的资源。

作为一个额外的优势,如果守护进程/服务打开了额外的端口,或者错误地添加了一个新服务,它不会为请求提供服务,直到新的防火墙规则明确允许。

请注意,如果不是在 iptables 中使用 DROP,而是使用 REJECT 规则,内核将不会忽略扫描/TCP/IP 协商尝试,并会以 Destination unreachable 的 ICMP 消息回答,代码 13:“管理禁止通信(管理过滤防止数据包被转发)”。

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