为什么 netcat 对 UDP 端口的扫描总是成功?

为什么 netcat 对 UDP 端口的扫描总是成功?

在将某些服务迁移到我们的一些服务器之前,我试图验证它们是否可以通过某些端口进行通信,并且它们没有被我们组织的防火墙 ACL 阻止。

说得通

[mrduki@mybox1~]$ nc -ul 40000
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!

没有意义

[mrduki@mybox1~]$ nc -ul 40000
[mrduki@mybox1~]$ ^C
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!

事实上,如果我从 进行端口扫描40000-40100,每个端口都会成功。

如果我没有执行相同的测试-u(以便测试 TCP 而不是 UDP),我会得到40000 (tcp) timed out: Operation now in progress错误,正如我所料(因为我没有这样的 TCP 服务在监听40000)。

但是执行sudo netstat -alnp | grep LISTENon操作mybox1后显示没有此类服务正在监听这些端口。那么我遗漏了什么呢?

答案1

nc可能不是测试端口状态的最佳工具。你试过吗nmap?它实际上是一个端口扫描器。我检查了我家网络上的文件服务器和 127.0.0.1,两者都报告UDP port 40000已关闭。

nmap

# nmap -sU -p 40000 igor

Starting Nmap 7.01 ( https://nmap.org ) at 2016-08-18 18:27 EDT
Nmap scan report for igor (192.168.1.125)
Host is up (0.00027s latency).
rDNS record for 192.168.1.125: igor.swass
PORT      STATE  SERVICE
40000/udp closed unknown
MAC Address: 68:05:CA:3A:BF:B7 (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.53 seconds

内核 + /dev

你也可以使用内核来做同样的事情。但nmap这样做可能更好。

# timeout 3 cat < /dev/udp/example.com/40000

当我尝试nc使用同一台服务器 (igor) 时,我得到了与您相同的结果。但我回去再试一次,现在它没有返回任何输出(没有成功消息),并且 wireshark 显示“无法到达目标”通过 ICMP 发送回来。我不明白这一切。但我会换一种检查 UDP 端口状态的方法。

答案2

UDP 是一种“无连接”协议。如果您发送了一个数据包,但没有收到拒绝(通过 ICMP),那么无论您是否收到回复,都被视为成功。一个很常见的情况是防火墙阻止目标的 ICMP 拒绝数据包发回给您(netcat 使用此方法来确定端口是否已关闭,否则它会认为端口已打开)。

与全状态的 TCP 相比,未收到回复 (ACK) 被视为 TCP 内部故障(这通常显示为“已过滤”),否定回复 (RST,将显示为已关闭) 也是如此。

UDP:打开|过滤关闭 TCP:打开关闭过滤

答案3

任何防火墙阻止都无法阻止 UDP 连接尝试成功,因为使用 UDP 连接不涉及发送任何内容或侦听任何响应。从功能上讲,UDP 连接操作与发送操作相同,直到实际发送数据为止,即它:

  1. 确保所选的本地端口可以绑定(如果已选择)。
  2. 如果没有选择本地端口,则选择一个。
  3. 锁定端点,以便它默认与选定的 IP 和端口进行通信,并丢弃从任何其他 IP 地址或端口接收的任何数据报。
  4. 系统可能会改变处理某些类型错误的方式。
  5. 就是这样。

请注意,防火墙不会进行任何干扰操作,也不会在网上发送任何内容。

相关内容