概述
我们经常遇到端口本来已经开启了,本地可以访问。比如3306端口,本地客户端可以连接,但是远程不能连接。对于这种问题该如何排查?今天介绍一个端口扫描工具来排查这个问题。
名词解释
nmap:也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。
其基本功能有三个:
- 探测一组主机是否在线
- 扫描 主机端口,嗅探所提供的网络服务
- 推断主机所用的操作系统
遇到的问题
最近在购买的腾讯云上装了一个mysql,并且可以在本地通过mysql client登录上,它本地使用nmap也可以看到3306端口是打开的。
但是,在自己电脑上就是连不上mysql,而且在自己电脑上扫描发现打开的端口跟远程机器上扫描的不一样
nmap工具
这个时候就该使用nmap工具的一些参数了
- -sT
格式:nmap -sT x.x.x.x -p3306
原理:3次握手方式的TCP扫描,握手成功后会调用系统的connect函数。由于要完成TCP的3次握手,速度较慢,且这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。nmap默认的扫描方式是这种。结果如下图:
可以看到3306端口显示的状态是filtered,被防火墙过滤了
但是在远程主机上扫描发现状态是open
- -sS 又称半开放扫描
格式:nmap -sS x.x.x.x -p3306
原理:扫描器向目标主机的一个端口发送请求连接的SYN包,扫描器在收到SYN/ACK后,不是发送的ACK应答而是发送RST包请求断开连接。这样,三次握手就没有完成,无法建立正常的TCP连接,因此,这次扫描就不会被记录到系统日志中。这种扫描技术一般不会在目标主机上留下扫描痕迹。但是,这种扫描需要有root权限。结果如下图:
- -sF
格式:nmap -sF x.x.x.x -p3306
原理:FIN 为 TCP会话结束标志,在FIN扫描中一个设置了FIN位的数据包被发送后,若响应RST数据包,则表示端口关闭,没有响应则表示开放。此类扫描同样不能准确判断windows系统上端口开发情况,适合探测Linux系统上的端口开放情况,同样需要root权限。结果如下图:
远程主机上扫描结果如下:
在sF的扫描中显示open|filtered,则表明端口是开发的
- -sA
格式:nmap -sA x.x.x.x -p3306
原理:扫描主机向目标主机发送ACK数据包。根据返回的RST数据包有两种方法可以得到端口的信息。方法一是: 若返回的RST数据包的TTL值小于或等于64,则端口开放,反之端口关闭,如图所示
自己电脑上运行结果如下:
远程主机上运行结果如下:
自己电脑上显示filterd,远程主机上显示unfiltered。
说明远程主机上的3306端口确实是打开的,但是外界访问不到,被过滤了。
那我的腾讯云的3306端口是在哪里被过滤了呢?防火墙都关闭了。最后通过oncall,技术专家说在控制台里面有个防火墙需要设置一下,如下图:
设置好3306端口之后就OK了,为了防止将来其他端口被过滤,我加上了ALL。现在本地运行sT和sS都正常了。
总结
这里介绍了nmap的四个参数,平时用的多一点的可能就是sT,sS参数。