检查网口流量与前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 truedo

        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

时间: 2024-12-30 00:57:44

检查网口流量与前10名流量大IP的相关文章

盘点前 10 名的免费跨浏览器测试工具

原文: http://www.oschina.net/news/53246/free-cross-browser-testing-tools 在多个平台上测试多种浏览器不但是很困难的 – 它几乎不可能的,因为没有那些好的测试工具.今天,我们就为大家提供很多涉及到跨浏览器测试的选择,并且告诉你那些“顶级的浏览器测试工具”,你应该使用哪一个. 这前10名的免费跨浏览器测试工具没有特定的顺序,因为他们对于任何特定的设备都同样有效.如果你手动去测试,可能既困难又耗费时间.因为你只能不断的安装更多的浏览器

“军装照”背后——天天P图如何应对10亿流量的后台承载。

WeTest 导读 天天P图"军装照"活动交出了一份10亿浏览量的答卷,一时间刷屏朋友圈,看到这幕,是不是特别想复制一个如此成功的H5?不过本文不教你如何做一个爆款H5,而是介绍天天P图在"军装照"活动过程中,如何面对10亿流量时的后台承载. 一.10亿浏览量,"军装照"火了 这两天,相信 "军装照"活动已经刷爆了朋友圈,这个活动是由人民日报客户端策划出品并主导开发,腾讯天天P图提供图像处理支持的一款H5产品. 天天P图智能换

64匹马,8个赛道,找出前4名最少比赛多少场?——最快10次,最慢11次;

64匹马,8个赛道,找出前4名最少比赛多少场? 答案原创,转载请注明出处:http://www.cnblogs.com/reanote/p/find_4th_in_64horse.html 第一步:全部马分8组,各跑一次,然后淘汰掉每组的后四名(8次): 第二步:取每组第一名进行一次比赛,然后淘汰最后四名所在组的所有马(1次): 分析:其实这时候红色区域的马也可以淘汰了,A1可以直接晋级: 第三步:A2.A3.A4.B2.B3.C1.C2.D1八匹马跑一次,即:在剩下需要排名的马中,除了B1外,

解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据

我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动态,而不关心几个月甚至几年前消息,所以后端返回给客户端的数据是不会一次性传递全部内容的(不仅耗费流量,而且还给服务器带来巨大压力). 举个例就说MySQL,它已经给我们提供了相应的语句来支持这一功能,那就是limit关键字.比如我要拉取一个消息表中用户id为1的前10条最新数据,SQL语句如下: s

统计电影票房排名前10的电影并存入另一个文件

今天看到一个笔试题,是这样的:给定一个文件(m.dat),里面保存了各个电影票房统计,格式如下: <2012>                                索尼                $769.7 <哈利波特与死亡圣器(上)>              华纳兄弟            $952.0 <星球大战>                            二十世纪福克斯      $775.4 <怪物史莱克4>      

GitHub 中国区前 100 名到底是什么样的人?

本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员如何建立自己的个人品牌><优雅的程序员列传>欢迎加我微信diycodes交流. Github中国区前一百名城市分布,令人比较意外的是IT重镇深圳和广州居然和北上杭差距那么大!(其中China表示没有注明具体城市用户) Github中国区前一百名语言分布图,前端开发者依然霸占着大多数,移动开发

GitHub中国区前100名到底是什么样的人?

本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员如何建立自己的个人品牌><优雅的程序员列传>欢迎加我微信diycodes交流. Github中国区前一百名城市分布,令人比较意外的是IT重镇深圳和广州居然和北上杭差距那么大!(其中China表示没有注明具体城市用户) Github中国区前一百名语言分布图,前端开发者依然霸占着大多数,移动开发

【转载】GitHub中国区前100名到底是什么样的人

转载了这篇文章: http://www.jianshu.com/p/d29cba7934c9 这篇文章真是太牛了!转载过来涨涨见识,同时好好励志一把.还有,ruanyifeng怎么长那样... 哈 另,最新排名及github用户信息可以查看:http://www.githubrank.com/ 本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员如何建立自

选前5 名的链表问题

  #include<iostream> #include<assert.h> #include<string> using namespace std; struct node { int x; node *next; node(int a){x=a;} }; class link { public : node *head; link(int *a) {   int n=5; head=new node(a[0]); node *p=head; while(--n)