QGIS 会读取数据提供者能到达的任何路径,所以 VPN 通了只是配置的一半。隧道给桌面一条路由和一套名称解析策略;项目仍然需要服务端点、提供者协议,以及服务愿意接受的凭据。这是三个不同的条目,把 VPN 的公开监听地址填进数据库字段不属于其中任何一个。本文跟随一个 PostGIS 图层,从 QGIS 表单一直到返回的行,并逐一点明每一步验证的边界。

从图层入手,而不是从 VPN 入手

每种图层类型到达的是不同类型的端点。PostGIS 图层用主机、端口、数据库和角色打开一条 PostgreSQL 连接。WMS 或 WFS 图层获取服务 URL,然后解析能力文档。网络共享上的 shapefile 只需要一个操作系统能打开的文件路径。由于这是三种不同机制,空项目在你弄清楚在排查哪一种之前,什么也说明不了。

向 GIS 运维人员索取端点、端口、所需身份,以及适用于你账号的访问策略。当部署依赖私有 DNS 或证书中的名称校验时,保持服务主机名与签发时完全一致。复用从别人保存的连接里复制来的主机地址,是抵达一台有响应但保存着旧数据库的机器的最快办法。

路由、允许的资源以及名称解析归 VPN 运维方负责。数据源表单无法安装隧道配置从未下发的路由,也无法放宽网关策略。当主机名能解析、端口有响应时,问题的网络侧就已经结束。

填入运维方签发的私有端点

QGIS 的 PostgreSQL 表单对应 libpq 期待的各字段,因此按命令行连接相同的顺序填写。服务与主机填数据库机器,端口填服务器实际打开的监听口,数据库填具体目录而不是服务器默认值。把密码存进身份验证配置而不是项目文件,这样共享出去的项目不会带着凭据。

在输入任何内容之前先把两个名称分开。网关名称属于 VPN 客户端,数据库名称属于 QGIS,二者很少是同一台主机。

VPN gateway:   vpn.gis.lab.example       (profile only, not a data source)
Database host: db.gis.lab.example:5432   (PostGIS service)
Database name: gis_prod
TLS mode:      verify-full

如果数据库位于网关后面的另一台机器上,表单里的名称就必须是那台机器。正是隧道内的私有 DNS 让名称生效;只在连接期间能解析的项目是行为正确,而不是缓存有问题。

把数据库的 TLS 模式与隧道分开

VPN 产品名里的 SSL 描述的是隧道,不是数据库会话。QGIS 把 PostgreSQL 的 SSL 模式传给 libpq,而该模式决定客户端是否校验服务器证书、是否核对证书里的主机名。 verify-full两者都做,所以当证书承载服务名称时,这正是值得保留的模式。

因为隧道已经加密就把模式降到 disable,等于去掉了“所连的服务器就是所请求的服务器”这一校验。校验失败时,常见原因是名称不一致或缺少根证书,两者都能在不削弱连接的前提下修好。把 sslrootcert 指向运维方公布的 CA,并保持表单中的主机名与证书中的名称一致。

有私有路由的隧道和有有效证书的数据库,仍然可能败在角色上。应用凭据与 VPN 凭据是分开的,在网关上通过认证的账号在 PostgreSQL 里没有任何隐含权限。

按顺序测试每一层边界,并读第一个失败

从客户端向外按固定顺序推进:名称解析、TCP 可达性、TLS、身份验证,最后才是查询本身。第一个失败的环节才是唯一值得上报的,往前跳只会得到来自尚未到达的边界的报错。四条命令覆盖前四个环节。

getent hosts db.gis.lab.example
nc -vz db.gis.lab.example 5432
psql "host=db.gis.lab.example port=5432 dbname=gis_prod sslmode=verify-full" -c 'select 1'
curl -sS 'https://wms.gis.lab.example/ows?service=WMS&request=GetCapabilities' | head -c 200

getent 返回空结果属于名称解析问题,不是数据库问题。被拒绝或超时的 nc 说明缺少路由或防火墙规则,属于网关侧的修复。来自 psql 的 TLS 错误说明证书或名称不对,而 password authentication failed 说明已经到达 PostgreSQL,问题在凭据。对 WMS 图层,curl 调用返回的是 QGIS 会解析的能力 XML,所以输出里出现 HTML 登录页就能立刻解释空图层。

相比超时,PostgreSQL 报错是好消息。它证明目的地有响应,这就把工单从网络团队转到数据库或 GIS 管理员手里。报告里保留这个区别能省掉一个来回。

当项目打开后图层是空的

在 QGIS 里,重新输入任何内容之前先检查图层保存的数据源。图层属性会显示项目保存的连接串,而带有旧主机的重复连接项,是上一个办公网络常见的遗留。修好连接后重新加载项目并不总会重新读取提供者,所以删除该图层,再从修正后的连接重新添加。

然后确认身份验证配置是绑定到该图层的那一个,而不只是出现在列表里。用另一个身份验证配置保存的图层会在浏览器面板里静默失败,而独立的 psql 测试却能通过。

图层加载成功后,保存项目时只对文件使用相对路径,并让服务连接按端点命名。接手的下一个人不用开工单就能说出坏掉的图层原本期待哪台主机。

相关文章