基于IP的访问控制 http_access_module(允许哪些IP可以访问,哪些不允许访问)

  基于用户的信任登录 http_auth_basic_module(提供登录认证界面,通过登录认证的方式控制访问)

  1、http_access_module方式

  1)http_access_module 配置语法

  可以配置:允许(allow)/拒绝(deny) IP地址,网段,Socket,所有。

  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

  2)演示限制IP

[root@localhost conf.d]# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/access_mod.conf

  修改access_mod.conf,限制192.168.7.103不能访问admin.html文件。allow all;是配置其他IP可以访问。

location / {
  root   /opt/app/code;
  index  index.html index.htm;
}

location ~ ^/admin.html {
  root  /opt/app/code;
  deny  192.168.7.103;
  allow  all;
  index  index.html index.htm; 
}

  

nginx 限制访问速度 nginx访问控制规则_IP

  新建/opt/app/code/admin.html

<html>
<head>
    <meta charset="utf-8">
    <title>imooc1</title>
</head>
<body style="background-color:red;">
</body>
</html>

  检查配置文件语法,并重新加载配置,测试 http://192.168.7.151/admin.html 成功:

  

nginx 限制访问速度 nginx访问控制规则_IP_02

  配置某一段的IP可以访问,如下,需要了解IP段的含义。

location / {
  root   /opt/app/code;
  index  index.html index.htm;
}

location ~ ^/admin.html {
  root    /opt/app/code;
  allow   192.168.7.0/24;
  deny    all;
  index   index.html index.htm;
}

  3)http_access_module方式的局限性及其解决方案

  如果不是客户端直接访问服务端,而是通过代理再访问服务端,比如通过中间件代理Nginx、7lay LSB、CDN等访问服务端会出现问题。因为Nginx的http_access_module是基于remote_addr变量识别客户端IP的。经过中间一层,客户端的IP地址会改变,识别的Ip实际是代理层的IP。

  解决方式:

  方法一:采用别的HTTP头信息控制访问,如:HTTP_X_FORWARD_FOR。HTTP_X_FORWARD_FOR是HTTP头信息,HTTP协议规定携带的,客户端IP1访问到代理上,代理上的HTTP_X_FORWARD_FOR是IP1,代理的IP地址IP2访问到Nginx服务端,服务端上的HTTP_X_FORWARD_FOR是IP1,IP2(两个IP逗号分隔)。使用HTTP_X_FORWARD_FOR会包含客户端浏览器的IP。

  使用HTTP_X_FORWARD_FOR也有问题:HTTP_X_FORWARD_FOR是协议要求的,不一定所有的CDN厂商或者代理厂商按照要求来做。并且由于它只是一个头信息,可能会被客户端修改。

  方法二:结合geo模块做。

  方法三:通过HTTP自定义变量传递。

  2、http_auth_basic_module方式

  1)http_auth_basic_module是Nginx的认证模块,语法如下:

  Syntax:auth_basic_string | off;
  Default:auth_basic off;
  Context:server,location,limit_except

  Syntax:auth_basic_user_file file;
  Default:-
  Context:http,server,location,limit_except

  file是存储用户名和密码信息的文件。生成密码文件可参考官网:http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html

  2)演示

  进入到/etc/nginx,在该目录生成密码文件,文件名:auth_conf,并添加用户名sl,密码123456

htpasswd -c ./auth_conf sl

  

nginx 限制访问速度 nginx访问控制规则_HTTP_03

  

nginx 限制访问速度 nginx访问控制规则_HTTP_04

  修改配置文件/etc/nginx/conf.d/auth_mod.conf

location / {
  root   /opt/app/code;
  index  index.html index.htm;
}

location ~ ^/admin.html {
  root    /opt/app/code;
  auth_basic "Auth access test! input your password!";
  auth_basic_user_file /etc/nginx/auth_conf;
  index   index.html index.htm;
}

  

nginx 限制访问速度 nginx访问控制规则_IP_05

  检查配置文件语法,并重新加载配置,测试:http://192.168.7.151/admin.html,弹出输入密码框,测试成功!

  

nginx 限制访问速度 nginx访问控制规则_html_06

   3)该方式的局限性

  用户信息依赖文件方式;操作管理机械,效率低下。

  4)解决方案

  Nginx结合LUA实现高效验证

  Nginx和LDAP打通,利用nginx-auth-ldap模块