Nginx
1 前言
一个问题,一篇文章,一出故事。
笔者有一个认证接口需要拒绝intetnet的用户访问同时允许internal用户访问,于是整理此文。
2 最佳实践
2.1 增加判断代码
vim /etc/nginx/conf.d/websso.cmdschool.org_443_keycloak.conf
增加如下配置,
geo $lan_subnet { default 0; 10.0.0.0/8 1; 172.16.0.0/12 1; 192.168.0.0/16 1; } server { #... set $test ''; if ($lan_subnet = 0){ set $test 'internet'; } if ( $request_uri ~* auth/realms/master ) { set $test "${test}-access"; } if ( $request_uri ~* auth/admin/master ) { set $test "${test}-access"; } if ( $test = internet-access ) { return 403; } #... }
需要注意的是,
– 命令“geo”根据浏览器客户端的源地址赋值,默认为“0”,如果用户是私有地址赋值为“1”
– 第一个“if”判断变量“lan_subnet”是否等于“0”,如果等于零即使给变量“test”赋值“internet”
– 第二个“if”判断变量“request_uri”是否模式匹配“auth/realms/master”,如果是则修改字符串为“internet-access”
– 第三个“if”判断变量“request_uri”是否模式匹配“auth/admin/master”,如果是则修改字符串为“internet-access”
– 第四个“if”判断变量“$test”是否等于“internet-access”,如果是则修拒绝改来源IP的访问
2.2 重载使服务生效
systemctl reload nginx
参阅文档
======================
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
http://nginx.org/en/docs/http/ngx_http_geo_module.html
没有评论