暗色模式

Linux 网络扫描:nmap 从主机发现到服务指纹识别

技术教程
2026-09-03
17
0
本文要点
  • nmap 是 Linux 上最常用的网络扫描器:主机发现、端口扫描、服务指纹识别、脚本探测一条龙,装好即用
  • nmap -sn 网段 只做主机发现不扫端口——局域网/容器网段走 ARP,谁在线一目了然;云 VPC 里慎用(实测未分配的 IP 也会被代理 ARP 报成"在线")
  • 端口状态只有三种:open(开着)、closed(关闭)、filtered(被防火墙挡了)——被防火墙挡住的端口可能实际是开着的
  • nmap -sV -p 端口列表 目标 做服务指纹识别:实测一次扫出 OpenSSH 9.6p1、宿主机 nginx 1.24.0、容器 nginx 1.31.4 等 8 个服务的精确版本
  • 版本号是漏洞研判的基础:同一台机器上 apt 版与容器版 nginx 版本不同,风险面也不同
  • NSE 脚本引擎--script 脚本名)在扫描之上扩展能力:取 HTTP 响应头、跑漏洞检测、探测服务细节,脚本按类别存放在 /usr/share/nmap/scripts/
  • 全部命令在 Ubuntu 24.04(nmap 7.94SVN)上真实执行,截图即真实输出

Linux 网络扫描:端口是服务器的门

一台服务器对外到底开了哪些门?这个问题既关乎安全(每多一个开放端口就多一块攻击面),也关乎运维(服务起没起来、版本该不该升级)。没有工具时,你只能对着已知的端口列表逐个 curlnc 去试探——不知道的端口呢?

nmap(Network Mapper)就是为回答这个问题而生的:它从主机发现开始,到端口扫描、服务指纹识别,再到脚本级探测,一条命令就能把一台机器的"网络家底"摸清楚。本文在一台 Ubuntu 24.04 服务器上完整演示扫描的三个层次,全部输出均为真实执行结果。

安装与基本用法

apt install -y nmap
nmap --version

Ubuntu 软件源里的 nmap 开箱即用(本文演示环境为 nmap 7.94SVN)。nmap 需要一个目标:可以是单个 IP、域名、172.17.0.0/29 这样的网段,也可以是 127.0.0.1,192.168.1.10 这样的列表。默认情况下 nmap 目标 会扫描目标最常用的 1000 个 TCP 端口,但对于一台你几乎不了解的机器,更稳的做法是从主机发现开始,一层层往下扫。

主机发现:先搞清楚网段里谁活着

扫端口之前,先回答一个更基础的问题:这个网段里有哪些机器在线?-sn 只做主机发现,不做端口扫描:

nmap -sn 172.17.0.0/29

nmap -sn 主机发现 docker 网段

输出解读:

  • Nmap done: 8 IP addresses (3 hosts up)——/29 网段共 8 个地址(含网络号与广播地址),只有 3 个有响应;
  • 172.17.0.1 显示为 demo:它反向解析出了主机名(这是宿主机,172.17.0.1 是 Docker 默认的 docker0 网桥地址);
  • 172.17.0.2172.17.0.3 显示 MAC 地址:这是两个正在运行的 Docker 容器(veth 虚拟网卡),MAC 厂商显示 Unknown 很正常——Linux 虚拟网卡的 MAC 是随机生成的,不属于任何已知厂商。

为什么快且准?在同一二层网络里,-sn 默认用 ARP 请求探测(需要有 root 权限):发一个"谁是 172.17.0.2?"的广播,只有真正活着的网卡才会应答。ARP 是链路层协议,不依赖目标开放任何端口,也穿透不了路由器——所以它天然适合局域网和本机容器网段这种"看得见"的环境。

一个云上的坑:如果你在云服务器 VPC 里直接对子网跑 -sn,结果可能很诡异。实测阿里云 VPC 的 172.28.141.96/30 网段,4 个 IP 全部报"在线",但 MAC 地址清一色是 EE:FF:FF:FF:FF:FF——这是云平台对未分配 IP 的代理 ARP 黑洞在替不存在的机器应答。结论:-sn 的主机发现结果在云 VPC 里不可尽信,二层环境(局域网、容器网段)才最干净。

端口扫描:三态模型

确定目标在线后,进入端口扫描。nmap 对每个端口给出三种状态之一:

状态含义
open端口开着,有程序在监听
closed端口关闭,没有程序监听(但主机可达,会回 RST)
filtered被防火墙丢弃了报文,无法确定开没开

注意 filteredclosed 的区别:防火墙挡住的端口可能实际上开着服务——这正是扫描结果要结合防火墙配置理解的原因。

扫描方式上,-sT(TCP connect)走完整三次握手,不需要 root 但最"吵";-sS(SYN 半开扫描)只发 SYN 不完成握手,快且隐蔽,是 root 下的默认方式。本文演示直接进入下一步——把端口扫描和服务识别一起做。

服务指纹:版本号会说话

