十分钟解决爬虫问题!超轻量级反爬虫方案

释放双眼,带上耳机,听听看~!
爬虫和反爬虫日益成为每家公司的标配系统。爬虫在情报获取、虚假流量、动态定价、恶意攻击、薅羊毛等方面都能起到很关键的作用,所以每家公司都或多或少的需要开发一些爬虫程序,业界在这方面的成熟的方案也非常多。有矛就有盾,每家公司也相应的需要反爬虫系统来达到数据保护、系统稳定性保障、竞争优势保持的目的。然而,

111.jpg

爬虫和反爬虫日益成为每家公司的标配系统。

爬虫在情报获取、虚假流量、动态定价、恶意攻击、薅羊毛等方面都能起到很关键的作用,所以每家公司都或多或少的需要开发一些爬虫程序,业界在这方面的成熟的方案也非常多。

有矛就有盾,每家公司也相应的需要反爬虫系统来达到数据保护、系统稳定性保障、竞争优势保持的目的

然而,一方面防守这事ROI不好体现,另一方面反爬虫这种系统,相对简单的爬虫来说难度和复杂度都要高很多,往往需要一整套大数据解决方案才能把事情做好,因此只有少量的公司可以玩转起来。当出现问题的时候,很多公司往往束手无策。

本文将描述一种尽量简单的反爬虫方案,可以在十几分钟内解决部分简单的爬虫问题,缓解恶意攻击或者是系统超负荷运行的状况。整套方案会尽量简单易懂,不会涉及到专门的程序开发,同时尽量利用现有的组件,避免额外组件的引入。内容上主要分为三大部分:

  • 访问数据获取。采集用户的访问数据,用来做爬虫分析的数据源

  • 爬虫封禁。当找到爬虫后,想办法去阻断它后续的访问

  • 爬虫分析。示例通过简单策略来分析出爬虫

222.jpg

至于复杂的爬虫以及更精准的防御,另外讨论。

1简单的数据获取

数据获取是做好反爬虫系统的关键,常见的几种模式:

方案

优点

缺点

成本

应用内部埋点吐数据

最精确的数据,可以实现业务相关数据的分析

开发成本高

极高

中间件吐数据

精确的数据,部分业务相关的数据分析

开发成本较高

较高

访问日志(nginx/apache)

配置简单,开源的现成方案较多

只能取到部分数据

全流量镜像和分析(最佳)

最精确的数据,可以实现业务相关的分析,同时旁路系统,不影响生产

技术难度和开发成本高

较高

本篇采用nginx的日志方式,这种只需要通过对常见的nginx最简单的配置就能从远程获取相应的访问日志。

官方nginx配置:

log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n';
access_log syslog:server=127.0.0.1:9514 warden ;

tengine配置(编译时带上–with-syslog

log_format warden '" "$remote_addr" "$remote_port" "$server_addr" "$server_port" "$request_length" "$content_length" "$body_bytes_sent" "$request_uri" "$host" "$http_user_agent" "$status" "$http_cookie" "$request_method" "$http_referer" "$http_x_forwarded_for" "$request_time" "$sent_http_set_cookie" "$content_type" "$upstream_http_content_type" "$request_body"\n';
access_log syslog:user::127.0.0.1:9514 warden ;

这里面需要注意的是:

  • 由于较老的nginx官方版本不支持syslog,所以tengine在这块功能上做了单独的开发(需要通过编译选项来启用),在不确定的情况下,请修改配置 文件后先使用(nginx -t)来测试一下,如果不通过,需要重新在configure时加上syslog选项,并编译

  • 尽量获取了跟爬虫相关的数据字段,如果有定制的http header,可以自行加上

  • 采用udp方式来发送syslog,可以将访问日志发送给远端分析服务,同时udp的方式保证nginx本身不会受到影响

  • 访问日志拿不到响应的具体内容(nginx有办法搞定,但有代价),无法支持业务相关的防护


2简单的爬虫封禁

反爬虫最后的生效,需要靠合理的封禁模式,这里比较几种模式:

方案

优点

缺点

支持的封禁类型

成本

应用内部埋点阻断

(框架实现为佳)

灵活性强,可以做各种阻断策略

成本非常高

所有的封禁类型
(ip/设备指纹/用户)

中间件(如nginx)封禁(最佳)

灵活性强,nginx通过lua可以实现各种阻断方案

架构需要支持,运维水平较高

大部分封禁类型

(ip/设备,用户不确定)

硬件防火墙

容易操作和实现,性能也最好

需要硬件;灵活性差,只能封直连IP;且自动化不方便

(无法应对ip在http流量里的情况,如XFF header)

只支持直连ip

iptables

容易操作和实现,性能良好

灵活性差,只能封直连IP;且自动化不方便

(无法应对ip在http流量里的情况,如XFF header)

只支持直连ip

本段将介绍基于iptables的方案,虽然适用范围较小,但是依赖少,可以通过简单配置linux就能达到效果。

第一步

安装ipset。ipset扩充了iptables的基本功能,可以提供更加高效的访问控制

# centos 6.5上面安装非常简单
sudo yum install -y ipset

第二步

在iptables中建立相应的ipset,来进行访问权限的封禁

# 新增用于封禁的ipset
sudo ipset -N --exist warden_blacklist iphash
# 增加相应的iptables规则
sudo iptables -A INPUT -m set --set warden_blacklist src -j DROP
# 保存iptables
sudo service iptables save

第三步

获取当前封禁的ip黑名单,并导入到iptables里面去

sudo ipset --exist destroy warden_blacklist_tmp; sudo ipset -N warden_blacklist_tmp iphash; echo "1.1.1.1,2.2.2.2" | tr , "\n" | xargs -n 1 -I {} sudo ipset -A warden_blacklist_tmp {} ; sudo ipset swap warden_blacklist_tmp warden_blacklist

这里为了尽可能的提升效率,作了以下事情:

  • 建立临时ipset,方便做操作

  • 将当前封禁黑名单中的ip提取出来,加入到此ipset(示例中用了最简单的echo来展示,实际可相应调整)

  • 将ipset通过原子操作与iptables正在使用的ipset作交换,以最小的代价将最新的黑名单生效


3简单的爬虫策略

要能精确的分析爬虫,需要强大的数据分析平台和规则引擎,来分析这个IP/设备/用户分别在短时间区间/长时间范围里的行为特征和轨迹。

这里涉及到了非常复杂的数据系统开发,本文将通过简单的shell脚本描述比较简单的规则。

例子1

封禁最近100000条中访问量超过5000的ip

nc -ul 9514 | head -100000 | awk -F '" "' '{print $2}' | sort | uniq -c | sort -nr | awk '$1>=5000 {print $2}'

这里面:

  1. udp服务监听nginx发过来的syslog消息,并取10000条,找到其中每条访问记录的ip

  2. 通过sort 和uniq来获取每个ip出现的次数,并进行降序排列

  3. 再通过awk找到其中超过阈值的ip,这就得到了我们所需要的结果

例子2

封禁最近100000条中user agent明显是程序的ip

            

给TA买糖
共{{data.count}}人
人已赞赏
HackerNews

四叶草安全获6700万元A轮融资 公司战略全面升级

2017-12-29 10:49:12

HackerNews

【技术分享】Nginx Lua日志收集

2017-12-29 11:49:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索