在过去,我们常常telnet
查看远程主机上的端口是否开放:telnet hostname port
将尝试连接到任何主机上的任何端口并让您访问原始 TCP 流。
如今,我使用的系统没有安装 telnet(出于安全原因),并且默认情况下所有主机的所有出站连接均被阻止。随着时间的推移,很容易忘记哪些端口对哪些主机开放。
是否有其他方法来测试远程系统上的端口是否开放——使用安装了有限数量软件包的 Linux 系统,并且telnet
不可用?
答案1
Bash 已经能够访问TCP和UDP端口一段时间。从手册页:
/dev/tcp/host/port
If host is a valid hostname or Internet address, and port is an integer port number
or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet address, and port is an integer port number
or service name, bash attempts to open a UDP connection to the corresponding socket.
因此你可以使用如下方法:
xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here
哒哒!
答案2
很好很详细!来自手册页。
单个端口:
nc -zv 127.0.0.1 80
多个端口:
nc -zv 127.0.0.1 22 80 8080
端口范围:
nc -zv 127.0.0.1 20-30
答案3
Netcat 是一个有用的工具:
nc 127.0.0.1 123 &> /dev/null; echo $?
0
如果端口 123 已打开或1
已关闭,则输出。
答案4
我发现curl
可能以类似于 的方式完成工作telnet
,curl
甚至会告诉您侦听器期望哪种协议。
从主机名和端口构建 HTTP URI 作为 的第一个参数curl
。如果curl
可以连接,它将报告协议不匹配并退出(如果侦听器不是 Web 服务)。如果curl
无法连接,它将超时。
例如,主机 10.0.0.99 上的端口 5672 已关闭或被防火墙阻止:
$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host
但是,从不同的系统可以访问主机 10.0.0.99 上的端口 5672,并且似乎正在运行 AMQP 侦听器。
$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP
区分不同的消息很重要:第一次失败是因为curl
无法连接到端口。第二次失败是成功测试,尽管curl
预期的是 HTTP 侦听器而不是 AMQP 侦听器。