自动屏蔽一些恶意IP


之前看到过一篇文章:VPS 屏蔽扫描网站的IP 里面讲了一些VPS如何屏蔽恶意IP的访问的方法和技巧,比较受用,但是其中提到的那个Perl脚本不知道是不是我对Perl不够熟悉导致不会配置的原因,在我这儿没什么效果{当然也和我这blog本来就没什么人会来恶意攻击有关,因为不值得浪费攻击资源在我这小blog上,o(╯□╰)o},而我自己也一直想写个脚本实现和之前的屏蔽指定国家的IP的功能,不过一直没找到切入点和方法,后来在我经常使用的用awk统计命令top10的时候想到了方法,再加上慢慢搜索awk的一些编程范例,折腾了一下就出了个大概的方案,感觉还行,但现在没这条件测试(没攻击流量过来,当然我也不希望有,感谢大家也不这么做),先放脚本上来吧:

#!/bin/bash

IPTABLES=/sbin/iptables
log_file = "/path/to/access.log"
error_block = 10
expire_time = 7200

#tail --follow=$log_file
awk '/ 404 /{status404[$1]++}; END {for (IP in status404) print status404[IP]"t", IP}' $log_file | sort -nr | awk '{if($1>$error_block) {print $2}}' | tee 404_ipList.txt

for ip in 404_ipList.txt
do
	echo "blocking $ip"
	$IPTABLES -A INPUT -s $ip -j DROP
done

# after $expire_time seconds, you can empty the 404_ipList.txt

#---------------------------#
#awk '{if($9 ~ /404/){status404[$1]++}} END {for (IP in status404) print status404[IP]"t", IP}' $log_file | sort -nr | awk '{if($1>$error_block) {print $2}}' | tee 404_ipList.txt

#awk '{if($9==404){status404[$1]++}} END {for (IP in status404) print status404[IP]"t", IP}' $log_file | sort -nr | awk '{if($1>$error_block) {print $2}}' | tee 404_ipList.txt
过程中出现的一些问题:

awk ‘if($9==404){status404[$1]++}; END {for (IP in status404) print status404[IP]”t”, IP}’ /path/to/access.log | sort -nr | awk ‘{if($1>10) {print $2}}’ | tee 404_ipList.txt

在执行上面的命令时总是报错:
awk: ^ syntax error

后来我到处找awk的if语句的语法,对比了一下也没发现明显的错误(当然也和别处没有直接对应的例子有关),然后我试着对这个if判断语句及后面的操作这一整体添加大括号,果然就没事了,看来良好的编程习惯真的是有助于减少错误的概率啊!
awk ‘{if($9==404){status404[$1]++}} END {for (IP in status404) print status404[IP]”t”, IP}’ /path/to/access.log | sort -nr | awk ‘{if($1>10) {print $2}}’ | tee 404_ipList.txt

====

改进了之后的一个版本(添加了一个白名单):
#!/bin/bash

IPTABLES=/sbin/iptables
log_file = "/path/to/access.log"
error_block = 10

#tail --follow=$log_file
awk '/ 404 /{status404[$1]++}; END {for (IP in status404) print status404[IP]"t", IP}' $log_file | sort -nr | awk '{if($1>$error_block) {print $2}}' | tee 404_ipList.txt

whitelist=$(last | grep -Ev '^$|mosh|reboot|wtmp' | awk '{print $3}' | sort | uniq | xargs)

for ip in 404_ipList.txt
do
	if ! $(echo ${whitelist} | grep -wq ${ip}); then
		echo "blocking ${ip}"
		$IPTABLES -I INPUT -s ${ip}/32 -p tcp -m tcp --dport 80 -j DROP
	fi
done
一些参考资料:
, , ,

《 “自动屏蔽一些恶意IP” 》 有 3 条评论

  1. […] 之前其实弄过一个自动屏蔽恶意攻击者的IP的脚本{还写了篇文章:自动屏蔽一些恶意IP}(但其实我一直没有实际部署上去,因为看了看日志文件发现本来访问流量就不大,虽然其中也有一些是扫描器的行为,但是对现在的blog访问还没产生什么实际影响,所以就暂时搁置了),但是昨天在浏览别人的blog时发现了篇文章:简单实现自动过滤WEB攻击源IP,解决了之前我一直没有想到该如何处理的几个问题(1.如何避免屏蔽自己的IP,因为现在使用的是PPPoE的拨号式网络,没有一个固定的IP,而自己又会经常上自己的blog看看,有时是以管理员身份,有时就是以访客的身份,当时没有想到该如何避免屏蔽自己的IP所以就没添加这个白名单的功能–其实也和我租的第一台VPS无法执行last命令有关;2.定期清除记录;3.处理关于评论和后台登陆页面的访问),所以,就又关注起了这个事情。因为代码的功能已经基本上满足一般要求(你可以自己在脚本中添加函数实现特定功能,如:记录/屏蔽访问特定URL的IP)了,所以这次以学习为主(而且各人碰到的情况也不一样,需要适当做出修改以符合自己的情况,脚本中的情况就是:根据当前服务器的访问日志来看,如果在10000个请求中,有1000个请求来自于同一个IP的话,那么其攻击特征就非常明显了;另外,针对后台登陆页面和评论页面,单独制定了更加严格的规则,那就是在10000次POST请求中,如果有100次尝试,就Block掉): […]

  2. […] 七月 19, 2014 admin 发表回复 今天准备实际测试一下昨天修改过的“自动屏蔽一些恶意IP”的文章,看看其中的脚本是否能够正常运行,先用echo代替了真实的iptables屏蔽,但是就是无法按照预想的正常工作: awk ‘/ 404 /{status404[$1]++}; END {for (IP in status404) print status404[IP]“t”, IP}’ $log_file | sort -nr | awk ‘{if($1>$error_block) {print $2}}’ | tee 404_ipList.txt    # $error_block 因为是外部变量,必须要用单引号引起来才行!!! whitelist=$(last | grep -Ev ‘^$|mosh|reboot|wtmp’ | awk ‘{print $3}’ | sort | uniq | xargs) […]

  3. 每周业务情报|黑产新工具之IP魔盒:IP攻防新挑战
    https://mp.weixin.qq.com/s/Mn2jjpDirD1hJfxIrfu1Ng
    `
    众所周知,IP资源是黑产进行规模化攻击的核心资源,在永安在线的过往报告中大量讨论了黑产为了绕过IP检测,使用代理IP、秒拨IP等技术进行攻击。

    根据永安在线长期的研究,得知这类IP本质上还是家庭宽带、数据中心等IP,通过一定的技术手段,在一定时间内都可以将IP和设备进行关联标记。

    但随着攻防对抗的升级,黑产将视线转移到更为隐蔽的基站IP上。近日,永安在线发现一款可让PC设备使用基站IP的工具,黑产称它为“IP魔盒”。

    我们总结了IP魔盒拥有以下特征:
    1) 关联用户多:一个基站IP背后会关联着大量的用户群体,如果对IP进行拦截,极易误杀正常用户,影响用户体验,导致用户流失。
    2) 切换IP简单:仅需要通过打开关闭飞行模式,即可实现IP切换。
    3) 成本较低:据我们统计一般全国物联网卡,开卡价格为4-6元,10G流量价格仅需要15元。
    4) 海量IP池:经测试一张全国物联网卡可以获取至少17个段的IP,且分布在不同的地区。

    因为IP魔盒获取IP的特殊方式,它在IP量、攻击效率、价格成本、检测方式、部署成本各个方面都大大优于秒拨IP和代理IP。
    `

发表回复

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