### **1. IP限制**
> http_access_module
允许访问
```
Syntax: allow address | CIDR | unix: | all;
Default:—
Context: http, server, location, limit_except
```
禁止访问
```
Syntax: deny address | CIDR | unix: | all;
Default:—
Context: http, server, location, limit_except
```
使用案例:
~~~
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
#从上到下的顺序,类似iptables。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下来允许了3个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问.被deny的将返回403状态码。
}
~~~
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。
![](https://images2018.cnblogs.com/blog/676372/201803/676372-20180311152302986-1165763526.png)
但是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
*****
### **2. 用户登录限制**
> http_auth_basic_module
```
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
```
配置:
1.安装插件:yum -y install httpd-tools
2.查看htpasswd插件:rpm -qf /usr/bin/htpasswd
3.生成一个身份文件(用于访问站点时登录)
①cd /etc/nginx
②htpasswd -c ./auth_conf/hao_admin (auth_conf :保存用户身份信息的文件;hao_admin:用户名)
③修改配置文件(示例:ip/admin.html)
```
location ~ ^/admin.html {
root /data/www;
auth_basic "auth:"; //开启身份校验
auth_basic_user_file /etc/nginx/auth_conf; //身份校验文件路径
index index.html;
}
```
访问效果(浏览器)
![](https://img.kancloud.cn/c7/df/c7dfb415a587160a59c75a4925e78acb_368x199.png)
局限性
需要提前设置密码文件 、管理麻烦效率低下
解决方案:
① 通过lua文件实现
②nginx和LDAP打通,利用nginx_auth_ladap实现