我无权访问netcat
或nmap
因此我尝试使用bash
特殊/dev/udp/
文件来测试端口。
我可以做类似的事情:
echo "" > /dev/udp/example.com/8000
但在使用 UDP 时$?
总是如此。0
我假设这是因为echo ""
命令的返回值正确吗?
我基本上是在尝试复制我能够用nmap
and做的事情netcat
:
nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'
我将如何做到这一点/dev/udp
?
答案1
对于 TCP,只需检查$?
.如果连接失败,$?
则不会0
:
$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1
需要一段时间才能bash
意识到连接失败。您可以使用暂停引起bash
:
$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
echo Port open ||
echo Port close
Port open
测试udp端口比较复杂。
严格来说,不存在打开状态(当然,udp是无国籍的协议)与 udp。只有两个状态有udp,倾听或者不是。如果状态是不是,你会得到一个ICMP 目标无法到达。
不幸的是,防火墙或路由器经常丢弃这些 ICMP 数据包,因此您无法确定 udp 端口的状态。
答案2
一般来说,你不能。
与 TCP 不同,UDP 是无连接的。您无法像使用 TCP 那样仅通过与端口建立不执行任何操作的连接来检测端口是否打开。相反,您需要将数据发送到端口并查看会发生什么,而现实世界中实现的 UDP 细节使得解释结果变得困难。即使是复杂的数据包级工具也nmap
无法确定是否有程序正在侦听给定的 UDP 端口。 nmap
将 UDP 端口分为三组:
- 绝对开放。向端口发送数据包会引起目标计算机的数据响应。
- 肯定关门了。向端口发送数据包会引发来自目标计算机的“ICMP 目标无法到达”消息。
- 要么开放,要么过滤。向端口发送数据包没有引起任何响应。也许有防火墙正在丢弃数据包;也许有一个程序正在监听,
nmap
只是不知道如何获得响应;也许用户只是运气不好,所有数据包在传输过程中都丢失了。