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

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
如何使用Nginx发布维护公告?

1 前言 一个问题,一篇文章,一出故事。 最近由于需要发布维护公告,想着这种东西以后用得着,于是总结 …

Nginx
如何实现Nginx第一次访问跳转?

1 前言 一个问题,一篇文章,一出故事。 笔者在NextCloud生产环境中需要实现首次登录显示公告 …

Nginx
如何实现Nginx首次访问跳转?

1 前言 一个问题,一篇文章,一出故事。 笔者在NextCloud生产环境中需要实现首次登录显示公告 …