`
hongtoushizi
  • 浏览: 375735 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

网络分析shell脚本(实时流量+连接统计)

阅读更多

介绍一个强大的分析网络的shell脚本,此脚本是从EZHTTP拆分出来的,觉得有必要单独介绍下。
脚本运行效果截图:
连接概览1

连接概览2

实时流量
此脚本包含的功能有:

  • 1、实时监控任意网卡的流量
  • 2、统计10秒内平均流量
  • 3、统计每个端口在10秒内的平均流量,基于客户端和服务端端口统计。可以看出哪些端口占流量比较大,对于web服务器,一般是80端口。其它端口受到攻击时,也有可能其它端口流量比较大。所以此功能可以帮助我们端口流量是否正常。
  • 4、统计在10s内占用带宽最大的前10个ip。此项功能可以帮助我们来查出是否有恶意占用带宽的ip。
  • 5、统计连接状态。此项功能可以让我们看出哪些连接状态比较大。如果SYN-RECV状态比较多的话,有可以受到半连接攻击。如果ESTABLISED非常大,但通过日志发现没有那么多请求,或者通过tcpdump发现大量ip只建立连接不请求数据的话,可能是受到了全连接攻击,这时候如果你使用的是nginx服务器,可以在配置文件增加listen 80 deferred来防止。
  • 6、统计各端口连接状态。当可能受到攻击时,此项功能可以帮助我们发现是哪个端口受到攻击。
  • 7、统计端口为80且状态为ESTAB连接数最多的前10个IP。此项功能可以帮助我们来找出创建连接过多的Ip,进而屏蔽。
  • 8、统计端口为80且状态为SYN-RECV连接数最多的前10个IP。当受到半连接攻击时,此项功能可以帮助我们找到恶意ip。

用到的网络分析工具:

  • 1、tcpdump:此脚本用tcpdump来统计基于ip或基于端口的流量。
  • 2、ss: 此脚本用ss命令来统计连接状态,实际使用发现ss比netstat高效得多。
  • 3、/proc/net/dev,用来统计指定网卡的流量。

脚本下载地址:https://www.centos.bz/wp-content/uploads/2014/06/network-analysis.sh
下面贴出完整的脚本:

  1. #!/bin/bash
  2.  
  3. #write by zhumaohai(admin#centos.bz)
  4. #author blog: www.centos.bz
  5.  
  6.  
  7. #显示菜单(单选)
  8. display_menu(){
  9. local soft=$1
  10. local prompt="which ${soft} you'd select: "
  11. eval local arr=(\${${soft}_arr[@]})
  12. while true
  13. do
  14.     echo -e "#################### ${soft} setting ####################\n\n"
  15.     for ((i=1;i<=${#arr[@]};i++ )); do echo -e "$i) ${arr[$i-1]}"; done
  16.     echo
  17.     read -p "${prompt}" $soft
  18.     eval local select=\$$soft
  19.     if [ "$select" == "" ] || [ "${arr[$soft-1]}" == ""  ];then
  20.         prompt="input errors,please input a number: "
  21.     else
  22.         eval $soft=${arr[$soft-1]}
  23.         eval echo "your selection: \$$soft"             
  24.         break
  25.     fi
  26. done
  27. }
  28.  
  29. #把带宽bit单位转换为人类可读单位
  30. bit_to_human_readable(){
  31.     #input bit value
  32.     local trafficValue=$1
  33.  
  34.     if [[ ${trafficValue%.*} -gt 922 ]];then
  35.         #conv to Kb
  36.         trafficValue=`awk -v value=$trafficValue 'BEGIN{printf "%0.1f",value/1024}'`
  37.         if [[ ${trafficValue%.*} -gt 922 ]];then
  38.             #conv to Mb
  39.             trafficValue=`awk -v value=$trafficValue 'BEGIN{printf "%0.1f",value/1024}'`
  40.             echo "${trafficValue}Mb"
  41.         else
  42.             echo "${trafficValue}Kb"
  43.         fi
  44.     else
  45.         echo "${trafficValue}b"
  46.     fi
  47. }
  48.  
  49. #判断包管理工具
  50. check_package_manager(){
  51.     local manager=$1
  52.     local systemPackage=''
  53.     if cat /etc/issue | grep -q -E -i "ubuntu|debian";then
  54.         systemPackage='apt'
  55.     elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat";then
  56.         systemPackage='yum'
  57.     elif cat /proc/version | grep -q -E -i "ubuntu|debian";then
  58.         systemPackage='apt'
  59.     elif cat /proc/version | grep -q -E -i "centos|red hat|redhat";then
  60.         systemPackage='yum'
  61.     else
  62.         echo "unkonw"
  63.     fi
  64.  
  65.     if [ "$manager" == "$systemPackage" ];then
  66.         return 0
  67.     else
  68.         return 1
  69.     fi   
  70. }
  71.  
  72.  
  73. #实时流量
  74. realTimeTraffic(){
  75.     local eth=""
  76.     local nic_arr=(`ifconfig | grep -E -o "^[a-z0-9]+" | grep -v "lo" | uniq`)
  77.     local nicLen=${#nic_arr[@]}
  78.     if [[ $nicLen -eq 0 ]]; then
  79.         echo "sorry,I can not detect any network device,please report this issue to author."
  80.         exit 1
  81.     elif [[ $nicLen -eq 1 ]]; then
  82.         eth=$nic_arr
  83.     else
  84.         display_menu nic
  85.         eth=$nic
  86.     fi   
  87.  
  88.     local clear=true
  89.     local eth_in_peak=0
  90.     local eth_out_peak=0
  91.     local eth_in=0
  92.     local eth_out=0
  93.  
  94.     while true;do
  95.         #移动光标到0:0位置
  96.         printf "\033[0;0H"
  97.         #清屏并打印Now Peak
  98.         [[ $clear == true ]] && printf "\033[2J" && echo "$eth--------Now--------Peak-----------"
  99.         traffic_be=(`awk -v eth=$eth -F'[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev`)
  100.         sleep 2
  101.         traffic_af=(`awk -v eth=$eth -F'[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev`)
  102.         #计算速率
  103.         eth_in=$(( (${traffic_af[0]}-${traffic_be[0]})*8/2 ))
  104.         eth_out=$(( (${traffic_af[1]}-${traffic_be[1]})*8/2 ))
  105.         #计算流量峰值
  106.         [[ $eth_in -gt $eth_in_peak ]] && eth_in_peak=$eth_in
  107.         [[ $eth_out -gt $eth_out_peak ]] && eth_out_peak=$eth_out
  108.         #移动光标到2:1
  109.         printf "\033[2;1H"
  110.         #清除当前行
  111.         printf "\033[K"   
  112.         printf "%-20s %-20s\n" "Receive:  $(bit_to_human_readable $eth_in)" "$(bit_to_human_readable $eth_in_peak)"
  113.         #清除当前行
  114.         printf "\033[K"
  115.         printf "%-20s %-20s\n" "Transmit: $(bit_to_human_readable $eth_out)" "$(bit_to_human_readable $eth_out_peak)"
  116.         [[ $clear == true ]] && clear=false
  117.     done
  118. }
  119.  
  120. #流量和连接概览
  121. trafficAndConnectionOverview(){
  122.     if ! which tcpdump > /dev/null;then
  123.         echo "tcpdump not found,going to install it."
  124.         if check_package_manager apt;then
  125.             apt-get -y install tcpdump
  126.         elif check_package_manager yum;then
  127.             yum -y install tcpdump
  128.         fi
  129.     fi
  130.  
  131.     local reg=""
  132.     local eth=""
  133.     local nic_arr=(`ifconfig | grep -E -o "^[a-z0-9]+" | grep -v "lo" | uniq`)
  134.     local nicLen=${#nic_arr[@]}
  135.     if [[ $nicLen -eq 0 ]]; then
  136.         echo "sorry,I can not detect any network device,please report this issue to author."
  137.         exit 1
  138.     elif [[ $nicLen -eq 1 ]]; then
  139.         eth=$nic_arr
  140.     else
  141.         display_menu nic
  142.         eth=$nic
  143.     fi
  144.  
  145.     echo "please wait for 10s to generate network data..."
  146.     echo
  147.     #当前流量值
  148.     local traffic_be=(`awk -v eth=$eth -F'[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev`)
  149.     #tcpdump监听网络
  150.     tcpdump -v -i $eth -tnn > /tmp/tcpdump_temp 2>&1 &
  151.     sleep 10
  152.     clear
  153.     kill `ps aux | grep tcpdump | grep -v grep | awk '{print $2}'`
  154.  
  155.     #10s后流量值
  156.     local traffic_af=(`awk -v eth=$eth -F'[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev`)
  157.     #打印10s平均速率
  158.     local eth_in=$(( (${traffic_af[0]}-${traffic_be[0]})*8/10 ))
  159.     local eth_out=$(( (${traffic_af[1]}-${traffic_be[1]})*8/10 ))
  160.     echo -e "\033[32mnetwork device $eth average traffic in 10s: \033[0m"
  161.     echo "$eth Receive: $(bit_to_human_readable $eth_in)/s"
  162.     echo "$eth Transmit: $(bit_to_human_readable $eth_out)/s"
  163.     echo
  164.  
  165.     local regTcpdump=$(ifconfig | grep -A 1 $eth | awk -F'[: ]+' '$0~/inet addr:/{printf $4"|"}' | sed -e 's/|$//' -e 's/^/(/' -e 's/$/)\\\\\.[0-9]+:/')
  166.  
  167.     #新旧版本tcpdump输出格式不一样,分别处理
  168.     if awk '/^IP/{print;exit}' /tmp/tcpdump_temp | grep -q ")$";then
  169.         #处理tcpdump文件
  170.         awk '/^IP/{print;getline;print}' /tmp/tcpdump_temp > /tmp/tcpdump_temp2
  171.     else
  172.         #处理tcpdump文件
  173.         awk '/^IP/{print}' /tmp/tcpdump_temp > /tmp/tcpdump_temp2
  174.         sed -i -r 's#(.*: [0-9]+\))(.*)#\1\n    \2#' /tmp/tcpdump_temp2
  175.     fi
  176.     
  177.     awk '{len=$NF;sub(/\)/,"",len);getline;print $0,len}' /tmp/tcpdump_temp2 > /tmp/tcpdump
  178.  
  179.     #统计每个端口在10s内的平均流量
  180.     echo -e "\033[32maverage traffic in 10s base on server port: \033[0m"
  181.     awk -F'[ .:]+' -v regTcpdump=$regTcpdump '{if ($0 ~ regTcpdump){line="clients > "$8"."$9"."$10"."$11":"$12}else{line=$2"."$3"."$4"."$5":"$6" > clients"};sum[line]+=$NF*8/10}END{for (line in sum){printf "%s %d\n",line,sum[line]}}' /tmp/tcpdump | \
  182.     sort -k 4 -nr | head -n 10 | while read a b c d;do
  183.         echo "$a $b $c $(bit_to_human_readable $d)/s"
  184.     done
  185.     echo -ne "\033[11A"
  186.     echo -ne "\033[50C"
  187.     echo -e "\033[32maverage traffic in 10s base on client port: \033[0m"
  188.     awk -F'[ .:]+' -v regTcpdump=$regTcpdump '{if ($0 ~ regTcpdump){line=$2"."$3"."$4"."$5":"$6" > server"}else{line="server > "$8"."$9"."$10"."$11":"$12};sum[line]+=$NF*8/10}END{for (line in sum){printf "%s %d\n",line,sum[line]}}' /tmp/tcpdump | \
  189.     sort -k 4 -nr | head -n 10 | while read a b c d;do
  190.             echo -ne "\033[50C"
  191.             echo "$a $b $c $(bit_to_human_readable $d)/s"
  192.     done   
  193.         
  194.     echo
  195.  
  196.     #统计在10s内占用带宽最大的前10个ip
  197.     echo -e "\033[32mtop 10 ip average traffic in 10s base on server: \033[0m"
  198.     awk -F'[ .:]+' -v regTcpdump=$regTcpdump '{if ($0 ~ regTcpdump){line=$2"."$3"."$4"."$5" > "$8"."$9"."$10"."$11":"$12}else{line=$2"."$3"."$4"."$5":"$6" > "$8"."$9"."$10"."$11};sum[line]+=$NF*8/10}END{for (line in sum){printf "%s %d\n",line,sum[line]}}' /tmp/tcpdump | \
  199.     sort -k 4 -nr | head -n 10 | while read a b c d;do
  200.         echo "$a $b $c $(bit_to_human_readable $d)/s"
  201.     done
  202.     echo -ne "\033[11A"
  203.     echo -ne "\033[50C"
  204.     echo -e "\033[32mtop 10 ip average traffic in 10s base on client: \033[0m"
  205.     awk -F'[ .:]+' -v regTcpdump=$regTcpdump '{if ($0 ~ regTcpdump){line=$2"."$3"."$4"."$5":"$6" > "$8"."$9"."$10"."$11}else{line=$2"."$3"."$4"."$5" > "$8"."$9"."$10"."$11":"$12};sum[line]+=$NF*8/10}END{for (line in sum){printf "%s %d\n",line,sum[line]}}' /tmp/tcpdump | \
  206.     sort -k 4 -nr | head -n 10 | while read a b c d;do
  207.         echo -ne "\033[50C"
  208.         echo "$a $b $c $(bit_to_human_readable $d)/s"
  209.     done
  210.  
  211.     echo
  212.     #统计连接状态
  213.     local regSS=$(ifconfig | grep -A 1 $eth | awk -F'[: ]+' '$0~/inet addr:/{printf $4"|"}' | sed -e 's/|$//')
  214.     ss -an | grep -v -E "LISTEN|UNCONN" | grep -E "$regSS" > /tmp/ss
  215.     echo -e "\033[32mconnection state count: \033[0m"
  216.     awk 'NR>1{sum[$(NF-4)]+=1}END{for (state in sum){print state,sum[state]}}' /tmp/ss | sort -k 2 -nr
  217.     echo
  218.     #统计各端口连接状态
  219.     echo -e "\033[32mconnection state count by port base on server: \033[0m"
  220.     awk 'NR>1{sum[$(NF-4),$(NF-1)]+=1}END{for (key in sum){split(key,subkey,SUBSEP);print subkey[1],subkey[2],sum[subkey[1],subkey[2]]}}' /tmp/ss | sort -k 3 -nr | head -n 10   
  221.     echo -ne "\033[11A"
  222.     echo -ne "\033[50C"
  223.     echo -e "\033[32mconnection state count by port base on client: \033[0m"
  224.     awk 'NR>1{sum[$(NF-4),$(NF)]+=1}END{for (key in sum){split(key,subkey,SUBSEP);print subkey[1],subkey[2],sum[subkey[1],subkey[2]]}}' /tmp/ss | sort -k 3 -nr | head -n 10 | awk '{print "\033[50C"$0}'   
  225.     echo   
  226.     #统计端口为80且状态为ESTAB连接数最多的前10个IP
  227.     echo -e "\033[32mtop 10 ip ESTAB state count at port 80: \033[0m"
  228.     cat /tmp/ss | grep ESTAB | awk -F'[: ]+' '{sum[$(NF-2)]+=1}END{for (ip in sum){print ip,sum[ip]}}' | sort -k 2 -nr | head -n 10
  229.     echo
  230.     #统计端口为80且状态为SYN-RECV连接数最多的前10个IP
  231.     echo -e "\033[32mtop 10 ip SYN-RECV state count at port 80: \033[0m"
  232.     cat /tmp/ss | grep -E "$regSS" | grep SYN-RECV | awk -F'[: ]+' '{sum[$(NF-2)]+=1}END{for (ip in sum){print ip,sum[ip]}}' | sort -k 2 -nr | head -n 10
  233. }
  234.  
  235. main(){
  236.     while true; do
  237.         echo -e "1) real time traffic.\n2) traffic and connection overview.\n"
  238.         read -p "please input your select(ie 1): " select
  239.         case  $select in
  240.             1) realTimeTraffic;break;;
  241.             2) trafficAndConnectionOverview;break;;
  242.             *) echo "input error,please input a number.";;
  243.         esac
  244.     done   
  245. }
  246.  
  247. main

