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 位为 1 | 255.0.0.0 | 2^24 = 16,777,216 个 IP | A 类网段,如 10.0.0.0/8 |
/12 | 前 12 位为 1 | 255.240.0.0 | 2^20 = 1,048,576 个 IP | 大型私有网络(如 172.16.0.0/12 ) |
/16 | 前 16 位为 1 | 255.255.0.0 | 2^16 = 65,536 个 IP | B 类网段,如 172.17.0.0/16 |
/24 | 前 24 位为 1 | 255.255.255.0 | 2^8 = 256 个 IP | C 类网段,如 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 数量 | 示例 |
---|---|---|---|
/24 | C 类网段 | 256 | 192.168.1.0/24 |
/16 | B 类网段 | 65,536 | 172.16.0.0/16 |
/12 | 一组 B 类网段 | ~100万 | 172.16.0.0/12 (172.16~172.31) |
/8 | A 类网段 | ~1600万 | 10.0.0.0/8 |