nginx可通过location块中deny/allow指令实现ip访问控制,无需额外模块;需按顺序书写规则、正确指定ip段格式、配置在站点文件而非主配置、语法检查后重载生效。

直接在 Nginx 的 server 或 location 块里用 deny 指令就能实现,不需要额外模块或编译,配置简单、生效快。
在 location 块中写 deny 规则
这是最常用也最直观的方式。把要拒绝的 IP 段写在 location / { } 里,配合 allow 和 deny all 控制访问逻辑。
- 只拒绝某个 IP 段(比如 192.168.5.0/24),其他都放行:
location / {<br> deny 192.168.5.0/24;<br> allow all;<br>} - 只允许某几个 IP 段访问,其余全部拒绝(白名单模式):
location / {<br> allow 203.0.113.0/24;<br> allow 2001:db8::/32;<br> deny all;<br>}
注意:allow必须写在deny all前面,Nginx 按顺序匹配,遇到第一条匹配就停止。
规则写在哪?优先选虚拟主机配置文件
不建议直接改 /etc/nginx/nginx.conf 主配置,而是编辑站点对应的配置文件,比如:/etc/nginx/conf.d/example.com.conf 或 /etc/nginx/sites-enabled/example.com。
- 打开对应文件,找到
server块 - 在
server内添加location / { ... },或直接加在已有location里 - 避免写在
http块顶层——那样会影响所有站点,容易误伤
验证与重载必须做
写完不能直接重启,得先检查语法再平滑重载:
- 执行
sudo nginx -t—— 确认输出 “syntax is ok” 和 “test is successful” - 没问题后运行
sudo nginx -s reload,让新规则立即生效,不影响正在处理的请求 - 测试时可用
curl -x http://恶意IP:80 http://yourdomain.com模拟(或换一台机器用被禁 IP 访问)
常见坑点提醒
看似简单,但容易出错的地方集中在顺序和范围写法上:
-
deny 192.168.1.100;是单个 IP;deny 192.168.1.0/24;才是整个 C 类网段(注意末尾斜杠和掩码) - IPv6 要写完整格式,例如
deny 2001:db8::/32;,不能省略::或写成2001:db8:/32 - 如果同时用了多个
location,确保规则加在真正处理请求的那个块里(比如静态资源走location /,API 走location /api,就得分别加)











