最近发现自己的服务器和wordpress经常被各种扫描和CC攻击,各种暴力破解密码,扫描漏洞,让本来就配置不高的vps不堪重负。本来我也没怎么在意,但这几天经常mysql就瘫痪了,让我不得不用shell自动重启mysql。因为实在烦的不行,所以看看是否有办法能缓解下这种问题。搜寻了半天,有2个不错的解决方法。
- 使用nginx+waf的组合,
- fail2ban
今天就说下我通过fail2ban的解决方法。关于fail2ban的安装和功能,这里就不多介绍了,基本常用linux的小伙伴们都熟悉。这里我使用fail2ban的filter功能来尝试干掉哪些频繁扫描我某些特定文件未果,以及不停尝试我登录密码的货门。
- 防御屏蔽哪些扫描特定名字目录文件未果导致404的的IP, 在/etc/fail2ban/filter.d/目录下创建文件: nginx-dos.conf文件,内容入下:2018.11.26更新
[Definition] #屏蔽哪些扫描特定名字目录文件未果导致404的的IP failregex = (?i)
-.*"(GET|POST|HEAD).*.(php|html|htm|asp|aspx|zip|gz|rar|\}|\}\}).+[\s]+(404|403|301).+Mozilla.*" ignoreregex = 针对下图这种模式的扫描.
- 防御和屏蔽暴力穷举wordpress密码的的攻击IP, 在/etc/fail2ban/filter.d/目录下创建文件: wp-cclogin.conf文件,内容入下:
[Definition] #屏蔽哪些不停尝试通过wp-login.php登录的IP failregex = ^
\s*-.*"(GET|POST|HEAD).*\s*wp-login\.php\s*.*"$ ignoreregex = 针对下图这种模式的扫描.
- 编写完毕filter之后,下一步我们需要加载这些filter,编辑/etc/fail2ban/jail.local,加入如下内容
[nginx-dos] # @author xiexiejiao enabled = true port = http filter = nginx-dos action = iptables[name=HTTP, port=http, protocol=tcp] logpath = /www/logs/access_nginx.log findtime = 10 bantime = 86400 maxretry = 10 [wp-cclogin] # @author xiexiejiao enabled = true port = http filter = wp-cclogin action = iptables[name=HTTP, port=http, protocol=tcp] logpath = /www/logs/xiexiejiao_nginx.log findtime = 10 bantime = 86400 maxretry = 5
- 重启fail2ban
sudo /etc/init.d/fail2ban restart
至此,终于可以消停一阵子了。今天查看了下日志,确实这种无脑的扫描少了好多。下次我再试试nginx+waf的方法。