Nginx 指定目录屏蔽国内外IP访问网站

2023-8-11 110 8/11

目前网站需要屏蔽一些特定的IP与特定来源的网友,禁止他们访问。例如一些外贸网站需要屏蔽国内IP,国内的屏蔽外国IP,阻止从某个特定网站过来的用户,比如从知乎的跳转链接访问站内资源链接就自动跳转到博客首页。这里写一种最简单快速的,不需要重新编译nginx的方法。


屏蔽指定IP访问

  • 屏蔽命令
    Nginx提供了两个最基本的屏蔽和允许IP的命令:deny 屏蔽、allow 允许
# 屏蔽单个IP
deny IP;
# 屏蔽所有IP
deny all;
# 屏蔽IP段
deny 123.0.0.1/16;
# 允许单个IP访问
allow IP;
# 允许全部
allow all;
# 允许IP段
allow 123.0.0.1/16;
  • 指定目录
    在 Nginx 的配置文件中,可以使用 location 块来匹配特定的 URL 路径。
    比如我们想在 /foo 开头的 URL 路径中启用屏蔽

    • 匹配所有以 /foo 开头的 URL 路径,例如 /foo/bar 和 /foo/baz/qux 等
    location /foo {
    deny 123.0.0.1/16;
    allow all;
    }
    
    
    • 如果要精确匹配 /foo,要使用如下配置
    location = /foo {
    deny 123.0.0.1/16;
    allow all;
    }
    
    
    • 当然你也可以用正则匹配目录
    location ~ ^/foo/[0-9]+$ {
    deny 123.0.0.1/16;
    allow all;
    }
    

屏蔽指定来源访问

比如我们想屏蔽abc.com和abc.net以及他们的子域名访问我们的网站

    #阻止特定网站用户访问
    if ($http_referer ~* "abc.(com|net)") {  
    return 403;  }

屏蔽指定地区访问

有时候我们想只允许某些地区的用户可以访问我们的网站。知道上边两个方式,剩下的问题就是怎么得到某个地区的所有IP段了。我们可以从ip2location中获取。

  1. 访问ip2location
    Nginx 指定目录屏蔽国内外IP访问网站
    框左边选择城市,中间框选V4还是V6,右边选择规则类型,根据需要选择即可。
    图中为:屏蔽印度的IPv4
    然后点 DOWNLOAD下载即可,解压之后是一个txt 文件

  2. 删除最开始的 location / { 和最后的 } ,最后增加一行 allow all;
    将后缀名从 .txt 改为 .conf 上传到服务器上,记住放置的目录。(比如/usr/local/nginx/conf/nginx.conf/firewall.conf)
    Nginx 指定目录屏蔽国内外IP访问网站

  3. 修改站点对应的 Nginx 配置文件,比如 /foo 目录只允许非印度的IP访问

location /foo {
include /usr/local/nginx/conf/nginx.conf/firewall.conf;
}

这里示例是使用location字段指定子目录 ,
如果你想全站生效可以写到sever或者http字段,比如

server
    {
    listen  80;
    listen  [::]:80;
    listen  443 ssl http2;
    listen [::]:443 ssl http2;
    include /usr/local/nginx/conf/nginx.conf/firewall.conf;
    }
  1. 保存,重新加载 Nginx 配置文件即可。
sudo nginx -s reload

- THE END -

非特殊说明,本博所有文章均为博主原创。