排查网络故障的时候我们常用的一个方法就是探测一下远端端口是否可以连接,而一个好的探测工具能为我们节省很多时间,下面我就分享一些常用的端口检测的工具。
0x01 telnet
telnet
是一个经典的telnet协议的客户端,因为telnet
协议是一个基于tcp的文本协议,因此我们可以用它来探测端口是否开放,其命令如下
# telnet 域名或IP 端口
telnet 12.1.1.1 22
端口通的情况:
端口开放的情况
端口不通的情况:
端口不通的情况
0x02 nc
nc
命令全称netcat,是网络调试中瑞士军刀级别的工具,它的作用包括但不限于:
- 搭建简单的HTTP服务,或作为客户端
- 搭建TCP服务
- 配合ssh中的ProxyCommand使用
- 网络检测
我们这里主要使用他的网络检测的能力,其简单的检测命令为:
# nc -v 域名或IP 端口
nc -v qq.com 80
nc
命令会显式的打印出成功的情况,对于端口不通,nc和可能会阻塞很久也可能直接返回失败。
端口通的情况:
端口打开的情况
端口不通的情况:
端口不通的情况
0x03 bash特殊设备文件
bash下存在一个特殊的设备文件:/dev/(tcp|udp)/
echo > /dev/tcp/qq.com/80
端口通的情况下:
端口不通的情况下:
0x04 端口不通为什么会出现阻塞
最后我们解释一下端口不通的情况下为什么会出现长时间阻塞,其实这个很好解释:客户端在等服务器端返回数据包,正常情况下,如果端口未开放,服务端会直接返回一个RST
包,客户端收到这个包后会直接关闭socket
然后返回退出,但如果服务端配置了防火墙(iptables),直接把未开放端口的请求包丢弃,那客户端就永远不可能收到回报,但客户端又不知道包被丢弃了,于是就傻傻重传然后继续等,直到超时。我们通过tcpdump
抓包看一下:
上图显示的端口通的情况,可以清晰的看到TCP三次握手四次挥手。
上图显示了端口不通,但防火墙丢包的情况,可以看到,客户端一直在傻傻的重传syn
包。
上图是端口不通,且没有防火墙丢包等情况,可以看到服务端直接返回了rst
包。