测试远程系统上的端口是否可以访问(不使用telnet)
以前,我们用telnet
来查看远程主机上的端口是否开放:telnet hostname port
会尝试连接到任何主机上的任何端口,并让你访问原始TCP流。久而久之,很容易忘记哪些端口对哪些主机是开放的。
有没有其他方法来测试远程系统上的端口是否开放–使用安装了有限的Linux系统,而telnet
又不能使用,那么请问有什么方法可以测试远程系统上的端口是否开放呢?
以前,我们用telnet
来查看远程主机上的端口是否开放:telnet hostname port
会尝试连接到任何主机上的任何端口,并让你访问原始TCP流。久而久之,很容易忘记哪些端口对哪些主机是开放的。
有没有其他方法来测试远程系统上的端口是否开放–使用安装了有限的Linux系统,而telnet
又不能使用,那么请问有什么方法可以测试远程系统上的端口是否开放呢?
好看又省事! 单端口:
nc -zv 127.0.0.1 80
nc -zv 127.0.0.1 22 80 8080
多端口:
nc -zv 127.0.0.1 20-30
范围:
&001
Bash已经可以访问TCP和UDP端口了。从man page:
/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
Taa Daa!
我发现curl
可能会用类似于telnet
的方法来完成工作,curl
甚至会告诉你监听器期望的协议是哪个协议。如果curl
可以连接,它将报告一个协议不匹配并退出(如果监听器不是web服务)。如果curl
不能连接,它就会超时。
例如,主机10.0.0.0.0.99上的端口5672不是被防火墙关闭就是被防火墙屏蔽了:
$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host
然而,从不同的系统中,主机10.0.0.0.99上的端口5672可以到达。 0.0.0.99可以到达,似乎正在运行AMQP监听器。
$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP
&001
要区分不同的消息:第一次失败是因为curl
无法连接到该端口。第二个失败是一个成功测试,尽管curl
预计是HTTP监听器而不是AMQP监听器。
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!
希望它能解决你的问题 :)
以下是单行本:
</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed
使用Bash语法讲解的【@lornix答案】(https://superuser.com/a/622641/87805).
结合 @kenorb 和 @Azukikuru 的答案,你可以测试端口的打开/关闭/封锁。
这里有一个函数可以根据你的系统安装了什么,选择其中一种方法:
# Check_port <address> <port>
check_port() {
if ["$(which nc)" != ""]; then
tool=nc
elif ["$(which curl)" != ""]; then
tool=curl
elif ["$(which telnet)" != ""]; then
tool=telnet
elif [-e /dev/tcp]; then
if ["$(which gtimeout)" != ""]; then
tool=gtimeout
elif ["$(which timeout)" != ""]; then
tool=timeout
else
tool=devtcp
fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout) gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout) timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp) </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac
}
export check_port
参考一下,扩展一下@peperunas的回答:
,用nmap来测试的方法是:
nmap -p 22 127.0.0.1
(上面的例子是用localhost来做示范
如果你需要在系统上进行测试,你可以使用我们的测试工具 dda-serverspec https://github.com/DomainDrivenArchitecture/dda-serverspec-crate )来完成这些任务。你可以定义你的期望值
{:netcat [{:host "mywebserver.com" :port "443"}
{:host "telnet mywebserver.com" :port "80"}
{:host "telnet mywebserver.com" :port "8443"}]}
{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2"
:node-ip "18.194.113.138"}]
:provisioning-user {:login "ubuntu"}}
,并对这些期望值进行测试,可以是针对本地主机或远程主机(通过ssh连接)。对于远程测试,你必须定义一个目标:
&001
&001
你可以用java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
运行测试。