我正在运行一个在自托管服务器上安装的 Web 应用程序,该服务器与我的主要网络上的所有公司电脑和其他几台服务器一起运行。
我们决定添加 HTTP 基本身份验证作为额外的安全层,但我们希望连接到本地网络的人们不受此限制。
最初尝试使用allow
和deny
指令后,我被 Stack Overflow 用户说服改用geo
。我取得了进展,但遇到了一个令人沮丧的问题。我似乎无法为 IP 地址范围 192.168.1.1-192.168.1.255 做出例外。
为了展示我所做的事情,我将添加下面带有地址范围的代码片段,然后进一步解释。
geo $authentication {
default "Authentication required";
127.0.0.1 "off";
192.168.1.0/24 "off";
10.8.0.0/24 "off";
78.432.xx.xx/0 "off";
0.0.0.0/0 "off"
}
server {
location / {
auth_basic $authentication;
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
我已注释掉所有 IP 地址范围(除 127.0.0.1 之外),以下是每种情况下发生的情况:
- 如果我保留所有评论,则在访问网页时,系统会按预期首先提示我输入凭据
- 如果我取消注释,
0.0.0.0/0
我就可以按预期连接到无需任何凭据的页面。 - 如果我取消注释
78.432.xx.xx/0
(这是我的真实公共地址,已删除),我就可以按预期无需任何凭据访问该页面。 - 如果我
10.8.0.0/24
在连接到 VPN 并因此分配地址时取消注释(这些是用户使用我们的 VPN 时分配的 IP 地址)10.8.0.5
,则在访问网页时会提示我输入凭据,这不是我所期望的。 - 如果我取消注释
192.168.1.0/24
,则在访问网页时会提示我输入凭据,这不是我所期望的。请注意,我的本地 IP 地址是192.168.1.22
。
当我访问该页面时,我可以从 nginx 日志中看到:
78.432.xx.xx - - [23/Jan/2018:13:58:57 +0000] "GET / HTTP/1.1" 401 195 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"
这表明 nginx 正确检测到了我的外部 IP 地址并据此要求输入凭据,但输入内部 IP 地址没有影响。事实证实了这一点,如果我192.168.1.102
在浏览器中输入而不是域名,我就可以无需任何凭据即可获得访问权限。
基本身份验证有效,IP 控制在某种程度上也有效,但显然我做错了什么,但我不知道是什么。
问题是,如果检测到本地 IP 地址,我该如何告诉 nginx 跳过身份验证?