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访问:#
- 安装geoip库
#安装完成后,geip数据在/usr/share/GeoIP/目录下 yum -y install geoip-devel
- 重新编译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
- 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
- make,注意不要make install,加上make install会覆盖现有nginx目录
make
- 拷贝新编译的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/
- 配置规则nginx.conf配置文件添加lngx_http_geoip_module.so模块
load_module modules/ngx_http_geoip_module.so;
- 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; }
- 站点配置文件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 国际」许可协议进行许可。
转载请注明原处
本文来自博客园,作者:Carver-大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/17115757.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现