统计每一个tcp和udp连接的IP地址和连接数

2019年6月28日

 做系统运维的朋友们肯定会经常遇到DDoS攻击的情况,说实话,对于这种攻击很令人无奈,上昂贵的硬件防护设备不可能,即使上了效果也不是100%的好,一般来说误杀率能低于20%就不错了,更多情况是各种新型的攻击数据包导出不穷,大多数乾脆就是正常的HTTP连接,让服务器无法拒绝。而使用开源免费的防护软件更是不如人意。在这种情况下只能自己来统计每一个连接进来的IP各自建立了多少个连接来判断它是不是恶意连接。但这也有一个问题,假如攻击者同时控制了几百个甚至上千个肉机,那麽他就可以做到每个攻击IP只建立较少的连接数即可达到攻击的目的,对于防护方来说每个IP的连接数都在正常范围以内。因此针对这种情况,只能辅以查看IP地址归属地来人为判断是否攻击IP。
1、利用netstat查看每一个连接进来的TCP或UDP连接,并计算每个IP的连接数:

netstat -ntu |grep -E "tcp|udp" |awk '{print $5}' |grep -E "^[1-9]" | cut -d: -f1 | sort | uniq -c | sort -n
我运行的结果如下:
      1 113.25.26.49
      1 118.117.25.71
      1 123.126.50.74
      1 14.110.35.95
      1 192.168.11.7
      1 61.135.249.220
      6 124.90.162.189
     10 127.0.1.1

 

      第一列是连接数,第二列是连接IP
对于ipv6地址使用以下命令统计:

netstat -ntu |grep -E "tcp|udp" |awk '{print $5}' |grep -E "^.*:.*:.*:" | cut -d: -f1-4 | sort | uniq -c | sort -n
我统计的结果如下:
      1 ::ffff:xxx.xxx.xxx.xxx
      2 ::ffff:119.97.220.90
      2 ::ffff:127.0.0.1
      9 ::ffff:121.52.210.134
     10 ::ffff:127.0.1.1
 

到底每个IP的连接数是多少个才被认为有DDOS攻击嫌疑呢?这就要靠自己判断了,比上面的结果可以看到,我们的系统很健康,没有DDoS攻击的迹象,我曾经发现过100多个连接的IP,我认为它就是一个攻击连接,我的定位是超过30个连接就要关注了,超过60个连接就要准备掐断它,超过100个连接就直接drop,同时禁止它连接。
 
2、利用tcpdump抓包工具来侦测每IP的连接数:

tcpdump -c 10000 -i eth0 -n dst port 80 > /tmp/ddos_ip
cat /tmp/ddos_ip|awk '{print $3}'|cut -d. -f1-4|uniq -c | sort -n
      2 203.208.60.206
      3 203.208.60.206
      5 xxx.xxx.xxx.xxx

解释一下,-c 10000意思是抓取10000个数据包;-i eth0意思是抓取从网络接口eth0进来的数据包;-n 意思是不把网络地址转换成名字;dst port 80 意思是指定抓取目的端口是80的数据包;> /tmp/ddos_ip 意思是把抓取结果输出到文件/tmp/ddos_ip中。
第二条命令是查看输出文件内容,同时统计每个访问IP的连接数,由于我只指定抓取了10个包,因此统计结果一共只有2+3+5=10个包。
我们还可以用一条命令来达以统计的目的:

tcpdump -c 10 -i eth0 -n dst port 80|awk '{print $3}'|cut -d. -f1-4|uniq -c | sort -n

 
注意如果80端口的连接访问很稀疏的话,这条命令运行起来很得费些时间,因为它要抓足10000个满足条件的数据包才会停止,因此要耐心等待。一般网站访问正常的情况下就不要使用这个方法了。
用tcpdump查看连接到tcp 80端口的连接IP要比netstat详细得多,也准确得多。正常情况下我一般只用netstat看一下,非正常情况我才会使用tcpdump。
 

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注