Jimmy来教会访问,中午吃饭的时候随口聊了几句技术问题。Fiona在边上说,不准说听不懂的黑话……于是我们一起怼她说,如果我们不说黑话,你怎么可以在国内自由地发facebook呢?

Jimmy加上一句,你怎么能在国内上instgram呢?

所以,有的时候后端技术还是需要的,虽然在前端的那位,看起来特别风光靓丽。

一旦自己开始管理网站,就发现需要处理的问题太多。我的朋友Water的网站被人黑的已经比春晚的猴子还要黑了,各种bot在上面肆意妄为,还有用字典攻击phpadmin数据库密码的项目,有一个名叫auth-ready.php的文件负责把输入的所有用户名和密码发给一个google邮箱和一个俄罗斯的邮箱(幸好我懒,没有配mail服务,所以应该什么也发不出去)。

只有使用fail2ban,开始认真地防范。

fail2ban基本上有三个部分组成:

  • jail:配置对某个日志文件的监控,命中条件,定义要应用的正则表达式过滤器,以及要采取的行动,封锁ip的时间等等。
  • filter: 一个正则表达式,用来提取日志中符合条件的ip地址。比如,failregex = ^<HOST> -.*”(GET|POST|HEAD).*HTTP.*” 404 ,据提取nginx访问日志中一切 get|post|head 返回404的ip。

举例如下:

68.180.228.151 - - [18/Feb/2018:21:30:35 -0600] "GET /xiaoshuo/6203/du1968347.html HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
68.180.228.151 - - [18/Feb/2018:21:30:37 -0600] "GET /xiaoshuo/5749/ HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
68.180.228.151 - - [18/Feb/2018:21:30:37 -0600] "GET /xiaoshuo/20580/ HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
68.180.228.151 - - [18/Feb/2018:21:30:38 -0600] "GET /xiaoshuo/4552/du1192650.html HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
68.180.228.151 - - [18/Feb/2018:21:30:46 -0600] "GET /xiaoshuo/7997/du2551842.html HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"

Yahoo的爬虫是我放行的,但是它完全不尊重我设定的robot.txt参数:

# disallow all
 User-agent: *
 Disallow: /
 <span style="color: #ff0000;"><strong>Crawl-delay: 600</strong></span>

# but allow only important bots
 User-agent: Googlebot
 User-agent: Googlebot-Image
 User-agent: Mediapartners-Google
 User-agent: msnbot
 User-agent: msnbot-media
 User-agent: Slurp
 User-agent: Yahoo-Blogs
 User-agent: Yahoo-MMCrawler

告诉它10分钟访问一次,可是却不停的访问一个叫做“小说( /xiaoshuo/)”的不存在目录。这已经算是一种ddos攻击了。

所以,我为所有404设定了一个监狱:

[nginx-404]
 enabled = true
 port = http,https
 filter = nginx-404
 logpath = %(nginx_access_log)s
 maxretry = 3
 findtime = 60
 banTime = 60000
 action = iptables-multiport[name=404]

如果在一分钟之内发现某个ip出现三次404,就封锁1000分钟。封锁的方式就是action = iptables-multiport

  • action: 命中的ip,就直接进入防火墙的封锁名单。

直接上iptable的例子:
-A f2b-404 -s 68.180.228.151/32 -j REJECT –reject-with icmp-port-unreachable


目前我的服务器上线的监狱有9个:

 nginx-403, nginx-404, nginx-badbots, nginx-botsearch, nginx-limit-req, nginx-nohome, nginx-noproxy, php-url-fopen, sshd

好事者在github上给出的过滤器有许许多多:

https://github.com/Bebef/fail2ban-filter.d

凡是命中sshd监狱的ip,自动上报abuseIPDB备案。但是,还有一些actions可以直接查whois数据库,并且自动给注册的管理员发一封邮件。这种事情确实有点毒辣,等于一个IP攻击别的机器,变成了反攻自己的邮件炸弹。


一个小细节。如何通知fail2ban,某个日志文件有了变化,需要重新扫描,是一个问题。

对于系统文件,可以采用systemd扫描日志,但是但对于其他日志文件,需要用gamin或者别的协议作为backend来通讯。所以,需要安装fail2ban-gamin包。否则,所有的jail都不会工作,因为没有可以监控的日志文件。

这就是今晚的休息时间。睡觉了。