脚本中如有不明白的地方,可以留言咨询。

 

转载自: https://www.centos.bz/2014/06/shell-script-for-network-analysis/

分享到:
评论

相关推荐

    一个强大的网络分析shell脚本分享(实时流量、连接统计)

    本文将介绍一个强大的网络分析Shell脚本,该脚本具备实时流量监控和连接统计等功能,适用于系统管理员进行网络性能分析和安全监控。以下是脚本的主要特点和实现方法: 1. **实时监控任意网卡流量**:通过读取`/proc...

    23 个非常实用的 Shell 脚本实例.doc

    在实际工作中, Shell 脚本可以应用于各种自动化任务,例如文件备份、日志记录、网络监控等等。 Shell 脚本的编程技术也可以应用于其他领域,例如数据分析、机器学习等等。 Shell 脚本是一种强大的工具,能够帮助...

    Linux常用的系统监控shell脚本

    下面将详细解析几个典型的Linux系统监控Shell脚本,涵盖网络流量监控、CPU与内存使用情况、磁盘空间警告及系统统计信息捕获等关键领域。 #### 网络流量监控脚本 该脚本通过循环读取`eth0`网卡的接收和发送数据包...

    网络管理shell脚本 运维人员必备

    实时流量 流量和连接概览 当前流量值 统计每个端口在10s内的平均流量 统计在10s内占用带宽最大的前10个ip 统计连接状态 统计各端口连接状态 统计端口为80且状态为ESTAB连接数最多的前10个IP 统计端口为80且状态为SYN...

    android 查看数据流量统计脚本

    下面是一个简单的shell脚本示例,用于输出所有应用的数据流量统计: ```bash #!/system/bin/sh echo "应用名称 数据使用量(MB)" for app in $(dumpsys package | grep -oP 'package:\s*(\S+)' | awk '{print $...

    linux-DoSDeflate是一个轻量级的bashshell脚本旨在协助阻止拒绝服务攻击的过程

    这些工具能够提供实时的网络连接信息,帮助识别异常的高流量来源。 脚本的执行流程可能包括以下步骤: 1. **数据收集**:使用`netstat`命令列出所有当前的TCP和UDP连接,包括客户端IP和端口信息。 2. **数据解析**...

    shell入门到进阶,脚本机动化

    在信息采集与监控领域,shell脚本可以定期获取并分析系统的各项指标,包括CPU利用率、内存使用情况、磁盘空间占用、网络流量、TCP连接状态等,并对关键应用程序(如Apache、MySQL)的状态进行监控。这些数据可以通过...

    常用shell监控脚本.txt

    ### 常用Shell监控脚本知识点解析 #### 一、网络流量监控脚本 **脚本概述**:此脚本用于实时监控网络接口(如eth0)的上传与下载速度,并将数据输出到标准输出。 **核心逻辑**: 1. **定义变量**: - `time`:...

    linux网卡流量监控脚本

    shell脚本实现的监控linux服务器上的网卡流量的脚本,可选择网卡,可查看统计数据和连接情况

    Linux常用的系统监控shell脚本.docx

    这个脚本收集系统状态信息,包括CPU利用率(`top`)、内存使用(`free -m`)、硬盘空间(`df -k`)以及网络连接数(`netstat -na`)。所有数据都被写入临时文件,便于后续分析。`grep`用于筛选特定行,`date`用于获取当前...

    北邮linux开发环境实验报告

    `netstat`可以显示网络连接、路由表、网络接口统计等信息,而`tcpdump`则可以捕获网络上的数据包,进行实时分析或保存到文件以供后续分析。 通过管道和重定向,学生可以组合这些命令,比如先用`netstat -an`列出...

    PHP网络数据包分析工具的设计与开发(源代码+lw).zip

    设计一个PHP数据包分析工具,首先需要确定工具的功能需求,如过滤特定协议的数据包、统计网络流量、检测异常行为等。然后,根据需求选择合适的库或API进行编程。在实现过程中,需要注意性能优化,因为数据包捕获可能...

    Linux如何查看当前有多少IP连接了这台机子.如何查看都谁连接了我

    对于长期监控,可以考虑使用网络监控工具,如`nethogs`、`iftop`或`vnstat`,它们提供了实时的网络流量和连接信息。 7. **日志分析:** 许多服务器应用程序(如Apache、Nginx等)会记录访问日志,通过分析这些...

    监控linux性能脚本

    `netstat`命令可以显示网络连接状态和传输统计,而`ifconfig`可以提供接口级别的网络流量信息。更高级的监控可能使用`nethogs`或`iftop`来跟踪每个进程的网络带宽使用。这些脚本可以帮助我们识别是否有异常的网络...

    基于贝叶斯的恶意流量检测可视化程序

    4. **流量检测**:对实时网络流量进行预测,根据模型输出的后验概率判断流量的恶意程度。 5. **可视化界面**:`main_gui.py`可能负责创建用户界面,展示流量检测的结果,如图表、警报和详细的流量分析报告。`ui_main...

    常用zabbix自定义监控脚本整理-可修改或直接用

    例如,一个简单的Shell脚本可以使用`top`或`df`命令获取这些信息,并将其格式化为Zabbix能识别的数据格式。 2. **应用程序状态监控**:针对特定的应用程序,如Web服务器(Apache、Nginx)、数据库(MySQL、...

    redis监控模板-配置-脚本.zip

    2. **redis_status.sh**:这是一个Shell脚本,通常用于定期收集Redis服务器的状态信息,如内存使用、命令执行速率、连接数等。这个脚本会通过与Redis服务器交互(通常是使用`redis-cli`)获取这些信息,并将结果输出...

    网管工具集

    例如,ntopng是一款网络流量监控工具,它提供了一个直观的Web界面,展示网络的实时流量和统计信息。SolarWinds Network Performance Monitor也是一款专业的网络流量分析软件,能够深入洞察网络性能并提供故障预警。 ...

    网络命令行的使用和范例

    这些工具通过文本接口提供对网络设备和资源的直接控制,使用户能够执行各种任务,如配置网络设置、诊断连接问题、监控网络流量等。本篇将详细介绍网络命令行的使用以及一些常见范例。 1. 基本概念 - **命令行界面 ...

Global site tag (gtag.js) - Google Analytics