nginx阻止IP访问

今天意外发现公司的服务器负载和CPU都爆表,查看网站日志后发现是有爬虫在爬取网站数据,于是配置nginx以阻止爬虫爬取。

server {
    listen 80;
    server_name runtuchigua.cn;
    
    # 阻止整个C类网段
    deny 192.168.1.0/24;
    
    # 阻止B类网段
    deny 172.16.0.0/16;
    
    # 阻止A类网段
    deny 10.0.0.0/8;
    
    allow all;
    
    # 其他配置...
}

这里着重说一下 IP后面紧跟着的/8/16/24 是什么意思

/8/16/24 这些是 CIDR(无类别域间路由,Classless Inter-Domain Routing) 表示法中的 子网掩码前缀长度,用来表示 IP 地址中网络部分占多少位。

它们决定了一个 IP 地址段(网段)包含多少个 IP 地址。

IPv4 地址由 32 位二进制数组成,通常写成四个十进制数,如:192.168.1.10

  • /24 表示前 24 位是网络部分,剩下的 8 位是主机部分。
  • 主机部分有 n 位 → 可表示 2^n 个 IP 地址。

🔢 常见的 CIDR 含义解释:

CIDR二进制掩码十进制掩码IP 数量常见用途
/8前 8 位为 1255.0.0.02^24 = 16,777,216 个 IPA 类网段,如 10.0.0.0/8
/12前 12 位为 1255.240.0.02^20 = 1,048,576 个 IP大型私有网络(如 172.16.0.0/12
/16前 16 位为 1255.255.0.02^16 = 65,536 个 IPB 类网段,如 172.17.0.0/16
/24前 24 位为 1255.255.255.02^8 = 256 个 IPC 类网段,如 192.168.1.0/24

🧠 举例说明:

✅ deny 192.168.1.0/24;

  • 匹配从 192.168.1.0 到 192.168.1.255 的所有 IP
  • 共 256 个 IP
  • 常用于小型局域网

✅ deny 10.0.0.0/16;

  • 匹配从 10.0.0.0 到 10.0.255.255 的所有 IP
  • 共 65,536 个 IP
  • 属于 10.0.0.0/8 的一个子网

✅ deny 172.16.0.0/12;

  • /12 是一个特殊范围,对应 172.16.0.0 到 172.31.255.255
  • 共 1,048,576 个 IP
  • 这是 RFC1918 定义的私有 B 类地址段(16 个连续的 /16 网段)

💡 为什么是 /12?因为 172.16.0.0 ~ 172.31.255.255 的前 12 位是固定的:

  • 172.16 → 二进制前缀 10101100.0001
  • 共 12 位相同,所以用 /12

🛠 如何快速计算 IP 数量?

公式:
IP 数量 = 2^(32 – 前缀长度)

例如:

  • /24 → 2^(32-24) = 2^8 = 256
  • /16 → 2^16 = 65,536
  • /12 → 2^20 = 1,048,576
  • /8 → 2^24 = 16,777,216

⚠️ 注意:实际可用 IP 会少 2 个(网络地址和广播地址),但在 Nginx 中我们关心的是匹配范围,不需要减。


✅ 总结

CIDR含义覆盖 IP 数量示例
/24C 类网段256192.168.1.0/24
/16B 类网段65,536172.16.0.0/16
/12一组 B 类网段~100万172.16.0.0/12(172.16~172.31)
/8A 类网段~1600万10.0.0.0/8