基于IP的访问控制,基于Nginx的http_access_module模块,是Nginx本身内置的模块,不需要安装的时候配置。也就是允许哪些IP访问,不允许哪些IP访问

server {
listen ;
server_name example.com;
access_log logs/access.log main;
location / {
deny 192.168.1.1;
allow 192.168.1.0/;
allow 10.1.1.0/;
allow :0db8::/;
deny all;
#从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.,接下来允许了3个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问.被deny的将返回403状态码。
}
location ~ ^/phpmyadmin/ {
allow 192.168.1.0/;
deny all;
#只允许局域网访问
}
location /project {
allow 220.178.25.22;
allow 172.2.2.0/;
allow 192.2.2.0/;
deny all;
proxy_pass http://172.2.2.20:8080/project/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
}
#以上配置的作用是允许IP为220.178.25.,以及172和192网段的机器可以访问这个location地址,其他IP的客户端访问均是403。其中,24是指子网掩码为255.255.255.。
}

Nginx基于access_module有局限性

原理:基于客户端的IP,但是对于Nginx来说,它不会管你哪个是真正的客户端,如果我们的访问不是客户端与服务端直接连接,而是通过了一层代理,比如它的代理可以负载均衡、CDN的这种代理实现,也就是我们的访问不是客户端直接访问的服务端,而是通过其他的中间件访问服务端,这时候会出现一个问题,因为Nginx的access_module它是基于remote_addr这个变量来识别客户端的IP的,那么如果一个ip通过中间件访问服务端,那么Nginx认为访问的ip就是中间件的IP,那么我们在基于IP做限制的时候,那么其实是没有作用的。所以这样的话,准确性是不高的,所以就是利用nginx的access_module有局限性。
解决方法:

①:采用别的http头信息访问控制,如HTTP_X_FORWARDED_FOR。

但是http_x_forwarded_for进行访问控制会存在问题,因为是一个协议要求的,并不是所有的cdn和代理厂商它会按照要求来做,甚至x_forwarded_for存在被修改的可能,因为只是一个头信息,所以最终还是不真实。

http_x_forwardded_for也是Nginx的http头变量的一个常用的变量,它和remote_addr是有区别的。不同的是,x_forwarded_for是http协议中规定头中要携带的,所以在客户端访问中间件,再访问服务端的时候,那么服务端通过Nginx会记录真实IP和中间件的IP。
格式:http_x_forwarded_for = 客户端ip,第一台代理ip,第二台代理ip,第N台代理ip....,所以http_x_forwarded_for是由一连串以逗号分隔的ip组成的。
②:结合geo模块
③:通过HTTP自定义变量传递
因为nginx有自己的变量,我们可以在http头信息定义一个我们规定的http变量在所有上一级的设备手动把remote_addr的ip一级一级的携带过去,既能避免x_forwarded_for被修改,也能读到客户端的真实ip

记得修改完配置一定要检测Nginx配置是否正确,正确后再重新软加载配置文件

[root@~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@~]# /usr/local/nginx/sbin/nginx -s reload

最新文章

  1. linux sed 添加 删除 一行
  2. [FMX] Android APP 启动黑屏优化补丁
  3. Unity3D客户端和Java服务端使用Protobuf
  4. .NET 页面间传值的几种方法
  5. 我用工具怎么连接不上mysql数据库的? MySql access denied for user错误
  6. mac上使用终端生成RSA公钥和密钥
  7. mac 免密码登陆服务器
  8. WPF RichTextBox的使用总结
  9. Poj(1273),最大流,EK
  10. [翻译]Json.NET API-Linq to Json Basic Operator(基本操作)【转】
  11. Android取得电池的电量
  12. Spring mvc interceptor配置拦截器,没有登录跳到登录页
  13. 在Ubuntu 14.04 64bit上安装StarUML 2.5版本
  14. JS 转换数据类型
  15. select标签操作
  16. Retrieving archetypes
  17. 《JavaScript高级程序设计》笔记:基本概念(三)
  18. nginx实现按日期进行日志分割
  19. HihoCoder - 1498 Diligent Robots
  20. 5B - 一只小蜜蜂...

热门文章

  1. WCF入门(十)——服务对象模型
  2. python3 + selenium + (chrome and firefox)使用
  3. angular4 form 表单中 input输入框的disabled属性
  4. 树形结构数据存储方案的选择和java list转tree
  5. SaltStack配置管理-LAMP状态设计
  6. 如何实现手游app瘦身?
  7. redis之持久化操作
  8. mysql 数据库查询最后两条数据
  9. php about session store db or cache
  10. 1130 - Host '' is not allowerd to connect to this MySQL server,