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

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:端口无法访问错误 :

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记录


这怎么可能?我的 80 端口是开放的,为什么 Debian 会回答一个ICMP:端口无法访问错误 ?这是安全问题吗?

答案1

尽管 TCP 和 UDP 都是 TCP/IP 的一部分,但两者属于同一 TCP/IP 或 OSI 层,并且都位于 IP 之上的一层,但它们是不同的协议。

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

传输控制协议(TCP)和用户数据报协议(UDP)是互联网协议族的两个核心协议。 TCP 和 UDP 都工作在传输层 TCP/IP 模型上,并且都有非常不同的用法。 TCP 是一种面向连接的协议。 UDP 是一种无连接协议。

TCP IP模型
(来源:ML-IP.com

有些服务确实会同时响应 TCP 和 UDP 端口,例如 DNS 和 NTP 服务,但是 Web 服务器的情况并非如此,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 使用三向握手。在客户端尝试与服务器连接之前,服务器必须首先绑定并侦听端口以打开连接:这称为被动打开。一旦建立被动打开,客户端就可以发起主动打开。为了建立连接,需要进行三向(或三步)握手:

SYN:主动打开是由客户端向服务器发送SYN来执行的。客户端将数据段的序列号设置为随机值 A。 SYN-ACK:作为响应,服务器回复 SYN-ACK。

3次握手

但是,如果服务没有在那里运行,TCP/IP 定义内核将为 UDP 服务发送带有“端口不可达”消息的 ICMP 消息,为 TCP 服务发送带有 TCP RST 消息的消息。

ICMP 目标无法访问

目的地不可达由主机或其入站网关[3]生成,以通知客户端由于某种原因目的地不可达。 TCP、UDP 或其他 ICMP 传输可能会生成“目的地不可达”消息。不可到达的 TCP 端口特别以 TCP RST 响应,而不是如预期的那样,使用“无法到达的目标类型 3”进行响应。

因此,实际上,您对端口 80/UDP 的 UDP 扫描只是收到返回的 ICMP 无法访问消息,因为没有服务侦听该组合或协议/端口。

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

作为另一个优势,如果守护程序/服务打开其他端口,或者错误添加新服务,则在新防火墙规则明确允许之前,它不会处理请求。

请注意,如果您不使用 iptables 中的 DROP,而是使用 REJECT 规则,则内核不会忽略扫描/ TCP/IP 协商尝试,并且会以 Destination unreachable(目标无法到达)的 ICMP 消息进行应答,代码 13:“通信管理禁止” (管理过滤阻止数据包被转发)”。

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

答案2

TCP/80 和 UDP/80 是两种不同的协议(请参阅 参考资料/etc/protocols),但它们恰好共享相同的端口号。 TCP/80 是开放的,并且还有一些其他 UDP 规则可以生成 ICMP 响应。

答案3

我在 Ubuntu 18.04 上对 NFS 服务器进行跟踪网络流量故障排除,但使用更新的 5.4 内核以允许导出 Overlayfs。

我只需要运行:

rpc.mountd

但后来我又收到了一个关于 NFS 不支持 TCP 的错误。由于某种原因,只需重新启动 NFS 服务器即可解决该问题:

/etc/init.d/nfs-kernel-server restart

相关内容