检查网口流量与前10名流量大IP
此脚本包含的功能有:
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,用来统计指定网卡的流量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
#!/bin/bash #显示菜单(单选) display_menu(){ local soft=$1 local prompt= "which ${soft} you'd select: " eval local arr=(\${${soft}_arr[@]}) while true do echo -e "#################### ${soft} setting ####################\n\n" for ((i=1;i<=${ #arr[@]};i++ )); do echo -e "$i) ${arr[$i-1]}"; done echo read -p "${prompt}" $soft eval local select =\$$soft if [ "$select" == "" ] || [ "${arr[$soft-1]}" == "" ]; then prompt= "input errors,please input a number: " else eval $soft=${arr[$soft-1]} eval echo "your selection: \$$soft" break fi done } #把带宽bit单位转换为人类可读单位 bit_to_human_readable(){ #input bit value local trafficValue=$1 if [[ ${trafficValue%.*} -gt 922 ]]; then #conv to Kb trafficValue=` awk - v value=$trafficValue 'BEGIN{printf "%0.1f",value/1024}' ` if [[ ${trafficValue%.*} -gt 922 ]]; then #conv to Mb trafficValue=` awk - v value=$trafficValue 'BEGIN{printf "%0.1f",value/1024}' ` echo "${trafficValue}Mb" else echo "${trafficValue}Kb" fi else echo "${trafficValue}b" fi } #判断包管理工具 check_package_manager(){ local manager=$1 local systemPackage= '' if cat /etc/issue | grep -q -E -i "ubuntu|debian" ; then systemPackage= 'apt' elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat" ; then systemPackage= 'yum' elif cat /proc/version | grep -q -E -i "ubuntu|debian" ; then systemPackage= 'apt' elif cat /proc/version | grep -q -E -i "centos|red hat|redhat" ; then systemPackage= 'yum' else echo "unkonw" fi if [ "$manager" == "$systemPackage" ]; then return 0 else return 1 fi } #实时流量 realTimeTraffic(){ local eth= "" local nic_arr=(` ifconfig | grep -E -o "^[a-z0-9]+" | grep - v "lo" | uniq `) local nicLen=${ #nic_arr[@]} if [[ $nicLen - eq 0 ]]; then echo "sorry,I can not detect any network device,please report this issue to author." exit 1 elif [[ $nicLen - eq 1 ]]; then eth=$nic_arr else display_menu nic eth=$nic fi local clear = true local eth_in_peak=0 local eth_out_peak=0 local eth_in=0 local eth_out=0 while true ; do #移动光标到0:0位置 printf "\033[0;0H" #清屏并打印Now Peak [[ $ clear == true ]] && printf "\033[2J" && echo "$eth--------Now--------Peak-----------" traffic_be=(` awk - v eth=$eth -F '[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev `) sleep 2 traffic_af=(` awk - v eth=$eth -F '[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev `) #计算速率 eth_in=$(( (${traffic_af[0]}-${traffic_be[0]})*8 /2 )) eth_out=$(( (${traffic_af[1]}-${traffic_be[1]})*8 /2 )) #计算流量峰值 [[ $eth_in -gt $eth_in_peak ]] && 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" printf "%-20s %-20s\n" "Receive: $(bit_to_human_readable $eth_in)" "$(bit_to_human_readable $eth_in_peak)" #清除当前行 printf "\033[K" printf "%-20s %-20s\n" "Transmit: $(bit_to_human_readable $eth_out)" "$(bit_to_human_readable $eth_out_peak)" [[ $ clear == true ]] && clear = false done } #流量和连接概览 trafficAndConnectionOverview(){ if ! which tcpdump > /dev/null ; then echo "tcpdump not found,going to install it." if check_package_manager apt; then apt-get -y install tcpdump elif check_package_manager yum; then yum -y install tcpdump fi fi local reg= "" local eth= "" local nic_arr=(` ifconfig | grep -E -o "^[a-z0-9]+" | grep - v "lo" | uniq `) local nicLen=${ #nic_arr[@]} if [[ $nicLen - eq 0 ]]; then echo "sorry,I can not detect any network device,please report this issue to author." exit 1 elif [[ $nicLen - eq 1 ]]; then eth=$nic_arr else display_menu nic eth=$nic fi echo "please wait for 10s to generate network data..." echo #当前流量值 local traffic_be=(` awk - v eth=$eth -F '[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev `) #tcpdump监听网络 tcpdump - v -i $eth -tnn > /tmp/tcpdump_temp 2>&1 & sleep 10 clear kill ` ps aux | grep tcpdump | grep - v grep | awk '{print $2}' ` #处理tcpdump文件 awk '/^IP/{print;getline;print}' /tmp/tcpdump_temp > /tmp/tcpdump_temp2 awk '{len=$NF;sub(/\)/,"",len);getline;print $0,len}' /tmp/tcpdump_temp2 > /tmp/tcpdump #10s后流量值 local traffic_af=(` awk - v eth=$eth -F '[: ]+' '{if ($0 ~eth){print $3,$11}}' /proc/net/dev `) #打印10s平均速率 local eth_in=$(( (${traffic_af[0]}-${traffic_be[0]})*8 /10 )) local eth_out=$(( (${traffic_af[1]}-${traffic_be[1]})*8 /10 )) echo -e "\033[32mnetwork device $eth average traffic in 10s: \033[0m" echo "$eth Receive: $(bit_to_human_readable $eth_in)/s" echo "$eth Transmit: $(bit_to_human_readable $eth_out)/s" echo #统计每个端口在10s内的平均流量 regTcpdump=$( ifconfig | grep -A 1 $eth | awk -F '[: ]+' '$0~/inet addr:/{printf $4"|"}' | sed -e 's/|$//' -e 's/^/(/' -e 's/$/)\\\\\.[0-9]+:/' ) echo -e "\033[32maverage traffic in 10s base on server port: \033[0m" 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 | \ sort -k 4 -nr | head -n 10 | while read a b c d; do echo "$a $b $c $(bit_to_human_readable $d)/s" done echo echo -e "\033[32maverage traffic in 10s base on client port: \033[0m" 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 | \ sort -k 4 -nr | head -n 10 | while read a b c d; do echo "$a $b $c $(bit_to_human_readable $d)/s" done echo #统计在10s内占用带宽最大的前10个ip echo -e "\033[32mtop 10 ip average traffic in 10s : \033[0m" 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 | \ sort -k 4 -nr | head -n 10 | while read a b c d; do echo "$a $b $c $(bit_to_human_readable $d)/s" done echo #统计连接状态 regSS=$( ifconfig | grep -A 1 $eth | awk -F '[: ]+' '$0~/inet addr:/{printf $4"|"}' | sed -e 's/|$//' ) ss -an | grep - v -E "LISTEN|UNCONN" | grep -E "$regSS" > /tmp/ss echo -e "\033[32mconnection state count: \033[0m" awk 'NR>1{sum[$(NF-4)]+=1}END{for (state in sum){print state,sum[state]}}' /tmp/ss | sort -k 2 -nr echo #统计各端口连接状态 echo -e "\033[32mconnection state count by port: \033[0m" 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 echo #统计端口为80且状态为ESTAB连接数最多的前10个IP echo -e "\033[32mtop 10 ip ESTAB state count at port 80: \033[0m" 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 echo #统计端口为80且状态为SYN-RECV连接数最多的前10个IP echo -e "\033[32mtop 10 ip SYN-RECV state count at port 80: \033[0m" 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 } main(){ while true ; do echo -e "1) real time traffic.\n2) traffic and connection overview.\n" read -p "please input your select(ie 1): " select case $ select in 1) realTimeTraffic; break ;; 2) trafficAndConnectionOverview; break ;; *) echo "input error,please input a number." ;; esac done } main |
转载:http://jin771998569.blog.51cto.com/2147853/1587726
检查网口流量与前10名流量大IP的更多相关文章
- C语言 · 前10名
算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名 ...
- Java实现 蓝桥杯VIP 算法提高 前10名
算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名数据. 输入格式 ...
- 手游折扣app排行榜前10名_2018哪个折扣app最低最好
2018游戏圈白皮书发布,PC端游的份额继续下降,页游的比例也在下降,但手游的比例持续3年上升.以渠道为阵营,逐渐小的平台和公会被逐渐淘汰.流量集中在少数几个大的平台.但是这样带来的问题是,平台越来越 ...
- Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931 近日,Artur Suilin 等人发布了 Kaggl ...
- “军装照”背后——天天P图如何应对10亿流量的后台承载。
WeTest 导读 天天P图"军装照"活动交出了一份10亿浏览量的答卷,一时间刷屏朋友圈,看到这幕,是不是特别想复制一个如此成功的H5?不过本文不教你如何做一个爆款H5,而是介绍天 ...
- 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据
我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...
- sort +awk+uniq 统计文件中出现次数最多的前10个单词
实例cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sort -k1nr|head -100 统计文件中出现次数最多的前10个单 ...
- mysql GROUP_CONCAT+ GROUP BY + substring_index获取分组的前几名
mysql方法来源于:http://www.cnblogs.com/jjcc/p/5896588.html ###在网上看到一篇,非常赞的方法### 比如说要获取班级的前3名,mysql就可以用GRO ...
- GitHub中国区前100名到底是什么样的人?
本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...
随机推荐
- lua字符匹配
匹配下列格式的数据中的 source和MAC地址: Chain WiFiDog_br-lan_Outgoing (1 references) pkts bytes target prot opt in ...
- [Android 中级]Voip之CSipSimple类库的编绎
CSipSimple是什么?是一款基于pjsip的Android客户端,相信想要研究VOIP通讯的朋友一定不会陌生,这里我就把如何编译CSipSimple写下来. 首先从CSipSimple官方网站上 ...
- empty函数PHP
empty译为: adj.空的,空虚的,空洞的;空闲的,无效的,徒劳的;无聊的,愚蠢的;言语或行动空洞的 vt.(使)成为空的, 把…弄空;把…腾出来 vi.成为空的;流空 n.空车;空的东西 是PH ...
- oracle约束条件状态
Oracle完整性约束有一下4种: • DISABLE NOVALIDATE • ENABLE NOVALIDATE • DISABLE VALIDATE • ENABLE VALIDATE • ...
- oracle备份表
oracle与sql单表备份的区别 ( oracle中备份表: create table 备份表名 as select * from 原表 sql server中备份表: select * i ...
- oracle中获取特定时间的前一天
select to_char(to_date('@rq','YYYY-MM-DD')-1,'YYYY-MM-DD') FROM DUAL 把@rq换成你要的时间就行了
- OC - 31.通过封装的自定义布局快速实现商品展示
概述 实现效果 设计思路 采用MVC架构,即模型—视图-控制器架构 使用MJExtension框架实现字典转模型 使用MJRefresh框架实现上拉和下拉刷新 上拉刷新,加载新的数据 下拉刷新,加载更 ...
- 使用IDEA,利用SpringMVC框架建立HelloWorld项目
无论是从头开始学习一门新的语言还是技术,我们的入门都是从HelloWorld开始,也许就是因为这样,我在学习Spring MVC的时候,就有一种偏执,一定要写出一个HelloWorld来.研究了好久, ...
- Linux数据写操作改进
Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...
- ZOJ 刷题记录 小黑屋 (`・д・´)
P1006:模拟 然而我的同余方程能过样例然而就是WA⊙﹏⊙b [已查明:扩展欧几里得算法出了很隐蔽的问题] int exGcd(int x,int y,int& a,int& b) ...