私有站点与互联网之间隔着三个独立决策:哪个套接字接受连接、哪条路径可以送达、所选 server 响应哪些 HTTP 客户端。server 块只决定第一项。把另外两项当作独立控制,否则站点看似私有,旧入口却仍然敞开。多数仅限 VPN 的 NGINX 故障,都源于只测试了第一层。

示例使用位于 tun0、地址为 10.90.0.1 的 Linux OpenVPN 网关,客户端位于 10.90.0.0/24,保留源地址,并为该入口预留 TCP 8443。请调整取值,保留各层。

从套接字开始,而不是主机名

把 HTTPS 监听绑定到隧道地址和专用端口。具体地址比通配套接字加名称检查更容易推理,因为内核不会把该端口交给另一个本地地址。

server {
    listen 10.90.0.1:8443 ssl;
    server_name admin.corp.example;

    ssl_certificate     /etc/nginx/tls/admin-fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/admin-key.pem;

    root /srv/private-site;

    allow 10.90.0.0/24;
    deny all;

    location / {
        try_files $uri $uri/ =404;
    }
}

证书必须包含客户端输入的服务主机名,私有 DNS 视图必须把该主机解析到绑定地址。server_name 只选择虚拟主机,并不认证任何人。缺少 DNS 记录会产生看起来像 TLS 故障的证书错误。更换证书前先检查名称。

添加文件前先读取生效配置。include 和通配监听可能在其他地方服务同一根目录,默认 server 也可能响应新块从未见到的请求。

关闭该内容的所有其他监听

列出 listen 指令并比较它们服务的根目录。为其他应用添加的块可能代理到同一 upstream,旧默认 server 也可能在新块就位后继续响应。那份输出才是真实清单,而不是你刚编辑的文件。比较服务同一内容的每个根目录。

sudo nginx -T | grep -n "listen\|server_name\|root\|proxy_pass"

检查两个地址族。IPv4 绑定不会影响 IPv6 套接字,新的 A 记录也不会撤回仍指向公网路径的旧 AAAA 应答。

把旧虚拟主机作为单独变更下线。真正关闭入口的通常就是删除新块的公网孪生;私有监听只是增加了预期入口。

在宿主机上限定入站路径范围

监听地址限制的是套接字,而不是入站接口。从别处路由到该地址的报文仍会作为本地输入到达,因此宿主机防火墙需要自己的声明,说明连接可以来自哪里。这就是单靠绑定很少能通过审计的原因。

在默认拒绝的入站策略下,且没有为该服务设置更宽的允许时,一条限定规则会同时指定隧道、源范围、目标和端口:

sudo ufw allow in on tun0 proto tcp from 10.90.0.0/24 to 10.90.0.1 port 8443

应用前先读取生效的防火墙顺序。较早的宽泛允许可能使限制失效,较早的终止丢弃可能让这条允许永远无法到达。不要为了迁就示例而清空无关规则或关闭防火墙。

该规则属于宿主机输入,不是通往另一台 LAN 机器的路由;网关对外的 OpenVPN 监听仍是独立服务。如果站点此前是公网的,要规划旧入口如何下线、现有会话如何处理。

位置变化时保持 HTTP 列表完整

NGINX 按顺序评估 allow 和 deny 条目,上面的 server 级列表会在最终 deny 之前放行已声明的地址池。访问模块还记录:任何定义访问条目的 location 都会使用自己的列表,而不是父列表。顺序与条目本身同样重要。

这种重置就是常见的回归。新增一个上传、API 或健康检查 location 并添加一条条目,就会悄悄替换 server 级限制,站点在最近添加的路径上变得更宽。

把每个 location、alias 和替代块都作为同一策略的一部分来审查。如果 IP 检查与 NGINX 认证结合使用,要理解 satisfy:any 设置可能让客户端通过一种机制进入,而另一种尚未通过。把访问列表纳入 location 审查清单。

HTTP 拒绝发生在 TCP 连接到达 NGINX 之后。它补充网络限制,而应用自身的授权仍对每个用户生效。

验证实际路径与失败情形

运行配置解析器,检查监听套接字,然后从预期客户端发起新的具名请求。确认证书通过验证、DNS 名称解析到绑定地址,且响应来自预期的根目录。

接着测试被排除的来源和备用入口。一条能用的允许请求并不能说明你想关闭的路径,而被排除的测试正是残留监听或宽泛防火墙允许暴露的地方。

重复启动或 VPN 恢复的情形。如果 NGINX 在隧道地址存在之前启动,即使文件完美,绑定也可能失败。要协调地址就绪,并在更改共享 Web 服务器之前保留本地恢复路径。

记录通过测试的套接字、端口、源范围和 HTTP 列表。下一次 VPN 或 DNS 变更都可能移动其中任何一项,而四个具名值比一个能用的浏览器标签更容易比较。

相关文章