爬虫或恶意攻击,如何动态屏蔽IP地址?

更多内容关注微信公众号:fullstack888

背景

为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP ,拒绝提供服务。

架构

实现 IP 黑名单的功能有很多途径:

1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求;

2、在 Web Server 层面,通过 Nginx 自身的 deny 选项 或者 lua 插件 配置 IP 黑名单;

3、在应用层面,在请求服务之前检查一遍客户端 IP 是否在黑名单。

为了方便管理和共享,我们选择通过 Nginx+Lua+Redis 的架构实现 IP 黑名单的功能,架构图如下:

cff131e7c812e1486509bd32f71b34cf.png

实现

1、安装 Nginx+Lua模块,推荐使用 OpenResty,这是一个集成了各种 Lua 模块的 Nginx 服务器:

9362eecc25ae00f44d306bc4294a5bd0.png

2、安装并启动 Redis 服务器;

3、配置 Nginx 示例:

eeb3cb099b3d51732eae77eb62f42a26.png

Nginx 配置

其中

lua_shared_dict ip_blacklist 1m;

由 Nginx 进程分配一块 1M 大小的共享内存空间,用来缓存 IP 黑名单。

access_by_lua_file lua/ip_blacklist.lua;

指定 lua 脚本位置。

4、配置 lua 脚本,定期从 Redis 获取最新的 IP 黑名单。

5f681d800fdcd80a76485d28384b6d49.png

5、在 Redis 服务器上新建 Set 类型的数据 ip_blacklist,并加入最新的 IP 黑名单。

完成以上步骤后,重新加载 nginx,配置便开始生效了。这时访问服务器,如果你的 IP 地址在黑名单内的话,将出现拒绝访问,如下图:

f4cf9ab41f9660a25cdb47ba4fe4b3c3.png

总结

以上,便是 Nginx+Lua+Redis 实现的 IP 黑名单功能,具有如下优点:

  • 配置简单、轻量,几乎对服务器性能不产生影响;

  • 多台服务器可以通过Redis实例共享黑名单;

  • 动态配置,可以手工或者通过某种自动化的方式设置 Redis 中的黑名单。

- END -

往期回顾

纯干货:系统架构性能问题诊断及优化思路

一个复杂系统的拆分改造实践!

代码整洁 vs 代码肮脏

搞懂系列三: G1垃圾收集器

搞懂系列二: Redis到底快在哪里

搞懂系列一: MySQL InnoDB B+树索引

一张图看懂微服务架构路线

支付系统-对账系统

7de88feedc3bea9e8b997bd6b62ff9e0.png

技术交流,请加微信: jiagou6688 ,备注:Java,拉你进架构群

### 谷歌爬虫(Googlebot)使用的IP地址范围 谷歌爬虫(Googlebot)通常会使用一系列特定的IP地址来抓取网页内容。为了识别来自Googlebot的请求并确保其合法性,可以参考以下方法: #### Google官方文档中的IP地址范围 Google提供了专门的工具和服务来验证Googlebot的真实身份及其所用的IP地址范围。具体来说,Googlebot主要使用以下两类IP地址: - **IPv4 地址**: 这些地址属于`66.249.x.x`, `64.233.x.x`, 和其他一些由Google分配给搜索引擎的子网[^1]。 - **IPv6 地址**: 对于支持IPv6的环境,Googlebot可能会使用类似于`2001:4860::/32`这样的前缀。 可以通过反向DNS查询确认某个IP是否确实归属于Googlebot。如果一个IP能够解析到域名形式为`crawl-*.googlebot.com`,则该IP可被认为是合法的Googlebot访问源[^2]。 #### 验证Googlebot的方法 由于存在伪装成Googlebot的行为(即所谓的“假扮蜘蛛”),因此建议采取额外措施加以辨别: 1. 反查指定IP对应的PTR记录; 2. 将所得主机名再次正向查找看它是否会映射回原始IP地址上; 3. 利用Google Webmaster Tools API接口者在线服务完成自动化认证过程。 以下是Python脚本示例代码用于执行上述操作之一——基于socket库实现简单的双向DNS验证逻辑: ```python import socket def verify_googlebot(ip_address): try: # Perform reverse DNS lookup. hostname, _, _ = socket.gethostbyaddr(ip_address) # Check if the hostname ends with googlebot.com. if not hostname.endswith('googlebot.com'): return False # Forward resolve to ensure consistency between forward and reverse lookups. resolved_ips = socket.gethostbyname_ex(hostname)[2] # Ensure that original IP is present within results of forward resolution. return ip_address in resolved_ips except Exception as e: print(f"Error occurred during verification: {e}") return False if __name__ == "__main__": test_ip = "66.249.66.1" result = verify_googlebot(test_ip) print("Is valid Googlebot:", result) ``` #### 处理与Googlebot相关的IP问题 当网站管理员希望优化针对Googlebot的服务质量时,可以从以下几个方面入手: - 设置robots.txt文件明确允许拒绝某些路径被索引; - 使用`.htaccess`规则有条件地放行已知安全的Googlebot流量而屏蔽恶意模仿者[^3]; - 如果发现异常高频次请求,则考虑调整服务器端缓存策略减轻负担;同时也可以借助CDN分发机制进一步缓解压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值