跳转至

14- 端口与服务映射及安全扫描 🔍

前提条件 ✅

  • 已完成 SSH 端口 2222 配置、fail2ban、AppArmor、nftables/ufw 防火墙
  • 系统只暴露必要端口(当前仅 2222/tcp 允许入站)
  • 以 ops 用户登录(具有 sudo 权限)
  • 虚拟机环境:VMware Workstation Pro(建议桥接网络,便于从宿主机扫描)

详细步骤 🛠️

  1. 本地端口与服务自查
    查看当前监听端口和服务映射:
    sudo ss -tulnjp                    # 显示监听端口 + 进程 PID/名称
    sudo ss -tunap                     # 显示所有连接 + 进程
    sudo lsof -i -P -n | grep LISTEN   # 进程视角查看监听
    netstat -tuln                      # 旧工具(Debian 仍可用,但 ss 更推荐)
    

预期输出示例(最小化系统):

Netid  State      Recv-Q Send-Q  Local Address:Port   Peer Address:Port Process
tcp    LISTEN     0      128     0.0.0.0:2222        0.0.0.0:*         users:(("sshd",pid=1234,fd=3))

  1. 安装常用端口扫描工具

    sudo apt update
    sudo apt install -y nmap net-tools
    

  2. 本地扫描自身(快速自检)

    sudo nmap -sT -O localhost          # TCP 连接扫描 + OS 指纹
    sudo nmap -sS -p- localhost         # SYN 半连接扫描全端口(需 root)
    sudo nmap -sV -p 1-65535 localhost  # 服务版本探测
    sudo nmap --script safe localhost   # 运行安全脚本(无破坏性)
    

  3. 从外部(宿主机)扫描虚拟机
    在你的宿主机(Windows/Mac/Linux)安装 nmap 后执行:

    # 替换为实际虚拟机 IP
    nmap -sS -p 1-10000 192.168.1.100
    nmap -sV -O 192.168.1.100
    nmap -A 192.168.1.100               # 全面扫描(OS、服务、脚本)
    nmap --script vuln 192.168.1.100    # 漏洞脚本检测(需时间)
    

预期结果(安全系统): - 只显示 2222/tcp open ssh - 其他端口 filtered 或 closed

  1. 自动化定期端口扫描(生产监控基础)
    创建简单脚本 /opt/security/port-scan.sh:
    sudo nano /opt/security/port-scan.sh
    

内容:

#!/bin/bash
LOGFILE="/var/log/port-scan.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Starting port scan" >> $LOGFILE
nmap -sT -p- --open 192.168.1.100 >> $LOGFILE 2>&1
echo "[$DATE] Scan completed" >> $LOGFILE
echo "---------------------" >> $LOGFILE

赋予权限并测试:

sudo chmod +x /opt/security/port-scan.sh
sudo /opt/security/port-scan.sh
tail /var/log/port-scan.log

添加到 cron 每日运行:

sudo crontab -e
# 添加行:
0 3 * * * /opt/security/port-scan.sh

  1. 其他安全扫描工具推荐(可选安装)
    sudo apt install -y lynis   # 系统安全审计
    sudo apt install -y nikto   # Web 服务扫描(后续章节用)
    sudo lynis audit system     # 运行一次完整审计
    

实践任务 🎯

  1. ss -tulnjp 确认当前系统只监听 2222/tcp 和其他预期端口
  2. 在虚拟机内运行 nmap -sV localhost,记录输出
  3. 从宿主机用 nmap 扫描虚拟机 IP,确认只有 2222 端口开放
  4. 创建 port-scan.sh 脚本并手动运行一次,查看日志是否有意外开放端口

自测问题 ❓

  1. ss -tulnnmap localhost 的输出区别是什么?
  2. 为什么生产环境中推荐使用 -sS(SYN scan)而非 -sT(TCP connect)?
  3. 如果 nmap 显示某个端口 "filtered" 而非 "closed",代表什么情况?
  4. 如何快速判断系统是否意外暴露了不该开的端口?

总结 📌

定期端口扫描是发现配置漂移、未授权服务暴露的第一道警戒线。
结合防火墙“默认拒绝 + 只开必要端口”原则,通过 nmap 自检 + 外部验证 + 自动化日志,形成闭环安全监控。
后续业务服务章节中,每次新增服务后都应立即扫描验证端口暴露情况。