我正在尝试测试是否可以通过 UDP 访问远程服务器上的特定端口(我都可以访问)。
两台服务器都面向互联网。我使用 netcat 来监听某个端口。
然后我使用 nmap 检查该端口是否打开,但似乎并未打开。
Iptables 已关闭。
有什么建议可以解释为什么会这样吗?我最终要设置一个 VPN 隧道,但由于我对隧道还很陌生,因此在继续之前,我想确保在端口 UDP 1194 上具有连接性。
答案1
不存在所谓的“开放”UDP 端口,至少不是大多数人习惯认为的那种端口(即回答“好的,我已接受您的连接”之类的问题)。UDP 是无会话的,因此“端口”(即操作系统 IP 堆栈中的 UDP 协议)永远不会自行响应“成功”。
UDP 端口只有两种状态:监听或不监听。这通常意味着“进程在其上打开套接字”或“未打开任何套接字”。后一种情况应该很容易检测,因为系统应该用ICMP 目标不可达数据包代码为 3(端口不可达)。不幸的是,许多防火墙可能会丢弃这些数据包,因此如果您没有收到任何回复,您就无法确定端口是否处于此状态。而且,我们不要忘记 ICMP 也是无会话的,并且不会进行重传:端口不可达数据包很可能在网络上的某个地方丢失。
处于“侦听”状态的 UDP 端口可能根本没有响应(侦听该端口的进程只接收数据包,并不传输任何内容),或者可能会发回一些内容(如果该进程在接收后确实采取行动和如果它通过 UDP 响应原始发送方 IP:端口)。因此,如果您没有收到任何回复,那么您永远无法确切知道状态如何。
您说您可以控制接收主机:这使您能够构建自己的协议来检查 UDP 端口的可达性:只需在接收主机上放置一个进程,该进程将监听给定的 UDP 端口和回复(或向您发送电子邮件,或只是惊慌失措,unlink()
主机文件系统上的所有内容……任何能够引起您注意的事情都可以)。
答案2
要测试 udp 端口是否响应,请使用netcat
。
一个例子手册页:
nc -v -u -z -w 3 example.host 20-30
Send UDP packets to ports 20-30 of example.host, and report which ones
did not respond with an ICMP packet after three seconds.
当然,如果防火墙正在DROP
运行(处理面向互联网的网关时通常会出现这种情况),您将不会收到 ICMP 响应。
答案3
- 在客户端和服务器上安装 nc:(
yum install nc
适用于 centos) - 在服务器上监听 UDP 端口:(如果您正在测试 IPv6 连接,
nc -ul 6111
请添加该选项)-6
- 在客户端上
nc -u <server> 6111
- 在客户端输入任何内容并按回车键 - 您应该在服务器上看到此文本
笔记:当你nc -ul
在服务器上运行该命令时,它将仅有的连接第一个到达的连接。据我所知,如果不停止并重新启动,则无法在 ping 它的服务器之间切换nc -ul
。事实上,如果您 ^C 停止客户端 ( nc -u ...
),您也无法在不先重新启动服务器侦听器的情况下重新启动客户端。
答案4
使用 nmap 测试开放的 UDP 端口充满风险——没有三次握手来指示开放性。除非侦听进程响应 nmap 发送的任何内容,否则 nmap 无法区分未响应的开放端口和已过滤的端口。
更简单的方法是在一端使用 netcat 监听,在另一端使用 netcat 发送数据包,并查看它们是否到达另一端。确保两种方式都进行。您还可以tcpdump
查看数据包是否到达了它们需要去的地方。