• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

Nginx基于x-forward-for的访问控制实现

一、方式一 

通过环境变量,和正则表达式匹配,然后对应的返回结果。

        set $j_remote_addr $http_x_forwarded_for;
            if ($j_remote_addr = "") {
                set $j_remote_addr $remote_addr;
        }

       set $allow false;
       if ($j_remote_addr ~* "218\.30\.180\.179$") {
           set $allow true;
       }
       if ($j_remote_addr ~* "218\.30\.180\.178$") {
           set $allow true;
       }

       if ($allow == false){
           return 403
       }

 

二、方式二

通过map映射,将x-forward-for中的第一个IP(也是就是用户IP)提取出,给clientRealIp,在用

geoIP对应的赋值。

1、了解map指令作用

map是一个变量映射,可以生成新的变量。

       map $http_x_forwarded_for  $clientRealIp {

             ""    $remote_addr;

             ~^(?P<firstAddr>[0-9\.]+),?.*$     $firstAddr;

       }

意思就是说:$http_x_forwarded_for为" ",会赋值给$remote_addr,则clientRealIp变量的值为$remote_addr,

~^(?P<firstAddr>[0-9\.]+),?.*$,是一个正则匹配,这个地方会提取第一个IP,赋值给firstAddr.这个时候 clientRealIp=firstAddr

 

2、了解geo指令

geo可以用来创建变量,其值依赖于客户端IP地址.

       geo $clientRealIp $limited {

           default 1 ;

           122.122.111.23  0;

           192.168.0.0/16  0;

       }

 

3、最后map

       map $limited $limit {

       1 $binary_remote_addr;

       0 "";

       }

变量limit为""(空)对应到了的IP,为:122.122.111.23 、192.168.0.0/16白名单

变量limit为binary_remote_addr,也就是1,对应到了clientRealIp中非白名单的IP

 

       map $http_x_forwarded_for  $clientRealIp {

             ""    $remote_addr;

             ~^(?P<firstAddr>[0-9\.]+),?.*$     $firstAddr;

       }

 

       geo $clientRealIp $limited {

           default 1 ;

           122.122.111.23  0;

           192.168.0.0/16  0;

       }

 

       map $limited $limit {

       1 $binary_remote_addr;

       0 "";

       }

 

       # nginx 限流

       limit_conn_zone $limit zone=perip:20m;

       limit_req_zone $limit zone=perreq:10m rate=50r/s;

 

    limit_conn perip 20;

    limit_rate 200k;

    limit_req zone=perreq burst=5 nodelay;

 

2、 ip_whitelist.conf

110.11.12.1 0;

192.168.0.0/24  0;

 

Nginx基于x-forward-for的访问控制实现

Pingbacks已打开。

引用地址

暂无评论

发表评论