我正在使用一些 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记录:
这怎么可能?我的 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 是一种无连接协议。
(来源: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 使用三向握手。在客户端尝试与服务器连接之前,服务器必须首先绑定并侦听端口以打开连接:这称为被动打开。一旦建立被动打开,客户端就可以发起主动打开。为了建立连接,需要进行三向(或三步)握手:
SYN:主动打开是由客户端向服务器发送SYN来执行的。客户端将数据段的序列号设置为随机值 A。 SYN-ACK:作为响应,服务器回复 SYN-ACK。
但是,如果服务没有在那里运行,TCP/IP 定义内核将为 UDP 服务发送带有“端口不可达”消息的 ICMP 消息,为 TCP 服务发送带有 TCP RST 消息的消息。
目的地不可达由主机或其入站网关[3]生成,以通知客户端由于某种原因目的地不可达。 TCP、UDP 或其他 ICMP 传输可能会生成“目的地不可达”消息。不可到达的 TCP 端口特别以 TCP RST 响应,而不是如预期的那样,使用“无法到达的目标类型 3”进行响应。
因此,实际上,您对端口 80/UDP 的 UDP 扫描只是收到返回的 ICMP 无法访问消息,因为没有服务侦听该组合或协议/端口。
出于安全考虑,如果您定义默认情况下丢弃所有消息的防火墙/iptables 规则,并且仅允许您的计算机对外提供服务的端口,那么这些 ICMP 目标不可达消息肯定会被阻止。这样,nmap 扫描所有开放端口(尤其是在网络中)的速度会更慢,并且服务器将使用更少的资源。
作为另一个优势,如果守护程序/服务打开其他端口,或者错误添加新服务,则在新防火墙规则明确允许之前,它不会处理请求。
请注意,如果您不使用 iptables 中的 DROP,而是使用 REJECT 规则,则内核不会忽略扫描/ TCP/IP 协商尝试,并且会以 Destination unreachable(目标无法到达)的 ICMP 消息进行应答,代码 13:“通信管理禁止” (管理过滤阻止数据包被转发)”。
答案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