检查网口流量与前10名流量大IP
该脚本中包含的函数有:
1.实时监控任何网卡的流量。
2。计算10秒内的平均流量。
3。根据客户端和
服务器端口的统计数据,计算10秒钟内每个端口的平均流量。您可以看到哪些端口的流量很大。对于
web服务器,一般是80个端口。当其他端口受到***,也有可能其他端口流量比较大。所以这个功能可以帮助我们判断端口流量是否正常。
4。10s内统计
带宽最大的前10个ip。这个功能可以帮助我们发现是否存在恶意占用带宽的ip。
5。计算连接状态。这个函数可以让我们看到哪些连接状态比较大。如果有很多SYN-RECV状态,有些可以是半连通***。如果建立的很大,但是通过日志发现的请求没有那么多,或者大量的ip只是建立连接而没有通过tcpdump请求数据,那么可能都是连接***。此时,如果使用的是nginx服务器,可以在配置文件中添加listen80deferred来防止。
6。统计每个端口的连接状态。这个功能可以帮助我们在哪个端口可能受到***影响的时候,发现哪个端口受到了***的影响。
7。统计端口为80,ESTAB连接最多的前10个IP处于状态。这个功能可以帮助我们找出创建过多连接的Ip,然后进行屏蔽。
8。统计端口为80的SYN-RECV连接数最多的前10个IP。这个功能可以帮助我们在半连接***的情况下发现恶意ip。
使用的网络分析工具:
1.tcpdump:这个脚本使用tcpdump来计算基于ip或基于端口的流量。
2。这个脚本使用ss命令来计算连接状态。在实际使用中发现ss比netstat效率高得多。
3、/proc/net/dev,用于统计指定网卡的流量。
#!/bin/bash
#displaymenu(单项选择)
display_menu(){
localsoft=$1
localprompt="while${${soft}_arr[@]})
whiletrue
do
echo-e"#######################${soft}设置##########################################我<=${#arr[@]};i++));doecho-e"$I)${arr[$I-1]}";done
echo
read-p"${prompt}"$soft
evallocalselect=\$$soft
if["$select"==""]||["${arr[$soft-1]}"==""];然后
prompt="输入错误,请输入一个数字:"
else
eval$soft=${arr[$soft-1]}
evalecho"您的选择:\$$soft"/h/]break
fi
done
]
#将带宽比特单位转换为人可读单位
bit_to_human_readable(){[/hh/]localtrafficvalue=$1
*}-gt922]];然后
#conv到Kb
trafficvalue=`awk-vvalue=$trafficvalue'BEGIN{printf"%0.1f",value/1024}'`
if[${trafficvalue%。*}-gt922]];然后
#conv到Mb
trafficvalue=`awk-vvalue=$trafficvalue'BEGIN{printf"%0.1f",value/1024}'`
Echo"${trafficvalue}Mb"
else
Echo"${trafficvalue}Kb"
fi
else
Echo"${trafficvalue}b"
}
]
]然后
systempackage='apt'
elifcat/etc/issue|grep-q-E-I"centos|redhat|redhat";然后
systempackage='yum'
elifcat/proc/version|grep-q-E-I"Ubuntu|debian";然后
systempackage='apt'
elifcat/proc/version|grep-q-E-I"centos|redhat|redhat";然后
systempackage='yum'
else
echo"unkonw"
fi
if["$manager"="$systempackage"];然后
return0
else
return1
fi
#实时流量
实时流量(){[/]localNIC_arr=(`ifconfig|grep-e-o"^[a-z0-9]+"|grep-v"lo"|uniq`)
localNIClen=${#NIC_arr[@]}[$NIClen-eq0]];然后
回应“对不起,我检测不到任何网络设备,请向作者报告此问题。"
出口1
elif[[$NIClen-eq1]];然后
eth=$NIC_arr
else
display_menuNIC
eth=$NIC
fi
localclear=true
localeth_in_peak=0
localeth_out_peak=0
localeth_in=0
localeth_out=0
whiletrue;Do
#将光标移动到0:0位置
printf"\033[0;0H"
#清除屏幕并立即打印峰值
[[$Clear==true]]&&;printf"\033[2J"&;&echo"$eth-Now-Peak-"
traffic_be=(`awk-veth=$eth-F'[:]+''{if($0~eth){print$3,$11}}'/proc/net/dev`)
sleep2
traffic_af=(`awk-veth=$eth-F'[:]+''{if($0~eth){print$3,}}'/proc/net/dev`)
#eth_in_peak=$eth_in
[[$eth_out-gt$eth_out_peak]]&;&Eth_out_peak=$eth_out
#将光标移动到2:1
printf"\033[2;1H"
#清除当前行
printf"\033[K"/h/]printf"%-20s%-20s\N""接收:$(bit_to_human_readable$eth_in)""$(bit_to_human_readable$eth_in_peak)"
#清除当前行
printf"\033[K"/h/]printf"%-20s%-20s\N""发送:$(bit_to_human_in&clear=false
done
}
#流量和连接概述
trafficandconnectionview(){
if!哪个tcpdump>/dev/null;然后
回显“找不到tcpdump,准备安装。"
ifcheck_package_managerapt;然后
apt-get-y安装tcpdump
elifcheck_package_manageryum;然后
yum-y安装tcpdump
fi
fi
localreg=""
localeth=""
localNIC_arr=(`ifconfig|grep-e-o"^[a-z0-9]+"|grep-v"lo"|uniq`)
localNIClen=${#NIC_arr[@]}
if[$NIClen-eq0]];然后
回应“对不起,我检测不到任何网络设备,请向作者报告此问题。"
出口1
elif[[$NIClen-eq1]];然后
eth=$NIC_arr
else
display_menuNIC
eth=$NIC
fi
Echo"请等待10s生成网络数据..."
echo
#当前流量值
localtraffic_be=(`awk-veth=$eth-f'[:]+''{if($0~eth){print$3,$11}}'/proc/net/dev`)
#tcpdump监听网
tcpdump-v-I$eth-tnn>;/tmp/tcpdump_temp2>;&1&
sleep10
clear
kill`psaux|greptcpdump|grep-vgrep|awk'{print$2}'`
#处理tcpdump文件
awk'/IPgetline;print}'/tmp/TCPdump_temp>;/tmp/tcpdump_temp2
awk“{len=$NF;sub(/\)/,"",len);getlineprint[16],len}'/tmp/tcpdump_temp2>;/tmp/tcpdump
#10s后期流量值
localtraffic_af=(`awk-veth=$eth-f'[:]+''{if($0~eth){print$3,$11}}'/proc/net/dev`)
#10s平均打印速率
localeth_in=$(${traffic_af[0]}-${traffic_be[0]})*8/10)localeth_out033[0m"/h/]echo"$ethreceive:$(bit_to_human_readable$eth_in)/s"$ethtransmit:$(bit_to_human_readable$eth_out)/s"/h/]echo
#统计10s内每个端口的平均流量
regtcpdump=$(ifconfig|grep-a1$eth|awk-f'[:]+''$0~/inetaddr:/{printf$4".[0-9]+:/')
echo-e"\033[32m基于服务器端口的10秒平均流量:\033[0m"/h/]awk-F'[。:]+'-vregTcpdump=$regTcpdump“{if($0~regTcpdump){line="clients>;""."".""."":"}else{line="。"".""."":"">客户端"};sum[line]+=$NF*8/10}END{for(lineinsum){printf"%s%d\n",line,sum[line]}'/tmp/TCPdump|\
sort-k4-NR|head-n10|whilereadabcd;do
echo"$a$b$c$(bit_to_human_readable$d)/s"
done
echo
echo-e"\033[32m基于客户端端口的10秒平均流量:\033[0m"/h/]awk-F'[。:]+'-vregTcpdump=$regTcpdump“{if($0~regTcpdump){line=$2”。"".""."":"">server"}else{line="server>""."".""."":"};sum[line]+=$NF*8/10}END{for(lineinsum){printf"%s%d\n",line,sum[line]}'/tmp/TCPdump|\
sort-k4-NR|head-n10|whilereadabcd;do
echo"$a$b$c$(bit_to_human_readable$d)/s"/h/]done
echo
#统计10s内带宽最大的前10个ip
。echo-e"\033[32m10s内top10ip平均流量:\033[0m"/h/]awk-F'[。:]+'-vregTcpdump=$regTcpdump“{if($0~regTcpdump){line=$2”。"".""."$5">;""."".""."":"}else{line="。"".""."":"">""."".""."};sum[line]+=$NF*8/10}END{for(lineinsum){printf"%s%d\n",line,sum[line]}'/tmp/TCPdump|\
sort-k4-NR|head-n10|whilereadabcd;do
echo"$a$b$c$(bit_to_human_readable$d)/s"/h/]done
echo
#统计连接状态
regSS=$(ifconfig|awk-F'[:]+''$0~/inetaddr:/{printf$4"|"}'|sed-E's/|$/')
ss-an|grep-v-E"LISTEN|UNCONN"|grep/tmp/ss
echo-e"\033[32m连接状态计数:\033[0m"/h/]awk'NR>;1{sum[$(NF-4)]+=1}end{for(stateinsum){printstate,sum[state]}'/tmp/ss|sort-K2-NR
echo
#统计每个端口的连接状态
。033[32m端口连接状态计数:\033[0m"/h/]awk'NR>;1{sum[$(NF-4),$(NF-1)]+=1}END{for(keyinsum){split(key,subkey,SUBSEP);printsubkey[1],subkey[2],sum[subkey[1],Subkey[2]]}'/tmp/ss|Sort-k3-NR|Head-N10
echo
#Counttop10IP
echo-e"\033[32mtop10IPESTAB状态在端口80的计数:\033[0m"/h/]cat/tmp/ss|grepESTAB|awk-F'[:]+''{Sum[$(NF-2033[0m"/h/]cat/tmp/ss|grep-E"$regSS"|grepSYN-RECV|awk-F'[:]+''{sum[$(NF-2)]+=1}END{for(IPinsum){printIP,sum[IP]}'|sort-k2-NR|head-n10
}
main(){
whiletrue;做
echo-e"1)实时交通。\n2)流量和连接概述。\n"
read-p"请输入您的select(ie1):"select
case$selectin
1)realTimeTraffic;打破;;
2)trafficAndConnectionOverview;打破;;
*)echo“输入错误,请输入一个数字。";;
esac
done
}
main
评论列表(0条)