在将某些服务迁移到我们的一些服务器之前,我试图验证它们是否可以通过某些端口进行通信,并且它们没有被我们组织的防火墙 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 LISTEN
on操作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 连接操作与发送操作相同,直到实际发送数据为止,即它:
- 确保所选的本地端口可以绑定(如果已选择)。
- 如果没有选择本地端口,则选择一个。
- 锁定端点,以便它默认与选定的 IP 和端口进行通信,并丢弃从任何其他 IP 地址或端口接收的任何数据报。
- 系统可能会改变处理某些类型错误的方式。
- 就是这样。
请注意,防火墙不会进行任何干扰操作,也不会在网上发送任何内容。