Postgres 连接现在可以通过 Sandbox 防火墙。
Source: Vercel Blog
2026年5月1日
Vercel Sandbox 现在可以连接到托管的 Postgres 数据库,包括 Neon、Supabase、AWS RDS、Nile 和 Prisma Postgres。要启用连接,只需将数据库主机添加到 Sandbox 的允许域名列表中。
背景
当在 Vercel Sandbox 中使用基于 SNI 的过滤(SNI‑based filtering)时,sandbox 防火墙会通过在连接的 TLS 握手期间检查域名来限制出站网络访问。这对 HTTPS 流量能够无缝工作,因为域名在连接开始时就可见。
然而,Postgres 的 TLS 协商方式不同。Postgres 客户端首先打开一个普通的 TCP 连接,然后再升级为 TLS。由于防火墙在首次需要域名时尚未获取到它,使用标准的域名限制 Sandbox 会导致 Postgres 连接失败。
变更内容
Sandbox 防火墙现在会适配 Postgres 的 TLS 协商流程。它会检测协议的启动序列,等待 TLS 升级完成后,再根据你的域名策略对连接进行过滤,然后将流量转发到数据库。无需对代码或数据库配置做任何更改。
连接托管数据库
下面是完整示例:创建一个 Sandbox,安装 Postgres 客户端,将网络锁定为仅允许数据库主机,然后执行查询。
import { Sandbox } from '@vercel/sandbox';
const { PGHOST, PGUSER, PGPASSWORD, PGDATABASE } = process.env;
const connectionString = `postgres://${PGUSER}:${PGPASSWORD}@${PGHOST}:5432/${PGDATABASE}?sslmode=require`;
// Start with unrestricted network access to install dependencies.
const sandbox = await Sandbox.create();
await sandbox.runCommand({
cmd: 'sudo',
args: ['dnf', 'install', '-y', 'postgresql15'],
});
// Lock the sandbox down to only the database host before running untrusted code.
await sandbox.updateNetworkPolicy({
allowDomains: [PGHOST!],
});
const result = await sandbox.runCommand({
cmd: 'psql',
args: [connectionString, '-c', 'SELECT now();'],
});
console.log(await result.stdout());
需要了解的重要信息
- 必须使用 TLS: 基于域名的规则依赖于在 TLS 握手期间能够看到主机名,因此客户端必须使用
sslmode=require或更高的模式进行连接。如果你的数据库不支持 TLS,可以改为通过IP 范围来允许访问。大多数托管的 Postgres 提供商默认要求 TLS。 - 不支持 GSSAPI 加密: 使用
gssencmode=prefer的客户端会自动回退到 TLS;而gssencmode=require将无法连接。 - 不会静默降级: 如果客户端使用
sslmode=prefer且数据库不支持 TLS,连接将直接失败,而不会悄悄回落到明文。
了解更多关于Sandbox 防火墙的内容。