引言:端口不是打开越多越好
服务器上的每个开放端口,都是潜在的攻击面。运维工程师接手一台新服务器、变更防火墙规则后、上线新服务后,都应该做一次端口安全检查,确认只有必要的端口在监听。
端口扫描是安全自查的第一步,但很多运维工程师对端口安全有以下误区:
认为"防火墙后面"的服务器不需要检查端口
只检查业务端口(80/443),忽视了运维端口(SSH、数据库、Redis)
以为云服务商的安全组能完全替代服务器层面的防火墙
不清楚端口扫描对业务的影响,不敢在生产机执行
本文用nmap工具,从安装、基础扫描、进阶扫描、脚本扫描、结果分析到修复方案,提供一套完整的服务器端口安全自检流程。
第一章:nmap基础与安装
1.1 nmap 是什么
nmap(Network Mapper)是最流行的端口扫描和网络发现工具之一。它可以探测目标主机的端口开放状态、服务版本、操作系统类型等信息,是运维工程师和安全工程师的必备工具。
# 确认是否安装 whichnmap # 如果没有安装 # CentOS / RHEL sudo yum install nmap -y # Ubuntu / Debian sudo apt install nmap -y # macOS brew install nmap # Windows:从 https://nmap.org/download.html 下载安装
1.2 nmap 的扫描原理
nmap 支持多种扫描技术,默认使用 TCP SYN 扫描(也叫半开放扫描):
TCP SYN 扫描(-sS):发送 SYN 包,收到 SYN-ACK 说明端口开放,收到 RST 说明端口关闭。不完成三次握手,对目标影响小,需要 root 权限。
TCP connect 扫描(-sT):完成完整的三次握手。不需要 root,但更容易被检测。
UDP 扫描(-sU):发送 UDP 包,无响应可能端口开放或被防火墙过滤,ICMP Port Unreachable 说明端口关闭。慢但必要。
FIN 扫描(-sF):发送 FIN 包,绕过某些防火墙。
Ping 扫描(-sn):只探测主机是否存活,不扫描端口。
# 查看 nmap 版本和功能 nmap --version # Nmap version 7.94 # 查看 nmap 支持的脚本 ls /usr/share/nmap/scripts/ | wc -l # 数百个 NSE 脚本(nmap scripting engine)
第二章:基础端口扫描
2.1 单端口扫描
# 扫描单个端口是否开放 nmap -p 22 192.168.1.100 # 输出示例: # Starting Nmap 7.94 ( https://nmap.org ) # PORT STATE SERVICE # 22/tcp open ssh # -p 可以指定端口号、端口范围、端口列表 nmap -p 22,80,443 192.168.1.100 # 指定端口列表 nmap -p 22-100 192.168.1.100 # 端口范围 nmap -p -1000 192.168.1.100 # 扫描前 1000 个端口 nmap -p 1-65535 192.168.1.100 # 全端口扫描(1-65535)
2.2 常用端口快速扫描
# 扫描常用端口(nmap 内置端口列表) nmap --top-ports 20 192.168.1.100 # 扫描最常见的 20 个端口 # 常用端口对应服务: # 21 FTP # 22 SSH # 23 Telnet(明文传输,极不安全) # 25 SMTP # 53 DNS # 80 HTTP # 110 POP3 # 143 IMAP # 443 HTTPS # 3306 MySQL # 3389 RDP(Windows 远程桌面) # 5432 PostgreSQL # 6379 Redis # 8080 HTTP 代理(常见于 Java 应用) # 9200 Elasticsearch # 27017 MongoDB
2.3 全端口扫描
# 扫描所有 65535 个端口(需要较长时间) nmap -p 1-65535 -T4 192.168.1.100 # -T4:paranoid(0) sneakey(1) polite(2) normal(3) aggressive(4) insane(5) # 生产环境建议用 -T3 或 -T4,避免对业务网络造成影响 # 更快的扫描:只扫描已知的常用端口子集 nmap -p- -T4 192.168.1.100 # -p- 等价于 -p 1-65535 # 扫描后记录结果供以后对比 nmap -p 1-65535 -oA /tmp/portscan-$(date +%Y%m%d) 192.168.1.100 # -oA 输出三种格式:nmap、XML、grepable
2.4 主机发现与批量扫描
# Ping 扫描:快速确认哪些主机存活 nmap -sn 192.168.1.0/24 # 输出:哪些 IP 在线,响应时间 # 排除特定 IP(不扫描) nmap -sn 192.168.1.0/24 --exclude 192.168.1.1,192.168.1.2 # 批量扫描多个 IP 或 IP 段 nmap -p 22,80,443 192.168.1.100,192.168.1.101,192.168.1.200 # 读取 IP 列表文件扫描 nmap -p 22,80,443 -iL /tmp/servers.txt
第三章:服务版本探测
3.1 识别端口上运行的服务版本
知道端口开放还不够,还要知道运行的是什么版本的服务、是否有已知漏洞。
# -sV 参数:探测服务版本 nmap -sV -p 22,80,443,3306,6379 192.168.1.100 # 输出示例: # PORT STATE SERVICE VERSION # 22/tcp open ssh OpenSSH 8.4 (protocol 2.0) # 80/tcp open http Apache httpd 2.4.51 # 443/tcp open ssl nginx 1.21.4 # 3306/tcp open mysql MySQL 8.0.32 # 6379/tcp open redis Redis 6.0.16 # 为什么要关注版本? # 如果 OpenSSH 8.4 存在已知漏洞(CV-2022-1234),需要立即升级 # 如果 Redis 6.0.16 没有设置密码(permit-empty-passwords),立即修复
3.2 操作系统指纹识别
# -O 参数:识别操作系统类型(需要 root 权限) nmap -O 192.168.1.100 # 输出示例: # OS details: Linux 5.4 (Ubuntu 20.04) # Linux 3.2 - 5.4 # OS CPE: cpe:/olinux_kernel:5.4
3.3 综合扫描(侦察模式)
# -A 参数:综合扫描(OS 检测 + 版本检测 + 路由追踪 + 脚本扫描) nmap -A -T4 192.168.1.100 # 适合对新接手的服务器做一次全面侦察
第四章:nmap脚本扫描(NSE)
4.1 NSE 脚本简介
nmap 脚本引擎(NSE)内置数百个脚本,可以做漏洞检测、弱口令检测、暴力破解检测等。
# 查看所有脚本分类 ls /usr/share/nmap/scripts/ # 脚本分类包括: # auth 认证相关(匿名登录检测) # broadcast 广播发现 # brute 暴力破解 # default 默认脚本集(-sC 时使用) # discovery 服务发现 # dos 拒绝服务检测 # exploit 漏洞利用检测 # external 外部脚本(查询数据库等) # fuzzer 模糊测试 # intrusive 侵入性脚本(可能触发 IDS) # malware 恶意软件检测 # safe 安全脚本 # version 版本识别 # vuln 漏洞检测
4.2 常用脚本扫描
# 使用默认脚本集(最常用) nmap -sC -p 22,80,443,3306,6379 192.168.1.100 # -sC 等价于 --script=default # SSH 安全检测(检查是否存在允许密码登录、允许空密码等安全问题) nmap -p 22 --script ssh-auth-methods 192.168.1.100 # 输出:Supported authentication methods: publickey,password # 如果支持 password 说明可以用密码登录(需要结合其他信息判断是否安全) # MySQL 安全检测 nmap -p 3306 --script mysql-info,mysql-empty-password,mysql-users 192.168.1.100 # Redis 安全检测 nmap -p 6379 --script redis-info,redis-brute 192.168.1.100 # 如果 redis 没有设置密码,redis-info 脚本会直接读取 Redis 信息(严重安全问题) # HTTP 安全检测 nmap -p 80,443 --script http-enum,http-robots.txt,http-title 192.168.1.100 # http-enum:枚举网站目录(可能发现备份文件、管理后台等) # http-title:获取网页标题 # http-robots.txt:查看 robots.txt(可能暴露隐藏目录) # SSL/TLS 安全检测 nmap -p 443 --script ssl-enum-ciphers,ssl-cert,ssl-known-key 192.168.1.100 # ssl-enum-ciphers:枚举支持的加密套件,发现弱加密 # ssl-cert:检查证书信息(过期时间、颁发者、CN 匹配)
4.3 漏洞检测脚本
# 通用漏洞检测 nmap -p 80,443 --script vuln 192.168.1.100 # 使用所有 vuln 分类的脚本(CVEs、RCE 等) # 针对特定漏洞的脚本 nmap -p 22 --script ssh-vuln-*) 192.168.1.100 # 检测 SSH 相关的已知漏洞(如 CVE-2021-41617) nmap -p 443 --script ssl-vuln-*) 192.168.1.100 # 检测 SSL/TLS 相关的已知漏洞(如 Heartbleed、POODLE) # 检测心脏出血漏洞(Heartbleed) nmap -p 443 --script ssl-heartbleed 192.168.1.100 # 检测 Apache Struts RCE(CVE-2017-5638) nmap -p 8080 --script http-vuln-cve2017-5638 192.168.1.100
4.4 暴力破解检测
# 检测 FTP 是否允许匿名登录 nmap -p 21 --script ftp-anon 192.168.1.100 # 如果输出 "Anonymous FTP login allowed" 说明 FTP 允许匿名登录(可能不安全) # 检测 MySQL 是否允许空密码 root 登录 nmap -p 3306 --script mysql-empty-password 192.168.1.100 # Redis 弱密码检测 nmap -p 6379 --script redis-brute 192.168.1.100 # 需要指定用户名/密码字典:--script-args userdb=users.txt,passdb=pass.txt
第五章:生产环境扫描注意事项
5.1 扫描对业务的影响
# nmap 扫描会向目标发送大量数据包,在生产环境可能造成: # 1. 网络带宽占用(大量端口扫描) # 2. IDS/IPS 触发告警(被安全设备拦截) # 3. 服务器负载短暂升高 # 生产环境扫描建议: # 1. 避开业务高峰期 # 2. 使用 -T1 或 -T2(慢速扫描) # 3. 先在测试环境验证扫描命令 # 4. 提前通知安全团队,避免触发 WAF/IDS 告警 # 低速扫描(建议生产环境使用) nmap -T2 -p 1-1000 192.168.1.100 # 使用 -Pn 参数(跳过主机发现,直接扫描) # 如果已知主机在线,使用 -Pn 可以加快扫描 nmap -Pn -T2 -p 1-1000 192.168.1.100
5.2 扫描自己服务器 vs 扫描他人服务器
扫描自己的服务器:完全合法,是常规安全运维操作。
扫描他人服务器:
必须获得书面授权(渗透测试授权书)
未经授权扫描他人服务器是违法行为(计算机犯罪相关法律)
在 CTF 比赛和授权渗透测试场景下是合法的
# 自己服务器:直接扫描 nmap -sT -p 1-1000 localhost # 如果担心扫描影响自己服务器性能,可以在本地使用 SYN 扫描 # SYN 扫描需要 root 权限 sudo nmap -sS -p 1-1000 localhost
5.3 定期扫描计划
# 建立定期扫描机制(建议每月一次) # crontab -e # 0 3 1 * * /usr/local/bin/portscan-check.sh # 每月1日凌晨3点执行端口扫描 #!/bin/bash # /usr/local/bin/portscan-check.sh DATE=$(date +%Y%m%d) LOG_DIR="/var/log/security" SERVERS_FILE="/etc/security/scan-hosts.txt" REPORT="$LOG_DIR/portscan-$DATE.html" mkdir -p$LOG_DIR # 扫描并生成 HTML 报告 nmap -sV -sC -p- -oA"$LOG_DIR/portscan-$DATE"-iL"$SERVERS_FILE" # 检查新增开放端口(和上次扫描对比) if[ -f"$LOG_DIR/portscan-$(date -d '1 month ago' +%Y%m%d).gnmap"];then diff <(grep "Ports:" "$LOG_DIR/portscan-$(date -d '1 month ago' +%Y%m%d).gnmap" | cut -d: -f2) <(grep "Ports:" "$LOG_DIR/portscan-$DATE.gnmap" | cut -d: -f2) || true fi # 发送邮件通知(如果发现新增开放端口) # mail -s "Port Scan Report $DATE" ops@example.com < "$REPORT"
第六章:扫描结果分析与修复
6.1 常见危险端口及风险等级
| 端口 | 服务 | 风险等级 | 风险描述 |
|---|---|---|---|
| 22 | SSH | 中 | 如果允许密码登录且密码弱,容易被暴力破解 |
| 23 | Telnet | 高 | 明文传输,账号密码可被嗅探,极度危险 |
| 445 | SMB | 高 | 永恒之蓝漏洞(CVE-2017-0144),445端口不应暴露 |
| 3306 | MySQL | 中 | 如果对公网开放且无密码或弱密码,数据可被窃取 |
| 6379 | Redis | 高 | 默认无密码,如果对公网开放,可直接读写数据 |
| 27017 | MongoDB | 高 | 默认无认证,如果对公网开放,可直接读写数据 |
| 9200 | Elasticsearch | 高 | 默认无认证,可读写数据甚至执行脚本 |
| 11211 | Memcached | 高 | 无认证,可被用于放大 DDoS 攻击 |
| 8080 | HTTP Alt | 中 | 可能是管理后台或测试接口,可能存在未修复漏洞 |
| 3389 | RDP | 中 | Windows 远程桌面,暴力破解是常见攻击手段 |
6.2 危险端口开放的自查清单
# SSH(22端口)安全检查 nmap -p 22 --script ssh-auth-methods 192.168.1.100 # 如果显示支持 password 登录,建议改为只允许密钥登录 # /etc/ssh/sshd_config # PasswordAuthentication no # PubkeyAuthentication yes sudo systemctl restart sshd # 数据库端口(3306/5432/6379/27017)检查 # 确认只允许内网 IP 访问,不对公网开放 nmap -p 3306,6379 --script redis-info,mysql-info 192.168.1.100 # Memcached(11211)检查 nmap -p 11211 --script memcached-info 192.168.1.100 # 如果对外开放且无认证,不仅数据泄露风险,还有被用于反射 DDoS 的风险 # RDP(3389)检查(Windows 服务器) nmap -p 3389 192.168.1.100 # 建议:用 VPN + 网络策略限制 RDP 只允许 VPN IP 连接
6.3 防火墙配置示例
# iptables 基础防火墙规则(限制 SSH 和业务端口) # /etc/sysconfig/iptables(CentOS/RHEL) # 或 /etc/iptables/rules.v4(Ubuntu/Debian) *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # 允许已建立的连接 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许本地回环 -A INPUT -i lo -j ACCEPT # 允许 SSH(限制来源 IP) -A INPUT -p tcp -s 1.2.3.4/32 --dport 22 -j ACCEPT # 允许 HTTP/HTTPS -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # 拒绝数据库端口(只允许内网访问) -A INPUT -p tcp -s 10.0.0.0/8 --dport 3306 -j ACCEPT -A INPUT -p tcp -s 10.0.0.0/8 --dport 6379 -j ACCEPT # 拒绝其他一切入站 -A INPUT -j DROP COMMIT
6.4 云安全组检查
# 云服务器一定要检查安全组配置 # 以阿里云为例,通过 API 检查安全组规则 # 列出所有安全组 aliyun ecs DescribeSecurityGroups # 列出某个安全组的入方向规则 aliyun ecs DescribeSecurityGroupPolicy --SecurityGroupId sg-xxxxxx --Direction ingress # 常见错误:安全组规则允许 0.0.0.0/0 访问数据库端口 # 正确做法:只允许内网 IP 段或特定 IP 访问
第七章:扫描报告解读与后续行动
7.1 解读 nmap 扫描结果
# 查看上一次扫描的 XML 报告 nmap -oX /tmp/scan.xml 192.168.1.100 # 用 xsltproc 转换成 HTML xsltproc /tmp/scan.xml -o /tmp/scan.html # 或者查看 grepable 格式 nmap -oG /tmp/scan.gnmap 192.168.1.100 grep"Ports:"/tmp/scan.gnmap
7.2 发现高危端口后的处理流程
第一步:确认端口是否必要
# 是业务必需的端口吗? # 这个服务还能不能停掉? # 这个服务是否已经被其他机制保护(如内网隔离)?
第二步:如果是必要的端口,验证访问控制
# 确认防火墙是否生效 # 在外部机器上尝试连接该端口,确认是否真的不通 nmap -p 3306 --script http-robots.txt 1.2.3.4 # 模拟外部访问 # 如果需要从外部访问,确认是否通过跳板机/VPN
第三步:修复方案
| 情况 | 修复方案 |
|---|---|
| 端口非必要且对外开放 | 关闭服务,或用防火墙规则屏蔽 |
| SSH 允许密码登录 | 改为只允许密钥登录,禁用密码认证 |
| Redis 无密码 | 设置强密码,或绑定到内网 IP |
| 管理后台暴露 | 通过 VPN 或 IP 白名单访问 |
| 服务版本有已知漏洞 | 升级到最新稳定版本 |
第四步:记录和复盘
# 记录发现和处理过程 # 记录到安全运维日志或 CMDB # 记录:发现时间、发现方式、处理人、处理时间、处理措施
总结:端口是攻防的第一道门槛
端口安全自检是运维工程师日常安全工作中最基础也最重要的一环。关键原则:
最小化暴露:只开放业务必需的端口,其余全部关闭或用防火墙屏蔽
分层防御:云安全组 + 服务器防火墙 + 服务自身认证,三层保护缺一不可
定期扫描:服务器变更后、新服务上线后、安全事件后都要扫描
版本管理:知道每个开放端口上运行的是什么版本,是否有已知漏洞
访问控制:SSH 密钥登录、数据库强密码、网络层面 IP 白名单
养成每月一次端口扫描的习惯,建立扫描结果基线,新发现端口立即排查。端口不是越多越好,而是越少、越可控越好。
补充一:nmap 指纹识别与操作系统检测深度用法
操作系统指纹识别原理
nmap 通过分析目标的 TCP/IP 协议实现特征(TTL、窗口大小、TCP 选项等)来推断操作系统类型。
# 操作系统指纹识别(需要 root 权限) sudo nmap -O 192.168.1.100 # 输出示例: # OS details: Linux 5.4 (Ubuntu 20.04) # OS CPE: cpe:/olinux_kernel:5.4 # Aggressive OS guesses: Linux 5.4 (94%), Linux 2.6.32 (88%), ... # Note: OS detection is not 100% accurate # 如果 -O 结果不确定,可以用 -A(综合扫描) sudo nmap -A -T4 192.168.1.100 # -A 包含:OS 检测 (-O)、版本检测 (-sV)、traceroute、脚本扫描 (-sC)
nmap 服务指纹识别
# 特定端口的版本检测 nmap -sV -p 22,80,443 192.168.1.100 # 指定服务指纹数据库路径(如果需要更新指纹) nmap --script-args='db=/path/to/nmap-service-fingerprints'-sV -p 22 192.168.1.100 # 深入检测(-sV --version-intensity 9) nmap -sV --version-intensity 9 -p 80 192.168.1.100 # intensity 0-9,越高越详细但越慢 # 轻量检测(快速) nmap -sV --version-intensity 0 -p 22 192.168.1.100
通过端口指纹识别隐藏服务
有些服务故意隐藏端口,但仍有特征可循:
# 识别隐藏的 Redis 端口(即使端口被改过) nmap -sV -p 1-65535 192.168.1.100 | grep -i redis # Redis 会在任何端口返回 +PONG # 识别隐藏的 SSH(通常在非标准端口) nmap -sV -p 1-65535 192.168.1.100 | grep -i"ssh.*OpenSSH" # 识别 HTTP 服务(即使改了端口) nmap -sV -p 1-65535 192.168.1.100 | grep -E"http|Apache|nginx|IIS"
补充二:常见CVE漏洞的nmap扫描
OpenSSH 漏洞扫描
# 扫描 SSH 已知漏洞 nmap -p 22 --script ssh-vuln-*) 192.168.1.100 # 会自动运行所有 ssh-vuln-* 脚本 # 单独检测特定漏洞 nmap -p 22 --script ssh-vuln-cve-2021-41617 192.168.1.100 # CVE-2021-41617:OpenSSH <= 8.7 存在 pre-auth 远程代码执行漏洞 # 如果检测到漏洞,立即升级 OpenSSH apt update && apt install openssh-server -y systemctl restart sshd
OpenSSL 漏洞扫描
# 检测 SSL/TLS 漏洞 nmap -p 443 --script ssl-heartbleed 192.168.1.100 # Heartbleed(CVE-2014-0160):OpenSSL 1.0.1 - 1.0.1f nmap -p 443 --script ssl-poodle 192.168.1.100 # POODLE(CVE-2014-3566):SSL 3.0 漏洞 nmap -p 443 --script ssl-dh-params 192.168.1.100 # Logjam(CVE-2015-4000):DH 参数过短 nmap -p 443 --script ssl-enum-ciphers 192.168.1.100 # 枚举所有支持的加密套件,检查弱加密
HTTP 服务漏洞扫描
# 检测 Web 服务器版本漏洞 nmap -p 80,443 --script http-vuln-* 192.168.1.100 # 常用 HTTP 漏洞脚本 # http-vuln-cve2017-5638:Apache Struts RCE # http-vuln-cve2017-12617:Apache Tomcat RCE # http-vuln-cve2015-1635:IIS RCE # http-vuln-cve2013-6786:Apache 2.4.6 提权漏洞 # http-vuln-cve2012-1823:PHP CGI RCE # 检测 Apache Struts nmap -p 8080 --script http-vuln-cve2017-5638 192.168.1.100 # 检测 Tomcat nmap -p 8080 --script http-vuln-cve2017-12617 192.168.1.100
数据库漏洞扫描
# MySQL 漏洞 nmap -p 3306 --script mysql-vuln-* 192.168.1.100 # mysql-vuln-cve2012-2122:MySQL 认证绕过漏洞 # Redis 漏洞 nmap -p 6379 --script redis-vuln-* 192.168.1.100 # Redis 未授权访问漏洞(最常见) # PostgreSQL 漏洞 nmap -p 5432 --script pgsql-vuln-* 192.168.1.100 # MongoDB 漏洞 nmap -p 27017 --script mongodb-vuln-* 192.168.1.100
补充三:内网渗透测试场景(授权范围内)
内网横向移动识别
# 在授权的渗透测试范围内,使用 nmap 做横向移动探测
# 1. 扫描内网存活主机
nmap -sn 10.0.0.0/24 -oG - | grep"Up$"| cut -d" "-f2
# 2. 快速端口扫描(常见服务端口)
nmap -F -T4 10.0.0.0/24 -oG - | grep"Ports:"|
awk -F"Ports: "'{print $2}'| cut -d" "-f1 |
tr',''
'| sort -u | head -30
# 3. 全端口扫描内网重点目标
foripin10.0.0.1 10.0.0.10 10.0.0.50;do
echo"=== Scanning$ip==="
nmap -sV -sC -p 1-65535 -oA /tmp/scan-$ip$ip
done
网络设备扫描
# 路由器、交换机、防火墙通常开放 Telnet(23)、SSH(22)、SNMP(161) # 扫描网络设备 nmap -sV -p 22,23,161,162 192.168.1.0/24 -oG - | grep"Host:"| grep -v"22/open|23/open|161/open" # SNMP 社区名爆破(默认 community string 是 "public") nmap -sU -p 161 --script snmp-brute 192.168.1.1 # 社区名爆破字典 # /usr/share/nmap/nselib/data/snmpcommunities.txt
补充四:扫描结果自动化报告
#!/bin/bash
# nmap-security-report.sh
# 用途:自动扫描并生成 HTML 报告
TARGET="${1:-localhost}"
OUTPUT_DIR="/var/www/html/nmap-reports"
DATE=$(date +%Y%m%d)
mkdir -p$OUTPUT_DIR
echo"Scanning$TARGET..."
# 1. 快速扫描(常用端口)
nmap -sV -sC -F -T4 -oA"$OUTPUT_DIR/quick-$DATE""$TARGET"
# 2. 全端口扫描
nmap -sV -p- -T2 -oA"$OUTPUT_DIR/full-$DATE""$TARGET"
# -T2 用于全端口扫描,减少对目标的影响
# 3. 漏洞扫描(重点端口)
nmap -sV --script vuln -p 22,80,443,3306,5432,6379,8080 -oA"$OUTPUT_DIR/vuln-$DATE""$TARGET"
# 4. 生成 HTML 报告
xsltproc"$OUTPUT_DIR/quick-$DATE.xml"-o"$OUTPUT_DIR/quick-$DATE.html"
xsltproc"$OUTPUT_DIR/vuln-$DATE.xml"-o"$OUTPUT_DIR/vuln-$DATE.html"
# 5. 对比上次扫描(检测新增端口)
if[ -f"$OUTPUT_DIR/full-$(date -d '1 month ago' +%Y%m%d).gnmap"];then
echo"=== 新增端口 ===">"$OUTPUT_DIR/changes-$DATE.txt"
diff <(grep "Ports:" "$OUTPUT_DIR/full-$(date -d '1 month ago' +%Y%m%d).gnmap" | cut -d: -f2)
<(grep "Ports:" "$OUTPUT_DIR/full-$DATE.gnmap" | cut -d: -f2)
>>"$OUTPUT_DIR/changes-$DATE.txt"||true
fi
echo"Reports generated:"
ls -la"$OUTPUT_DIR"/*-$DATE.*
补充五:nmap 参数速查表
| 参数 | 含义 | 场景 |
|---|---|---|
| -sn | Ping 扫描(只探测主机存活) | 快速发现内网主机 |
| -sS | TCP SYN 扫描(半开放) | 默认扫描方式,需要 root |
| -sT | TCP connect 扫描(完成三次握手) | 无 root 权限时使用 |
| -sU | UDP 扫描 | 扫描 DNS、SNMP 等 UDP 服务 |
| -sV | 版本检测 | 识别服务版本 |
| -O | 操作系统检测 | 需要 root,识别 OS 类型 |
| -A | 综合扫描 | 全面侦察(慢) |
| -sC | 默认脚本扫描 | 使用默认 NSE 脚本 |
| --script=vuln | 漏洞扫描 | 检测已知 CVE |
| -p 1-1000 | 指定端口范围 | 常用端口扫描 |
| -p- | 所有端口(1-65535) | 全端口扫描 |
| -p 22,80,443 | 指定端口列表 | 重点端口扫描 |
| -T1~5 | 扫描速度 | 生产环境建议 T2-T3 |
| -oA | 输出所有格式 | 保存扫描结果 |
| -iL | 从文件读取目标 | 批量扫描 |
| --exclude | 排除目标 | 排除重要主机 |
| -6 | IPv6 扫描 | IPv6 环境 |
# 常用命令速查 # 本机安全自检 nmap -sT -sV -sC -F localhost # 快速扫描(1-1000 端口) nmap -sV -sC -F 192.168.1.100 # 全端口扫描(慢速,适合夜间) nmap -sV -p- -T2 -oA full-scan 192.168.1.100 # 漏洞扫描 nmap -sV --script vuln -p 22,80,443,3306,6379 192.168.1.100 # 内网主机发现 nmap -sn 192.168.1.0/24 # 批量扫描 nmap -sV -sC -F -iL servers.txt
补充六:端口与服务对应关系速查表
| 端口 | 服务 | 风险说明 | 建议处理 |
|---|---|---|---|
| 21 | FTP | 明文传输,匿名登录风险 | 禁用或使用 SFTP |
| 22 | SSH | 暴力破解风险 | 密钥登录,禁用密码,限制来源 IP |
| 23 | Telnet | 明文传输,危险 | 立即禁用 |
| 25 | SMTP | 开放中继风险 | 限制为指定邮件服务器 |
| 53 | DNS | DNS 毒化风险 | 只允许递归查询来自内网 |
| 80 | HTTP | Web 服务 | 配置 HTTPS,关闭不必要路径 |
| 110 | POP3 | 明文邮件接收 | 禁用或使用 POP3S |
| 135-139,445 | SMB/NetBIOS | 永恒之蓝漏洞 | 防火墙屏蔽或升级 |
| 143 | IMAP | 明文邮件协议 | 禁用或使用 IMAPS |
| 389 | LDAP | 明文目录查询 | 禁用或使用 LDAPS |
| 443 | HTTPS | Web 服务(加密) | 正确配置证书 |
| 465 | SMTPS | 加密 SMTP | 使用 |
| 587 | SMTP Submission | 邮件提交端口 | 使用 |
| 636 | LDAPS | 加密 LDAP | 使用 |
| 1433 | MS SQL | 数据库端口 | 只允许内网访问 |
| 1521 | Oracle DB | 数据库端口 | 只允许内网访问 |
| 3306 | MySQL | 数据库端口 | 只允许内网访问,禁用远程 root |
| 3389 | RDP | Windows 远程桌面 | 限制来源 IP,启用 NLA |
| 5432 | PostgreSQL | 数据库端口 | 只允许内网访问 |
| 5900 | VNC | 远程桌面 | 禁用或使用 SSH 隧道 |
| 5985 | WinRM HTTP | Windows 远程管理 | 限制来源 IP |
| 5986 | WinRM HTTPS | Windows 远程管理 | 使用 |
| 6379 | Redis | 缓存/存储端口 | 只允许内网访问,设置密码 |
| 8080 | HTTP Alt | 常见 Java 应用 | 确认是否为管理后台 |
| 8443 | HTTPS Alt | 常见管理后台 | 确认访问控制 |
| 9200 | Elasticsearch | 搜索引擎端口 | 禁用或绑定内网 |
| 27017 | MongoDB | NoSQL 数据库 | 禁用或绑定内网 |
| 27018 | MongoDB | MongoDB shard | 禁用或绑定内网 |
补充七:扫描前的准备与扫描后的验证
扫描前的准备
# 1. 确认扫描授权(必须获得书面授权) # 2. 通知安全团队(避免触发 IDS/IPS 告警) # 3. 选择合适的时间(避开业务高峰期) # 4. 准备目标清单 cat > /tmp/scan-hosts.txt <<'EOF' 192.168.1.100 192.168.1.101 10.0.0.50 EOF # 5. 在测试环境验证扫描命令 # 先在测试服务器执行,确认无误后再扫描生产环境 nmap -sV -sC -F test-server.internal
扫描后的验证
# 1. 验证所有发现都对应已知的业务需求 # 对每个开放的端口,问自己:这个端口必须对网络可达吗? # 2. 对比历史扫描基线 # 发现新端口?立即排查:是正常变更还是异常开放? # 3. 检查开放端口的服务版本 # 版本是否有已知漏洞? # nmap -sV -p 端口 目标IP # 4. 生成修复计划 # 根据风险等级排序: # 高危(立即修复):RDP/SSH 开放公网、数据库开放公网、存在已知 CVE 漏洞 # 中危(本周修复):非必要端口开放、弱加密协议 # 低危(下月修复):可以优化但不紧急的配置

-
服务器
+关注
关注
14文章
10426浏览量
91835 -
防火墙
+关注
关注
0文章
450浏览量
36775 -
端口
+关注
关注
4文章
1115浏览量
34070
原文标题:小心你的开放端口!用nmap给服务器做一次全面安全自检
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
服务器端模式下的TCP通信
使用nmap工具的服务器端口安全自检流程
评论