【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