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

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

Shell

Shell
此脚本包含的功能有:

  • 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,用来统计指定网卡的流量。

脚本下载地址:http://devops.webres.wang/wp-content/uploads/2014/06/network-analysis.sh
下面贴出完整的脚本:

  1. #!/bin/bash
  2.  
  3. #write by zhumaohai(admin#webres.wang)
  4. #author blog: devops.webres.wang
  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 ####################nn"
  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 "33[0;0H"
  97.         #清屏并打印Now Peak
  98.         [[ $clear == true ]] && printf "33[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 "33[2;1H"
  110.         #清除当前行
  111.         printf "33[K"   
  112.         printf "%-20s %-20sn" "Receive:  $(bit_to_human_readable $eth_in)" "$(bit_to_human_readable $eth_in_peak)"
  113.         #清除当前行
  114.         printf "33[K"
  115.         printf "%-20s %-20sn" "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 "33[32mnetwork device $eth average traffic in 10s: 33[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]+))(.*)#1n    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 "33[32maverage traffic in 10s base on server port: 33[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 %dn",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 "33[11A"
  186.     echo -ne "33[50C"
  187.     echo -e "33[32maverage traffic in 10s base on client port: 33[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 %dn",line,sum[line]}}’ /tmp/tcpdump |
  189.     sort -k 4 -nr | head -n 10 | while read a b c d;do
  190.             echo -ne "33[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 "33[32mtop 10 ip average traffic in 10s base on server: 33[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 %dn",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 "33[11A"
  203.     echo -ne "33[50C"
  204.     echo -e "33[32mtop 10 ip average traffic in 10s base on client: 33[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 %dn",line,sum[line]}}’ /tmp/tcpdump |
  206.     sort -k 4 -nr | head -n 10 | while read a b c d;do
  207.         echo -ne "33[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 "33[32mconnection state count: 33[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 "33[32mconnection state count by port base on server: 33[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 "33[11A"
  222.     echo -ne "33[50C"
  223.     echo -e "33[32mconnection state count by port base on client: 33[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 "33[50C"$0}’   
  225.     echo   
  226.     #统计端口为80且状态为ESTAB连接数最多的前10个IP
  227.     echo -e "33[32mtop 10 ip ESTAB state count at port 80: 33[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 "33[32mtop 10 ip SYN-RECV state count at port 80: 33[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

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

CDNFly(原HttpGuard)介绍

CDNFly是基于openresty,以lua脚本语言开发的防cc攻击软件。而openresty是集成了高性能web服务器Nginx,以及一系列的Nginx模块,这其中最重要的,也是我们主要用到的nginx lua模块。CDNFly基于nginx lua开发,继承了nginx高并发,高性能的特点,可以以非常小的性能损耗来防范大规模的cc攻击。

功能介绍

多节点管理

CDNFly支持多节点管理,可以在主控端同步更新同一个节点组的防cc配置,nginx配置等

网站管理

支持在控制面板添加,编辑,删除网站

防CC功能

内置多种防CC方法,以应付不同的攻击强度,如根据请求频率,浏览器自动识别,人工滑动验证,人工验证码等。
除了内置的这几种规则,还可以自定义自己的规则防护。

自动开启防护

在未受攻击的时候我们不想开启防攻击模式以免影响用户体验,这时候可以使用自动开启防护的功能。可以设置好开启防护的条件来自动开启防护。

允许爬虫

在开启防护的时候,像百度,谷歌,搜狗等为我们带来流量的搜索引擎的爬虫可能就无法正常访问我们的网站,这时候我们开启允许爬虫的功能,就可以免受防攻击模式的影响。

监控中心

添加新节点后,自动配置对域名请求频率、域名带宽的监控,以及节点Nginx性能、负载、硬盘、网络等监控。方便我们来查看节点及域名的运行情况,或者根据监控数据来查找问题。

界面截图

节点管理

服务器安全

网站管理

服务器安全

防护规则

服务器安全

域名监控

服务器安全

节点监控

服务器安全

安装和演示

安装:http://devops.webres.wang/2017/06/httpguard-installation/
演示:超级管理员:http://httpguard-demo.webres.wang:88/admin/login.html(admin/guard)
普通用户:http://httpguard-demo.webres.wang:88/user/login.html(user/user)

更多CDNFly文档

http://devops.webres.wang/tag/httpguard/

联系作者

QQ: 452336092

Nginx反向代理谷歌

这几天谷歌都被某墙折腾得不能用了啊。上谷歌搜索资料都要翻越某墙,真悲摧啊。干脆自己用国外的一个vps反向代理谷歌吧。下面贴出我反向代理谷歌的nginx配置,造福人类。
假设用devops.webres.wang反向代理谷歌,是假设,我可不愿意由于这个博客被墙。

  1. proxy_cache_path  /data/nginx/cache/one  levels=1:2   keys_zone=one:10m max_size=10g;
  2. proxy_cache_key  "$host$request_uri";
  3. server {
  4. listen 80;
  5. server_name devops.webres.wang webres.wang;
  6. rewrite ^(.*) http://devops.webres.wang$1 permanent;
  7. }
  8.  
  9. upstream google {
  10.  server 74.125.224.80:80 max_fails=3;
  11.  server 74.125.224.81:80 max_fails=3;
  12.  server 74.125.224.82:80 max_fails=3;
  13.  server 74.125.224.83:80 max_fails=3;
  14.  server 74.125.224.84:80 max_fails=3;   
  15.  }
  16. server {
  17.         listen      443;
  18.         server_name  devops.webres.wang webres.wang;
  19.          ssl on;
  20.     ssl_certificate /usr/local/nginx/conf/centos.crt;
  21.     ssl_certificate_key /usr/local/nginx/conf/centos.key;
  22. location / {
  23.                 proxy_cache one;
  24.                 proxy_cache_valid  200 302  1h;
  25.                 proxy_cache_valid  404      1m;
  26.                 proxy_redirect https://www.google.com/ /;
  27.                 proxy_cookie_domain google.com webres.wang;
  28.                 proxy_pass              http://google;
  29.                 proxy_set_header Host "www.google.com";
  30.                 proxy_set_header Accept-Encoding "";
  31.                 proxy_set_header User-Agent $http_user_agent;
  32.                 proxy_set_header Accept-Language "zh-CN";
  33.                 proxy_set_header Cookie "PREF=ID=047808f19f6de346:U=0f62f33dd8549d11:FF=2:LD=zh-CN:NW=1:TM=1325338577:LM=1332142444:GM=1:SG=2:S=rE0SyJh2w1IQ-Maw";             
  34.                 sub_filter www.google.com devops.webres.wang;
  35.                 sub_filter_once off;
  36. }
  37. }

解释下吧:

  • 1、这里监听了80和443端口,用了ssl加密,高大上。ssl证书是免费的,startssl,自己去申请个吧。
  • 2、定义了个upstream google,放了5个谷歌的ip,如果不这样做,就等着被谷歌的验证码搞崩溃吧。
  • 3、也设置了反向代理缓存,某些资源不用重复去请求谷歌获取,加快搜索速度。
  • 4、proxy_redirect https://www.google.com/ /; 这行的作用是把谷歌服务器返回的302响应头里的域名替换成我们的,不然浏览器还是会直接请求www.google.com,那样反向代理就失效了。
  • 5、proxy_cookie_domain google.com webres.wang; 把cookie的作用域替换成我们的域名。
  • 6、proxy_pass http://google; 反向代理到upstream google,会随机把请求分配到那几个ip。忘记说了,那几个ip可以在自己的vps或服务器上使用nslookup www.google.com获取。
  • 7、proxy_set_header Accept-Encoding “”; 防止谷歌返回压缩的内容,因为压缩的内容我们无法作域名替换。
  • 8、proxy_set_header Accept-Language “zh-CN”;设置语言为中文
  • 9、proxy_set_header Cookie “PREF=ID=047808f19f6de346:U=0f62f33dd8549d11:FF=2:LD=zh-CN:NW=1:TM=1325338577:LM=1332142444:GM=1:SG=2:S=rE0SyJh2w1IQ-Maw”; 这行很关键,传固定的cookie给谷歌,是为了禁止即时搜索,因为开启即时搜索无法替换内容。还有设置为新窗口打开网站,这个符合我们打开链接的习惯。
  • 10、sub_filter www.google.com devops.webres.wang;当然是把谷歌的域名替换成我们的了,注意需要安装nginx的sub_filter模块

好了,说明够详细了,祝各位享受到高质量的谷歌搜索。