访问控制

http_access_module

基于IP的访问控制

# 允许哪些 ip(address)、网段(CIDR)、socket方式(unix:)、所有(all) 可以访问
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

示例:

#限制我的ip不可访问,其他所有的都可以访问
#被限制的ip会显示 403 Forbidden
location ! ^/admin.html {
    root /usr/share/nginx/html;
    deny 140.207.236.xxx;
    allow all;
}

#只允许以下网段访问,其他一概不允许访问
location ! ^/admin.html {
    root /usr/share/nginx/html;
    allow 182.168.173.0/24;
    deny all;
}

局限性

如果客户端经过代理访问nginx服务端,如下图:

1556021378338

因为access_module是根据 $remote_addr来进行限制的,那么对于Nginx来说,此时$remote_addr就是IP2,那么nginx对IP1的限制就失效了。这就是局限性。

针对这种问题共有以下几种方式:

  • http_x_forwarded_for

  • 结合geo模块

  • 通过HTTP自定义变量传递

http_x_forwarded_for

1556021634871

x_forwoared_for 会带着真正的客户端的ip(即图中的IP1)给nginx。

缺点:

  • http_x_forwarded_for 是基于协议的,不一定所有的厂商都支持,而且又被修改的可能性

http_auth_basic_module

基于用户的信任登录进行访问控制

示例:

配置成功后,访问 ip:port/admin.html,会弹出如下认证提示:

1556023343240

局限性

  • 用户信息需要存储在文件中,依赖文件

  • 操作机械、管理低效

对应的解决方案:

  • nginx结合LUA实现高效验证

  • nginx配合LDAP打通,利用nginx-auth-ldap模块

最后更新于

这有帮助吗?