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

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 前言 一个问题,一篇文章,一出故事。 笔者生产环境遇到需要根据URI路径选择走哪个代理服务器的案 …

Nginx
如何实现Nginx返回字符串或变量值?

1 前言 一个问题,一篇文章,一出故事。 笔者测试环境中经常需要返回Nginx变量的具体值,于是整理 …