当前位置: 首页 > news >正文

系统网络端口安全扫描脚本及详解

#!/bin/bash
# 系统服务端口安全扫描 - 修正版echo "=== 系统服务端口安全扫描报告 ==="# 1. 高风险端口识别
echo "⚠️  对外开放的高风险端口:"
awk '
/0.0.0.0:21/ {print "  端口 21 - FTP (明文传输)\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:23/ {print "  端口 23 - Telnet (明文传输)\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:135/ {print "  端口 135 - RPC Endpoint Mapper\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:445/ {print "  端口 445 - SMB/CIFS\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:3306/ {print "  端口 3306 - MySQL数据库\n    ⚠️  对所有IP开放,建议限制访问IP"}
/0.0.0.0:27017/ {print "  端口 27017 - MongoDB数据库\n    ⚠️  对所有IP开放,建议限制访问IP"}
' netstat_output.txt# 2. 端口绑定分析
echo -e "\n=== 端口绑定分析 ==="
all_interfaces=$(grep "0.0.0.0:" netstat_output.txt | wc -l)
localhost_only=$(grep "127.0.0.1:" netstat_output.txt | wc -l)
specific_ip=$(grep -E "(192\.168\.|10\.|172\.)" netstat_output.txt | wc -l)echo "  对所有接口开放的端口数: $all_interfaces"
echo "  仅本地访问的端口数: $localhost_only"
echo "  绑定特定IP的端口数: $specific_ip"echo "  对外开放的端口:"
grep "0.0.0.0:" netstat_output.txt | awk '{split($4, a, ":"); print "    - " a[2]}' | sort -n | uniq# 3. 数据库服务检查
echo -e "\n=== 数据库服务检查 ==="
if grep -q "0.0.0.0:3306" netstat_output.txt; thenecho "  ✅ MySQL服务运行中"echo "    ⚠️  建议配置bind-address限制访问"
fiif grep -q "0.0.0.0:6379" netstat_output.txt; thenecho "  ✅ Redis服务运行中"
fiif grep -q "0.0.0.0:27017" netstat_output.txt; thenecho "  ✅ MongoDB服务运行中"echo "    ⚠️  建议配置bindIp和认证"
fi# 4. 服务关联分析
echo -e "\n=== 服务关联分析 ==="
web_ports=$(grep -c "0.0.0.0:80\|0.0.0.0:443" netstat_output.txt)
ssh_ports=$(grep -c "0.0.0.0:22" netstat_output.txt)
db_ports=$(grep -c "0.0.0.0:3306\|0.0.0.0:27017\|0.0.0.0:5432" netstat_output.txt)echo "  Web服务端口: $web_ports 个"
echo "  SSH服务端口: $ssh_ports 个"
echo "  数据库端口: $db_ports 个"# 5. 安全建议
echo -e "\n=== 安全建议 ==="# 修正原来的awk语法错误
high_risk_ports=$(grep "0.0.0.0:" netstat_output.txt | awk '{split($4, a, ":"); print a[2]}' | grep -E "^(23|21|135|445|3389|5900)$" | wc -l)if [[ $high_risk_ports -gt 0 ]]; thenecho "  ❌ 发现 $high_risk_ports 个高风险端口对外开放"echo "  🔒 建议立即采取以下措施:"echo "    - 使用防火墙限制高风险端口访问"echo "    - 配置服务仅监听必要IP地址"echo "    - 考虑关闭非必要服务"
elseecho "  ✅ 未发现明显的高风险端口"
fi# 检查是否所有端口都对所有接口开放
if [[ $all_interfaces -gt 5 ]]; thenecho "  ⚠️  过多端口对所有接口开放 ($all_interfaces 个)"echo "  🔧 建议配置服务绑定到特定IP地址"
fi# 提供具体的优化建议
echo "  💡 具体优化建议:"
echo "    - MySQL: 配置 bind-address=127.0.0.1 或特定IP"
echo "    - Redis: 配置 bind 127.0.0.1"
echo "    - MongoDB: 配置 bindIp 和启用认证"
echo "    - 使用iptables或firewalld配置访问控制策略"
echo "    - 定期扫描开放端口,确保符合安全策略"# 6. 监控建议
echo -e "\n=== 监控建议 ==="
echo "  📊 建议监控以下指标:"
echo "    - 端口开放情况变化"
echo "    - 异常连接尝试"
echo "    - 服务访问日志"
echo "    - 端口扫描活动"echo -e "\n=== 扫描完成 ==="
echo "建议定期执行端口安全扫描,及时发现和修复安全风险"

代码详解

#!/bin/bash
  • 解释:指定脚本解释器为bash,是 Linux 脚本的标准开头,确保脚本可直接执行。
# 系统服务端口安全扫描 - 修正版
echo "=== 系统服务端口安全扫描报告 ==="
  • 解释
    • 注释说明脚本功能(系统服务端口安全扫描,且为修正版)。
    • 输出扫描报告的标题,明确脚本的核心目的是生成安全扫描报告。
# 1. 高风险端口识别
echo "⚠️  对外开放的高风险端口:"
  • 解释
    • 注释标记第一部分功能(识别高风险端口)。
    • 输出提示信息,告知用户接下来将展示对外开放的高风险端口。
awk '
/0.0.0.0:21/ {print "  端口 21 - FTP (明文传输)\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:23/ {print "  端口 23 - Telnet (明文传输)\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:135/ {print "  端口 135 - RPC Endpoint Mapper\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:445/ {print "  端口 445 - SMB/CIFS\n    🚨 严重安全风险,建议关闭或限制访问"}
/0.0.0.0:3306/ {print "  端口 3306 - MySQL数据库\n    ⚠️  对所有IP开放,建议限制访问IP"}
/0.0.0.0:27017/ {print "  端口 27017 - MongoDB数据库\n    ⚠️  对所有IP开放,建议限制访问IP"}
' netstat_output.txt
  • 解释
    • 使用awk工具处理netstat_output.txt(端口监听状态文件)。
    • 匹配规则:当文件中出现 “0.0.0.0:端口号”(表示端口对外开放)时,输出对应端口的服务名称、风险等级及建议。
    • 目的:精准定位常见高风险端口的对外开放情况,并直观展示风险。
# 2. 端口绑定分析
echo -e "\n=== 端口绑定分析 ==="
  • 解释
    • 注释标记第二部分功能(分析端口绑定情况)。
    • 输出标题,-e允许解析转义字符\n,实现换行分隔不同部分。
all_interfaces=$(grep "0.0.0.0:" netstat_output.txt | wc -l)
localhost_only=$(grep "127.0.0.1:" netstat_output.txt | wc -l)
specific_ip=$(grep -E "(192\.168\.|10\.|172\.)" netstat_output.txt | wc -l)
  • 解释
    • 定义变量统计不同绑定类型的端口数量:
      • all_interfaces:统计对外开放(绑定0.0.0.0)的端口数(grep筛选后用wc -l计数)。
      • localhost_only:统计仅本地访问(绑定127.0.0.1)的端口数。
      • specific_ip:统计绑定内网 IP(192.168.、10.、172. 开头)的端口数。
echo "  对所有接口开放的端口数: $all_interfaces"
echo "  仅本地访问的端口数: $localhost_only"
echo "  绑定特定IP的端口数: $specific_ip"
  • 解释:输出上述统计结果,直观展示端口绑定的分布情况。
echo "  对外开放的端口:"
grep "0.0.0.0:" netstat_output.txt | awk '{split($4, a, ":"); print "    - " a[2]}' | sort -n | uniq
  • 解释
    • 筛选对外开放的端口,用awksplit函数从监听地址中提取端口号。
    • sort -n按数字排序,uniq去重,最终列出所有对外开放的端口号。
# 3. 数据库服务检查
echo -e "\n=== 数据库服务检查 ==="
  • 解释
    • 注释标记第三部分功能(检查数据库服务端口)。
    • 输出标题,分隔不同分析模块。
if grep -q "0.0.0.0:3306" netstat_output.txt; thenecho "  ✅ MySQL服务运行中"echo "    ⚠️  建议配置bind-address限制访问"
fi
  • 解释
    • grep -q静默检查是否存在对外开放的 MySQL 端口(3306),若存在则输出服务运行状态及安全建议(限制访问 IP)。
if grep -q "0.0.0.0:6379" netstat_output.txt; thenecho "  ✅ Redis服务运行中"
fi
  • 解释:检查对外开放的 Redis 端口(6379),若存在则提示服务运行中(Redis 默认无认证,风险隐含在后续建议中)。
if grep -q "0.0.0.0:27017" netstat_output.txt; thenecho "  ✅ MongoDB服务运行中"echo "    ⚠️  建议配置bindIp和认证"
fi
  • 解释:检查对外开放的 MongoDB 端口(27017),若存在则输出服务状态及建议(限制 IP + 启用认证)。
# 4. 服务关联分析
echo -e "\n=== 服务关联分析 ==="
  • 解释
    • 注释标记第四部分功能(关联服务与端口)。
    • 输出标题,分析不同类型服务的端口开放情况。
web_ports=$(grep -c "0.0.0.0:80\|0.0.0.0:443" netstat_output.txt)
ssh_ports=$(grep -c "0.0.0.0:22" netstat_output.txt)
db_ports=$(grep -c "0.0.0.0:3306\|0.0.0.0:27017\|0.0.0.0:5432" netstat_output.txt)
  • 解释
    • 统计不同服务类型的对外开放端口数:
      • web_ports:Web 服务(80/443 端口)数量(\|表示 “或”)。
      • ssh_ports:SSH 服务(22 端口)数量。
      • db_ports:数据库服务(MySQL/3306、MongoDB/27017、PostgreSQL/5432)数量。
echo "  Web服务端口: $web_ports 个"
echo "  SSH服务端口: $ssh_ports 个"
echo "  数据库端口: $db_ports 个"
  • 解释:输出服务关联的端口数量,从业务维度汇总端口开放数据。
# 5. 安全建议
echo -e "\n=== 安全建议 ==="
  • 解释
    • 注释标记第五部分功能(生成安全建议)。
    • 输出标题,基于前文分析提供可执行的安全措施。
  • 解释
    • 提取所有对外开放的端口号,筛选出高风险端口(21/23/135/445 等),统计数量并赋值给high_risk_ports
if [[ $high_risk_ports -gt 0 ]]; thenecho "  ❌ 发现 $high_risk_ports 个高风险端口对外开放"echo "  🔒 建议立即采取以下措施:"echo "    - 使用防火墙限制高风险端口访问"echo "    - 配置服务仅监听必要IP地址"echo "    - 考虑关闭非必要服务"
elseecho "  ✅ 未发现明显的高风险端口"
fi
  • 解释:根据高风险端口数量输出对应提示:若存在高风险端口,给出防火墙限制、端口绑定、关闭服务等建议;否则提示无明显风险。
if [[ $all_interfaces -gt 5 ]]; thenecho "  ⚠️  过多端口对所有接口开放 ($all_interfaces 个)"echo "  🔧 建议配置服务绑定到特定IP地址"
fi
  • 解释:若对外开放的端口数超过 5 个,提示风险并建议绑定特定 IP(减少暴露面)。
echo "  💡 具体优化建议:"
echo "    - MySQL: 配置 bind-address=127.0.0.1 或特定IP"
echo "    - Redis: 配置 bind 127.0.0.1"
echo "    - MongoDB: 配置 bindIp 和启用认证"
echo "    - 使用iptables或firewalld配置访问控制策略"
echo "    - 定期扫描开放端口,确保符合安全策略"
  • 解释:针对关键服务(MySQL/Redis/MongoDB)给出具体配置建议,同时提供通用措施(防火墙、定期扫描)。
# 6. 监控建议
echo -e "\n=== 监控建议 ==="
echo "  📊 建议监控以下指标:"
echo "    - 端口开放情况变化"
echo "    - 异常连接尝试"
echo "    - 服务访问日志"
echo "    - 端口扫描活动"
  • 解释
    • 注释标记第六部分功能(提供监控建议)。
    • 输出需长期监控的指标,确保端口安全状态可追踪。
echo -e "\n=== 扫描完成 ==="
echo "建议定期执行端口安全扫描,及时发现和修复安全风险"
  • 解释:脚本结束提示,强调定期扫描的重要性(持续安全保障)。

结语

对于刚学完shell的同学,不妨不看解释先自行分析一下。

http://www.dtcms.com/a/320944.html

相关文章:

  • SpringBoot激活指定profile的方式
  • linux统计文本文件中行数、单词数和字节数的命令行工具wc介绍
  • 深入解析Linux信号处理机制
  • Linux软硬链接与动静态库
  • MQTT与服务器通讯
  • LINUX88 变量:命令定义;普通数组定义(复);declare -i /-x
  • 接口返回504 Gateway Time-out 错误,这意味着请求在网关或代理服务器等待上游服务器响应时超时。以下是可能的原因和排查建议:
  • Day01 项目概述,环境搭建
  • 「iOS」————NSOperation
  • Java对象与JSON互转
  • iOS混淆工具有哪些?跨平台 App 混淆与保护的实用方案
  • Android初学者系统开发学习路线参考
  • 构建高可用架构:ZDNS GSLB 在多数据中心场景下的应用与 F5 替换实践
  • [element-plus] flex布局 el-table表格设置百分比高度失效
  • 项目实战三:DPDK
  • el-image-viewer组件在el-table使用时层级异常问题解决
  • 无人机如何靠陀螺仪保持稳定飞行?
  • 无人机教育热潮下,超优航空如何为青少年插上科技翅膀?
  • 协同进化:AIGC、Agent和MCP如何相互促进共同发展
  • 使用Python提取PDF大纲(书签)完整指南
  • Java基础-模拟多线程安全问题场景
  • Track Any Anomalous Object: A Granular Video Anomaly Detection Pipeline
  • tmi8150b设置电机速度有两个地方,x轴电机,y轴电机,具体如下
  • 13. 搜索引擎-ElasticSearch
  • (已解决)Mac 终端上配置代理
  • 机器学习支持向量机(SVM)
  • C++使用FFmpeg进行视频推流
  • conda或mamba install 相关软件报错
  • GraphRAG 入门教程:从原理到实战
  • 【概率论】均匀分布的伪随机数