只看到"80 端口开着"价值有限,真正有用的是"80 端口跑的是 nginx 1.24.0"。-sV(版本探测)会连接端口、交换协议 banner、比对指纹库,给出精确的服务与版本:

nmap -sV -p 22,80,111,631,2049,8080,8081 127.0.0.1

nmap -sV 服务指纹识别

这台测试机上 7 个端口的真实身份一次全部现形,逐行看点很多:

  • 22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.18:版本号里的 3ubuntu13.18 是 Ubuntu 的补丁级后缀——安全更新打过几轮、有没有落后,看这个后缀就知道;
  • 80/tcp open http nginx 1.24.0 (Ubuntu):括号里的 Ubuntu 表明这是 apt 装的原生版 nginx
  • 8080/tcp8081/tcp 也是 nginx,却是 1.31.4——比 80 端口的 1.24.0 新得多,这是容器里跑的 nginx(nginx 主线版迭代快,容器镜像直接带新版);
  • 111/tcp rpcbind2049/tcp nfs_acl:RPC 类服务,括号里的 RPC #100000 是 RPC 程序号,2049 端口通常对应 NFS;
  • 631/tcp CUPS 2.4:打印服务(服务器上装了 CUPS 就会出现,属于可以关闭的面);

最后一行 Service Info: OS: Linux 是 nmap 对整台机器系统的归纳。

为什么版本号重要:版本是漏洞研判的第一手依据。同一台机器上 1.24.0(apt 版)与 1.31.4(容器版)意味着两条不同的漏洞修复线——升级时要分别处理。日常巡检发现某个端口跑着"计划外"的服务、或某服务版本明显落后,这就是攻击面自查的开始。注意 -p 只扫了这 7 个显式指定的端口;不加 -p 则扫默认的 1000 个常用端口(这台机器上还有 3000、8000、8090 等端口开着,这里为演示只挑有代表性的)。

NSE 脚本引擎:在扫描之上开外挂

版本探测已经不错了,但有些信息握手换不来——比如 HTTP 响应头里藏着什么。nmap 的 NSE(Nmap Scripting Engine) 脚本引擎自带大量现成脚本,--script 脚本名 直接调用:

nmap -p 8080 --script http-headers 127.0.0.1

nmap NSE 脚本取 HTTP 响应头

http-headers 脚本向 8080 端口发一个 HEAD 请求,把响应头原样列出来:Server: nginx/1.31.4-sV 的结论互相印证;DateETagLast-Modified 暴露了站点内容的时间信息。这类脚本在排查"这个服务到底是什么、配成了什么样"时非常实用。

NSE 脚本按功能分门别类,常用的几类:

类别作用示例
discovery探测服务细节--script http-headershttp-title
vuln漏洞检测--script vuln
auth认证与弱口令探测--script ssh-auth-methods
broadcast局域网广播探测--script broadcast-ping

脚本本体在 /usr/share/nmap/scripts/,可以随时 grep 看有哪些可用(ls /usr/share/nmap/scripts/ | grep http)。--script 也可以直接指定脚本文件路径,跑自己写的探测逻辑。

四个容易踩的坑

1. filtered 不是"没开"。有防火墙(ufw/云安全组)的机器,未放行的端口会显示 filteredopen|filtered(无法区分)。看到 filtered 先查防火墙规则,别急着下"没开服务"的结论。

2. -O 的 OS 猜测别全信。nmap 的 -O 用 TCP/IP 栈指纹推断操作系统,但新版内核的默认网络参数经常和指纹库里的老样本撞车——实测对一台内核 6.8 的 Ubuntu 24.04 机器,-O 猜成了 Linux 2.6.32(十几年前的内核)。判断系统版本,-sV 的 banner(比如 SSH 的 OpenSSH 9.6p1 Ubuntu ...)比 -O 可靠得多。

3. SERVICE 列只是"猜测表"。端口扫描输出的 SERVICE 名来自 nmap 内置的"端口→常见服务"对照表,不是实测结果。新应用常对不上号:容器应用常见的 3000 端口在这张表里还是老古董 ppp 的登记,实际跑的却是 node。要以 -sV 的实测结果为准。

4. 扫描也要讲礼貌。高频率全端口扫描会占用目标资源、触发防护系统(不少服务器装了 fail2ban,会直接把扫描来源封掉——本站有 Fail2ban 专题)。只扫描自己拥有或有授权的目标,必要时用 -T2 之类降低扫描速率。这是网络工作者的基本素养。

总结

一条实用的排查路径:nmap -sn 确认网段内谁在线 → nmap -sV -p 端口列表 拿到精确服务与版本 → --script 深入探测可疑端口。扫描结果与防火墙规则、进程列表(ss -tlnp)互相印证,一台服务器的网络资产就完全在掌握之中了。

进一步阅读:Nmap 官方文档Nmap 参考指南(主机发现 / 端口扫描 / 版本探测 / NSE 各章节)、NSE 脚本分类目录

发表评论

暂无评论,快来抢沙发吧!