本文要点
- 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 网络扫描:端口是服务器的门
一台服务器对外到底开了哪些门?这个问题既关乎安全(每多一个开放端口就多一块攻击面),也关乎运维(服务起没起来、版本该不该升级)。没有工具时,你只能对着已知的端口列表逐个 curl、nc 去试探——不知道的端口呢?
nmap(Network Mapper)就是为回答这个问题而生的:它从主机发现开始,到端口扫描、服务指纹识别,再到脚本级探测,一条命令就能把一台机器的"网络家底"摸清楚。本文在一台 Ubuntu 24.04 服务器上完整演示扫描的三个层次,全部输出均为真实执行结果。
安装与基本用法
apt install -y nmap
nmap --versionUbuntu 软件源里的 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 done: 8 IP addresses (3 hosts up)——/29网段共 8 个地址(含网络号与广播地址),只有 3 个有响应;172.17.0.1显示为demo:它反向解析出了主机名(这是宿主机,172.17.0.1是 Docker 默认的docker0网桥地址);172.17.0.2、172.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 | 被防火墙丢弃了报文,无法确定开没开 |
注意 filtered 和 closed 的区别:防火墙挡住的端口可能实际上开着服务——这正是扫描结果要结合防火墙配置理解的原因。
扫描方式上,-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
这台测试机上 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/tcp、8081/tcp也是 nginx,却是1.31.4——比 80 端口的 1.24.0 新得多,这是容器里跑的 nginx(nginx 主线版迭代快,容器镜像直接带新版);111/tcp rpcbind、2049/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
http-headers 脚本向 8080 端口发一个 HEAD 请求,把响应头原样列出来:Server: nginx/1.31.4 与 -sV 的结论互相印证;Date、ETag、Last-Modified 暴露了站点内容的时间信息。这类脚本在排查"这个服务到底是什么、配成了什么样"时非常实用。
NSE 脚本按功能分门别类,常用的几类:
| 类别 | 作用 | 示例 |
|---|---|---|
discovery | 探测服务细节 | --script http-headers、http-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/云安全组)的机器,未放行的端口会显示 filtered 或 open|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 脚本分类目录。
评论 (0)
暂无评论,快来抢沙发吧!