【nginx】nginx通过条件判断,实现访问控制

2024-08-10  本文已影响0人  Bogon

三类内网地址:

A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255

简单的正则匹配三类内网地址:

^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.

nginx 获取客户端原始ip:

$remote_addr代表不对原始IP做任何处理
$http_x_forwarded_for表示原始IP经过一层代理

$ cat /usr/local/openresty/nginx/conf/conf.d/test.conf

# 初始化标识
set $flag 0;

# 判断移动端UA
if ($http_user_agent ~* "clientId\:10086|clientId\:10010|clientId\:10088") {
    set $flag "${flag}1";
    }

# 判断透传IP是否来自指定出口ip或者内网ip
if ($remote_addr ~* "xx.xx.xx.xx|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.") {
    set $flag "${flag}2";
}

# /test 接口
location ^~ /test {

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header Connection "";
    proxy_set_header Accept-Encoding "";

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    if ( $flag = "01" )
    {
        proxy_pass http://xx.xx.xx.xx:8080;
        break;
    }

    if ( $flag = "02" )
    {
        proxy_pass http://xx.xx.xx.xx:8080;
        break;
    }

    if ( $flag = "012" )
    {
        proxy_pass http://xx.xx.xx.xx:8080;
        break;
    }

    return 403;
}
$ sudo /usr/local/openresty/nginx/sbin/nginx  -t
$ sudo /usr/local/openresty/nginx/sbin/nginx  -s reload
上一篇 下一篇

猜你喜欢

热点阅读