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

MrD*_*Duk 1 port access-control-list netcat nc

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

说得通

[mrduki@mybox1~]$ nc -ul 40000
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!
Run Code Online (Sandbox Code Playgroud)

没有意义

[mrduki@mybox1~]$ nc -ul 40000
[mrduki@mybox1~]$ ^C
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!
Run Code Online (Sandbox Code Playgroud)

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

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

执行sudo netstat -alnp | grep LISTENonmybox1虽然显示没有此类服务侦听这些端口。那么我错过了什么?

Rya*_*hin 5

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

地图

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

内核+/dev

您也可以使用内核来执行此操作,如下所示。但nmap可能更好。

# timeout 3 cat < /dev/udp/example.com/40000
Run Code Online (Sandbox Code Playgroud)

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


841*_*104 5

UDP 是一种“无连接”协议。如果您发送一个数据包并且没有收到拒绝(通过 ICMP),无论您是否收到回复,都被认为是成功的。一个很常见的事情是防火墙阻止目标的 ICMP 拒绝数据包被发送回给你(这是 netcat 用来知道端口是否关闭,否则它认为它是打开的)。

将此与有状态的 TCP 进行对比。收到回复 (ACK) 失败被认为是 TCP 中的失败(这通常显示为“已过滤”),否定回复(RST,将显示为关闭)也是如此。

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