使用bash的`/dev/udp`,我如何知道端口是否打开?

使用bash的`/dev/udp`,我如何知道端口是否打开?

我无权访问netcatnmap因此我尝试使用bash特殊/dev/udp/文件来测试端口。

我可以做类似的事情:

echo "" > /dev/udp/example.com/8000

但在使用 UDP 时$?总是如此。0我假设这是因为echo ""命令的返回值正确吗?

我基本上是在尝试复制我能够用nmapand做的事情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 端口分为三组:

  1. 绝对开放。向端口发送数据包会引起目标计算机的数据响应。
  2. 肯定关门了。向端口发送数据包会引发来自目标计算机的“ICMP 目标无法到达”消息。
  3. 要么开放,要么过滤。向端口发送数据包没有引起任何响应。也许有防火墙正在丢弃数据包;也许有一个程序正在监听,nmap只是不知道如何获得响应;也许用户只是运气不好,所有数据包在传输过程中都丢失了。

相关内容