当前位置:首页 > 行业动态 > 正文

个强大的分析网络的shell脚本

该Shell脚本整合tcpdump抓包、awk数据分析及Python可视化,实时监控流量异常,自动生成网络攻击热力图与端口风险报告

在网络安全与系统运维领域,Shell脚本凭借其灵活性和高效性,成为构建强大分析网络的核心工具,通过组合基础命令(如awksedgrep)与网络工具(如tcpdumpngrep),可快速实现流量监控、日志分析、异常检测等功能,以下从数据采集、处理、可视化三个维度,详细解析如何编写高效的网络分析脚本。


基础工具与命令组合

Shell脚本的核心优势在于管道化处理,通过将多个命令串联,实现数据流的逐层过滤与转换,以下是常用工具及其作用:

工具/命令 功能描述
tcpdump 抓取网络包,支持协议过滤(如tcphttp)、主机/IP过滤
ngrep 类似tcpdump,但支持正则表达式匹配,适合文本协议(如HTTP、DNS)分析
awk 按字段分割数据,支持数学运算与条件判断,常用于日志提取与统计
sed 流编辑工具,用于替换、删除特定模式的数据
grep 基于模式匹配的文本搜索工具,支持正则表达式
xargs 将输入转换为命令参数,常用于批量处理
sort/uniq 排序与去重,用于统计频率分析

示例1:捕获HTTP请求并提取URL

#!/bin/bash
# 功能:抓取80端口HTTP请求,提取完整URL并统计访问频率
# 使用tcpdump抓取TCP 80端口数据包,解码为ASCII并提取负载
tcpdump -l -n port 80 | awk '{print $6}' | sed 's/.//g; s/?.//' | sort | uniq -c | sort -nr

原理分析

  1. tcpdump -l -n port 80:持续监听80端口,-l表示每行输出一个包,-n禁用主机名解析。
  2. awk '{print $6}':提取第6列(TCP数据负载)。
  3. sed:去除路径中的目录部分和查询参数,保留核心URL。
  4. sort | uniq -c:统计每个URL出现的次数。
  5. sort -nr:按频率降序排列。

自动化数据采集与存储

网络分析通常需要长期监控,因此脚本需具备定时任务数据持久化能力,以下为关键实现步骤:

  1. 定时任务(Cron Tab)
    通过crontab设置脚本定期执行,例如每分钟采集一次流量数据:

    个强大的分析网络的shell脚本  第1张

     /path/to/script.sh >> /var/log/network_analysis.log
  2. 数据存储设计

    • 平面文件存储:适合小规模数据,使用CSVJSON格式。
    • 数据库存储:对于高频数据,可写入SQLiteMySQL,便于后续查询。

示例2:流量采样与存储

#!/bin/bash
# 功能:每分钟采样网络流量,存储到CSV文件
# 定义输出文件
OUTPUT=/var/log/traffic_$(date +%Y%m%d).csv
# 检查文件是否存在,若不存在则写入表头
if [ ! -f "$OUTPUT" ]; then
    echo "timestamp,src_ip,dst_ip,protocol,length" >> $OUTPUT
fi
# 抓取最近10个包并解析
tcpdump -n -c 10 >> /tmp/raw.log
awk '{split($3,ip,"."); split($5,port,"."); 
    print strftime("%Y-%m-%d %H:%M:%S"),$3,$5,$6,$8}' /tmp/raw.log >> $OUTPUT

优化点

  • 使用strftime生成时间戳,确保时区一致。
  • 通过临时文件/tmp/raw.log避免频繁写入数据库。
  • 字段分割逻辑需根据tcpdump输出调整(如IPv6环境需修改脚本)。

高级分析功能实现

  1. 异常流量检测
    通过统计流量基线,识别突增或可疑模式,检测某IP在1分钟内的请求次数是否超过阈值:

    awk '{count[$2]++} END {for (ip in count) if (count[ip] > 100) print ip, count[ip]}' traffic.log
  2. 协议深度解析
    使用ngreptshark提取特定协议字段,分析DNS查询域名:

    ngrep -d '^[a-zA-Z]' port 53 | awk -F'[():]' '{print $4}' | sort | uniq -c | sort -nr
  3. 可视化与报警

    • 简单可视化:将数据导出为CSV,用Excel或gnuplot生成图表。
    • 实时报警:结合mailssmtp发送邮件通知,或通过ssh推送到监控平台。

示例3:DDoS攻击检测脚本

#!/bin/bash
# 功能:检测同一源IP在10秒内超过50次请求
THRESHOLD=50
TIME_WINDOW=10
CURRENT_TIME=$(date +%s)
# 从日志中提取最近10秒的数据
awk -v time="$CURRENT_TIME" -v window="$TIME_WINDOW" '$1 >= time-window {count[$2]++} END {for (ip in count) if (count[ip] > ENVIRON["THRESHOLD"]) print ip, count[ip]}' /var/log/access.log

性能优化与最佳实践

  1. 减少子进程
    使用xargs-exec替代循环,例如批量处理文件:

    find . -name ".log" | xargs grep "ERROR" >> combined_error.log
  2. 并行处理
    利用&&&&实现多任务并行,但需注意资源竞争(如写入同一文件)。

  3. 日志管理

    • 定期压缩旧日志(gzip)。
    • 使用logrotate配置自动清理。
  4. 模块化设计
    将常用功能封装为函数,

    function extract_url() {
        awk '{print $6}' | sed 's/.//g; s/?.//'
    }

FAQs

Q1:如何提升脚本在高流量环境下的性能?
A1:

  1. 限制采样率:例如tcpdump -c 1000仅捕获前1000个包。
  2. 使用高效工具:优先选择ngrep(正则匹配)而非多次grep
  3. 异步处理:将数据采集与分析分离,例如用命名管道(mkfifo)实现生产者-消费者模型。
  4. 硬件加速:在高速链路上部署专用探针(如libpcap优化)。

Q2:如何确保脚本在断网或权限不足时仍能运行?
A2:

  1. 异常捕获:在关键命令后添加|| echo "Error",记录错误日志。
  2. 权限检查:使用id -u判断是否为root,非root用户改用sudo或受限命令(如tcpdump需root权限)。
  3. 网络状态检测:通过ping -c 1测试连通性,断网时跳过抓包逻辑。
  4. 日志分级:将错误信息写入独立文件(如error.log),避免被墙主日志
0