场景引入:一台服务器的"安检"
你可能有过这样的经历:新接手一台服务器,前任管理员走了,没人知道这台机器上跑了哪些服务。你登录上去 netstat -tlnp 一看,端口好多。但只有这一台机器吗?整个内网段里有哪些机器在线?它们都开了什么端口?这些信息 netstat 给不了你,这时候需要 nmap。
Nmap(Network Mapper,网络映射器)是网络扫描领域的"瑞士军刀"。它能发现网络中存活的主机、探测开放的端口、识别服务版本、甚至推测操作系统类型。我从一个不会用的新手到把它当成"安检必备工具",经历了不少有趣的案例。
安装
多数Linux发行版可以直接安装:
# 在Ubuntu/Debian上安装nmap
sudo apt-get install nmap
# 在CentOS/RHEL上安装nmap
sudo yum install nmap
基本端口扫描:-sS和-sT
nmap最核心的功能是端口扫描。扫描一个IP的常用端口:
# 快速扫描目标主机的1000个常用端口
nmap 192.168.1.1
这只是最基础的用法。nmap默认会扫描1000个最常用的端口。但要想获得更准确的信息,需要指定扫描类型。
TCP SYN扫描(半开扫描),用 -sS:
# 使用SYN半开扫描(快速且隐蔽),扫描目标的常用端口
sudo nmap -sS 192.168.1.1
SYN扫描的原理是只发送SYN包(TCP握手的第一个包),收到SYN+ACK(对方端口开放)就发RST断开,不完成完整的三次握手,所以叫半开扫描。它更快也更隐蔽。需要root权限才能发送原始SYN包。
TCP连接扫描,用 -sT:
# 使用完整的TCP连接扫描(不需要root权限)
nmap -sT 192.168.1.1
当没有root权限时,nmap会退回到TCP连接扫描。它完成完整的三次握手来判断端口是否开放。速度慢一些,但不需要特殊权限。
两种扫描最直接的区别:SYN扫描快且隐秘,但需要root。TCP连接扫描不需要root,但会更"明目张胆"。在内网环境,两种都可以。根据我的经验,如果在自己可控的服务器上扫描,用SYN扫描多一些,因为速度快。
扫描指定端口范围:-p
默认只扫1000个端口,但真实的服务可能运行在非常用端口上。用 -p 指定端口范围:
# 扫描目标主机的22到443端口范围
nmap -p 22-443 192.168.1.1
# 扫描特定的几个常用端口
nmap -p 22,80,443,3306,6379,8080 192.168.1.1
# 扫描全部65535个端口(非常慢,慎用)
nmap -p- 192.168.1.1
扫描全部65535个端口非常慢,可能要十几分钟甚至更久。一般用 -p 指定你关心的端口范围就好。
我在一次安全审计中,nmap发现一台服务器在2222端口上开了SSH。运维说他们故意改了端口号防暴力破解。但如果这只是"安全通过不透明"(security through obscurity),而没有配合密钥登录和防火墙白名单,其实并不安全。nmap扫到后就能尝试爆破。
服务版本探测:-sV
知道端口开放是第一步,更关键的是知道端口上跑的是什么服务、什么版本。因为这个版本信息往往对应着已知的安全漏洞:
# 探测开放端口上的服务类型和版本号
sudo nmap -sV 192.168.1.1
输出会更详细,比如不是简单显示"80/tcp open http",而是"80/tcp open Apache httpd 2.4.41"。
有一次我帮朋友排查一个旧服务器,nmap -sV扫出来nginx版本是1.14.0,查了一下这个版本有两个已知安全漏洞。建议他升级,他还不信,我直接展示了CVE(Common Vulnerabilities and Exposures,通用漏洞披露)编号和影响。升级后确实安全了。这就是服务版本探测的价值。
-sV 可以和 -sS 或 -sT 组合使用。推荐 sudo nmap -sS -sV 一次性完成快速扫描和版本探测。
操作系统识别:-O
通过分析网络包的各种特征值(TTL、窗口大小、TCP选项等),nmap可以推测目标主机的操作系统:
# 识别目标主机的操作系统类型和版本
sudo nmap -O 192.168.1.1
输出类似:
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4.15
OS details: Linux 4.15 - 5.6
这个判断不是100%准确的,但作为一个快速参考非常有用。特别是在管理大量未知设备时,nmap可以帮你快速将设备分类。
我做过一个实验:用自己的两台机器互扫。一台是Ubuntu 20.04,一台是CentOS 7。nmap -O的猜测和实际版本很接近,但不完全精确。所以 -O 的结果可以当参考,不要100%依赖。
网段扫描
这是nmap最强大的用法之一。扫描整个子网,发现所有存活的主机:
# 扫描整个192.168.1.0/24网段中有哪些主机在线,以及它们的开放端口
nmap -sS 192.168.1.0/24
这个命令会扫描192.168.1.1到192.168.1.254所有IP。如果你管理一个办公室的网络,扫一遍能发现哪些设备在线:路由器、打印机、群晖NAS、同事的台式机、可能还有偷偷插上的个人路由器。
发现存活主机用 -sn(Ping扫描,只检测主机是否存活,不扫端口):
# 快速发现网段中存活的主机(只做Ping探测,不做端口扫描)
nmap -sn 192.168.1.0/24
输出示例:
Nmap done: 256 IP addresses (12 hosts up) scanned in 3.21 seconds
Nmap scan report for 192.168.1.1
Host is up (0.0018s latency).
Nmap scan report for 192.168.1.100
Host is up (0.0022s latency).
...
这个命令非常快,几十秒就能把一个C段网段扫完。我每周都会在公司内网跑一次 nmap -sn,看看有没有不认识的设备上线。曾经用它发现了一台私自接入的测试服务器。这就是所谓的"网络资产管理"。
结果保存:-oN和-oX
扫描结果存下来,方便日后对比和分析:
# 将扫描结果以普通文本格式保存到文件
nmap -sS -sV -oN scan-result.txt 192.168.1.1
# 将扫描结果以XML格式保存(方便程序解析)
nmap -sS -sV -oX scan-result.xml 192.168.1.1
# 同时输出三种格式
nmap -sS -sV -oA myscan 192.168.1.1
-oA myscan 会生成 myscan.nmap(普通文本),myscan.gnmap(Grepable格式,方便grep),myscan.xml(XML格式)三个文件。
我有一个脚本,每月初对办公室网络做一次全量扫描,保存XML结果。然后在月底对比月初的结果,看有没有新增的开放端口。新增端口可能是新部署的服务,也可能是潜在的安全风险。这个习惯帮我发现过几次"嗯,谁又开了个测试端口没关掉"的情况。
常见扫描场景
我把自己常用的几个扫描场景整理如下:
场景一:新服务器上线安全检查。在服务器上线前扫一遍,确认只开放了预期端口:
# 新服务器上线前,扫描全部65535个端口并探测服务版本
nmap -sS -sV -p- 10.0.0.100
场景二:排查"端口不通"的问题。有时候应用连不上数据库,可能是防火墙问题,也可能是数据库端口没监听。从应用所在的机器扫数据库服务器的端口:
# 从应用服务器扫描数据库服务器的端口(确认端口可达性)
nmap -p 3306 db-server.internal
如果显示filtered,说明有防火墙拦住了。如果显示closed,说明端口上没有服务在监听。
场景三:检测内网是否被入侵。如果你怀疑有机器被植入了后门程序,恶意软件往往会监听一个非常用端口等待C2服务器连接。扫描内网所有机器的非常用端口:
# 扫描所有机器的高端口范围(常用于后门程序的监听端口)
nmap -sS -p 10000-65535 192.168.1.0/24
安全提醒(非常重要)
这是整篇文章最重要的部分,请务必仔细阅读。
千万不要未经授权扫描别人的服务器。 在多数国家和地区,未经授权的网络扫描可能被视为网络攻击行为,严重的情况下可能触犯法律。我在公司内部的C段扫自己管理的机器没问题,但扫到隔壁公司的网络段就是越界。
nmap的SYN扫描在某些IDS/IPS(入侵检测/防御系统)下会被记录并触发告警。 安全运维人员看到流量日志里出现大量的SYN包按顺序扫描端口,就知道有人在用nmap扫描。所以不要在自己的服务器上用nmap做"测试",除非那是你明确拥有或经授权管理的机器。
扫描会影响目标服务器的性能。 对一个繁忙的生产服务器做全端口扫描(-p-)可能会触发大量的TCP连接,增加服务器负载。我曾经在对一台数据库服务器做扫描时,观察到CPU使用率从5%跳到了30%。最佳实践是在业务低峰期进行扫描。
nmap只是发现工具,不是攻击工具。 发现端口开放了、服务版本暴露了,作用是提醒你及时修复,而不是利用漏洞。君子爱财取之有道,技术也是一样。
本地测试建议。 如果你想学习和测试nmap,用自己电脑上的 localhost 或者扫描测试平台。有一个比较知名的合法测试目标 scanme.nmap.org,是nmap官方提供的测试服务器,可以合法扫描它:
# 合法扫描测试目标(nmap官方提供的测试服务器)
nmap scanme.nmap.org
小结
nmap是网络工程师和运维人员的必备工具。它的核心功能可以概括为:发现谁在线(-sn)、哪些端口开着(-sS/-sT)、跑着什么服务(-sV)、系统是什么(-O)。把这些组合起来,一张完整的网络拓扑和服务清单就出来了。能帮你做资产管理、安全检查、故障排查和合规审计。但最重要的提醒再强调一遍:只扫自己的机器,不要乱扫别人。