经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Nginx » 查看文章
网站如何通过nginx设置黑/白名单IP限制及国家城市IP访问限制
来源:jb51  时间:2022/7/19 15:03:32  对本文有异议

一、黑/白名单IP限制访问配置

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

1、第一种方法:allow、deny

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

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

直接配置文件中添加:

  1. #白名单设置,allow后面为可访问IP
  2. location / {
  3. allow 123.13.123.12;
  4. allow 23.53.32.1/100;
  5. deny all;
  6. }
  7.  
  8. #黑名单设置,deny后面接限制的IP,为什么不加allow all? 因为这个默认是开启的
  9. location / {
  10. deny 123.13.123.12;
  11. }
  12.  
  13. #白名单,特定目录访问限制
  14. location /tree/list {
  15. allow 123.13.123.12;
  16. deny all;
  17. }

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

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

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

  1. cat /home/whitelist.conf
  2.  
  3. #白名单IP
  4. allow 10.1.1.10;
  5. allow 10.1.1.11;

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

2:第二种方法,ngx_http_geo_module

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

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

语法示例:

配置文件直接添加

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

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

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

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

  1. cat /etc/nginx/ip_list.conf
  2.  
  3. 192.168.152.1 1;
  4. 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

  1. geo $country {
  2. default default;
  3. 111.11.11.0/24 uk;
  4. #IP段定义值uk
  5. 111.11.12.0/24 us;
  6. #IP段定义值us
  7. }
  8. upstream uk.server {
  9. erver 122.11.11.11:9090;
  10. #定义值uk的IP直接访问此服务器
  11. }
  12.  
  13. upstream us.server {
  14. server 133.11.12.22:9090;
  15. #定义值us的IP直接访问此服务器
  16. }
  17.  
  18. upstream default.server {
  19. server 144.11.11.33:9090;
  20. #默认的定义值default的IP直接访问此服务器
  21. }
  22. server {
  23. listen 9090;
  24. server_name 144.11.11.33;
  25.  
  26. location / {
  27. root /var/www/html/;
  28. index index.html index.htm;
  29. }
  30. }

然后在

二、国家地区IP限制访问

有些第三方也提供设置,如cloudflare,设置更简单,防火墙规则里设置。这里讲讲nginx的设置方法。

1:安装ngx_http_geoip_module模块

ngx_http_geoip_module:官方文档,参数需设置在位置在http模块中。

nginx默认情况下不构建此模块,应使用 --with-http_geoip_module 配置参数启用它。

对于ubuntu系统来说,直接安装 nginx-extras组件,包括几乎所有的模块。

  1. sudo apt install nginx-extras

对于centos系统,安装模块。

  1. yum install nginx-module-geoip

2、下载 IP 数据库

此模块依赖于IP数据库,所有数据在此数据库中读取,所有还需要下载ip库(dat格式)。

MaxMind 提供了免费的 IP 地域数据库,坏消息是MaxMind 官方已经停止支持dat格式的ip库。

在其他地方可以找到dat格式的文件,或者老版本的,当然数据不可能最新,多少有误差。

第三方下载地址:https://www.miyuru.lk/geoiplegacy

下载同时包括Ipv4和Ipv6的country、city版本。

  1. #下载国家IP库,解压并移动到nginx配置文件目录,
  2. sudo wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz
  3. gunzip maxmind.dat.gz
  4. sudo mv maxmind.dat /etc/nginx/GeoCountry.dat
  5.  
  6. sudo wget https://dl.miyuru.lk/geoip/maxmind/city/maxmind.dat.gz
  7. gunzip maxmind.dat.gz
  8. sudo mv maxmind.dat /etc/nginx/GeoCity.dat

3、配置nginx

示例:

  1. geoip_country /etc/nginx/GeoCountry.dat;
  2. geoip_city /etc/nginx/GeoCity.dat;
  3.  
  4. server {
  5. listen 80;
  6. server_name 144.11.11.33;
  7.  
  8. location / {
  9. root /var/www/html/;
  10. index index.html index.htm;
  11. if ($geoip_country_code = CN) {
  12. return 403;
  13. #中国地区,拒绝访问。返回403页面
  14. }
  15. }
  16. }

这里,地区国家基础设置就完成了。

Geoip其他参数:

国家相关参数:
$geoip_country_code #两位字符的英文国家码。如:CN, US
$geoip_country_code3 #三位字符的英文国家码。如:CHN, USA
$geoip_country_name #国家英文全称。如:China, United States
城市相关参数:
$geoip_city_country_code #也是两位字符的英文国家码。
$geoip_city_country_code3 #上同
$geoip_city_country_name #上同.
$geoip_region #这个经测试是两位数的数字,如杭州是02, 上海是 23。但是没有搜到相关资料,希望知道的朋友留言告之。
$geoip_city #城市的英文名称。如:Hangzhou
$geoip_postal_code #城市的邮政编码。经测试,国内这字段为空
$geoip_city_continent_code #不知什么用途,国内好像都是AS
$geoip_latitude #纬度
$geoip_longitude #经度

总结

到此这篇关于网站如何通过nginx设置黑/白名单IP限制及国家城市IP访问限制的文章就介绍到这了,更多相关nginx黑/白名单IP限制设置内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号