nginx限制国家地区访问

网站通过nginx设置黑/白名单IP限制、国家城市IP访问限制#

nginx配置黑白名单有好几种方式,这里只介绍常用的两种方法。#

1. 第一种方法:allow、deny#

deny 和 allow指令属于 ngx_http_access_module,nginx默认加载此模块,所以可直接使用。#

这种方式,最简单,最直接。设置类似防火墙iptable,使用方法:#

直接配置文件中添加:#

#白名单设置,allow后面为可访问IP 
location / {     
    allow 123.13.123.12;     
    allow 23.53.32.1/100;     
    deny  all;
}
#黑名单设置,deny后面接限制的IP,为什么不加allow all? 因为这个默认是开启的 
location / {     
    deny 123.13.123.12;
}
#白名单,特定目录访问限制
location /tree/list {     
    allow 123.13.123.12;     
    deny  all;
}

或者通过读取文件IP配置白名单#

location /{    
    include /home/whitelist.conf;    
    #默认位置路径为/etc/nginx/ 下,    
    #如直接写include whitelist.conf,则只需要在/etc/nginx目录下创建whitelist.conf    
    deny all;
}

在/home/目录下创建whitelist.conf,并写入需要加入白名单的IP,添加完成后查看如下:#

cat /home/whitelist.conf#白名单IPallow 10.1.1.10;allow 10.1.1.11;

白名单设置完成,黑名单设置方法一样。#

2. 第二种方法:ngx_http_geo_module#

#

默认情况下,一般nginx是有加该模块的,ngx_http_geo_module:官方文档,参数需设置在位置在http模块中。#

此模块可设置IP限制,也可设置国家地区限制。位置在server模块外即可。#

语法示例:#

配置文件直接添加#

geo $ip_list {    
    default 0;    
    #设置默认值为0    
    192.168.1.0/24 1;    
    10.1.0.0/16    1;
}
server {    
    listen       8081;    
    server_name  192.168.152.100;        
    location / {        
        root   /var/www/test;		
        index  index.html index.htm index.php;		
        if ( $ip_list = 0 ) {		
            #判断默认值,如果值为0,可访问,这时上面添加的IP为黑名单。		
            #白名单,将设置$ip_list = 1,这时上面添加的IP为白名单。		
        proxy_pass http://192.168.152.100:8081;
     }
}

同样可通过读取文件IP配置#

geo $ip_list {    
    default 0;    #设置默认值为0    
    include ip_white.conf;
}
server {    
    listen       8081;    
    server_name  192.168.152.100;        
    location / {        
        root   /var/www/test;		
        index  index.html index.htm index.php;		
        if ( $ip_list = 0 ) {			
            return 403;			
            #限制的IP返回值为403,也可以设置为503,504其他值。			
            #建议设置503,504这样返回的页面不会暴露nginx相关信息,限制的IP看到的信息只显示服务器错误,无法判断真正原因。    
        }
     }
}

在/etc/nginx目录下创建ip_list.conf,添加IP完成后,查看如下:#

cat /etc/nginx/ip_list.conf192.168.152.1 1;192.168.150.0/24 1;

设置完成,ip_list.conf的IP为白名单,不在名单中的,直接返回403页面。黑名单设置方法相同。#

3. ngx_http_geo_module 负载均衡(扩展)#

ngx_http_geo_module,模块还可以做负载均衡使用,如web集群在不同地区都有服务器,某个地区IP段,负载均衡至访问某个地区的服务器。方式类似,IP后面加上自定义值,不仅仅数字,如US,CN等字母。#

示例:#

如果三台服务器:122.11.11.11,133.11.12.22,144.11.11.33#

geo $country {    
    default default;    
    111.11.11.0/24   uk;    #IP段定义值uk    
    111.11.12.0/24   us;    #IP段定义值us    
}
upstream  uk.server {    
    server 122.11.11.11:9090;    #定义值uk的IP直接访问此服务器
} 
upstream  us.server {    
    server 133.11.12.22:9090;    #定义值us的IP直接访问此服务器
}
upstream  default.server {    
    server 144.11.11.33:9090;    #默认的定义值default的IP直接访问此服务器
} 
server {    
    listen    9090;    
    server_name 144.11.11.33;    
    location / {      
        root  /var/www/html/;      
        index index.html index.htm;     
    } 
}

第三种方法国家地区IP访问:#

  1. 安装geoip库
    #安装完成后,geip数据在/usr/share/GeoIP/目录下
    
    yum -y install geoip-devel

  2. 重新编译nginx,添加http_geoip_module模块检查原nginx配置参数
    /usr/local/nginx/sbin/nginx -V
    nginx version: nginx/1.18.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
    built with OpenSSL 1.0.2k-fips 26 Jan 2017 
    TLS SNI support enabled 
    configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module
  3. nginx源码目录下加上--with-http_geoip_module=dynamic参数重新配置
    cd /usr/local/src/nginx-1.18.0
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_geoip_module=dynamic
  4. make,注意不要make install,加上make install会覆盖现有nginx目录
    make

  5. 拷贝新编译的nginx和ngx_http_geoip_module.so到nginx安装目录下
    #备份,防止出错
    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
    
    cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
    
    mkdir /usr/local/nginx/modules
    
    cp /usr/local/src/nginx-1.18.0/objs/ngx_http_geoip_module.so /usr/local/nginx/modules/

  6. 配置规则nginx.conf配置文件添加lngx_http_geoip_module.so模块
    load_module modules/ngx_http_geoip_module.so;
  7. nginx.conf添加规则
        # 访问地理位置限制规则
        geoip_country /usr/share/GeoIP/GeoIP.dat;
     
        # geoip_city    /usr/share/GeoIP/GeoLiteCity.dat;
        # 下面一行根据实际情况编写
        map $geoip_country_code $allowed_country {
            default no;
            CN yes;
        }

  8. 站点配置文件server块中添加访问限制
    server {
        listen 80;  
        server_name xx.xx.xx; 
     
        #添加判断
        if ($allowed_country = no) {
            return 403;
        }
        
    }

     

作者:Carver-大脸猫

出处:https://www.cnblogs.com/carver/articles/17115757.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请注明原处

posted @   Carver-大脸猫  阅读(2835)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu