如何实现私网地址重写策略?

Nginx

1 前言

一个问题,一篇文章,一出故事。
笔者的nextcloud需要透过反向代理实现企业外部2FA认证,内部使用普通的用户名和密码认证,于是整理此文。
实现思路是由nextcloud的“SSO & SAML authentication”插件产生两个登录入口,详细如下图,

根据以上两个入口的不同链接,通过Nginx反向代理的代码判断用户是私有地址或公有地址然后强制分流。

2 最佳实践

2.1 增加根据私网判断的重写代码

vim /etc/nginx/nextcloud.cmdschool.org

加入如下代码,

geo $lan_subnet {
    default 0;
    10.0.0.0/8 1;
    172.16.0.0/12 1;
    192.168.0.0/16 1;
}

server {
    #...
    if ($lan_subnet = 0){
       rewrite ^/index.php/login(.*)$ /index.php/apps/user_saml/saml/login?idp=1 break;
    }

    if ($lan_subnet = 1){
       rewrite ^/index.php/login(.*)$ /index.php/login?redirect_url=&direct=1 break;
    }
    #...
}

需要注意的是,
– 命令“geo”根据浏览器客户端的源地址赋值,默认为“0”,如果用户是私有地址赋值为“1”
– 第一个“if”判断变量“lan_subnet”是否等“0”,如果等于“0”则执行大括号中的重写指令
– 第一个“rewrite”指令模式匹配URL“^/index.php/login(.*)$”,成功则重写到SSO认证接口
– 第二个“if”判断变量“lan_subnet”是否等“1”,如果等于“1”则执行大括号中的重写指令
– 第二个“rewrite”指令模式匹配URL“^/index.php/login(.*)$”,成功则重写到普通登录页面

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

没有评论

发表回复

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …

Nginx
如何安装部署RHEL 9 Nignx?

1 前言 一个问题,一篇文章,一出故事。 笔者需要基于RHEL 9部署Nginx环境,于是整理此文。 …