Skip to content
VDS · 数据库

远程访问数据库:如何不把它暴露给整个互联网

从工作电脑连接 VDS 上数据库的两种方式:SSH 隧道和带限制的开放端口。该选哪种以及如何检查。

更新于 2026年8月23日

监听在 0.0.0.0 上、密码为 root 的数据库只能撑到第一次扫描——而整个地址段都在被持续扫描。与此同时,从笔记本电脑用客户端连接数据库既方便,往往也必不可少。有两种方式,其中只有一种没有缺点。

方式一:SSH 隧道(推荐)

数据库仍然只绑定在 127.0.0.1 上,对外只暴露 SSH。在您自己的电脑上:

ssh -L 5433:127.0.0.1:5432 root@YOUR_ADDRESS -N
ssh -L 3307:127.0.0.1:3306 root@YOUR_ADDRESS -N

现在在 DBeaver、TablePlus 或 psql 中连接 127.0.0.1:5433。从数据库的角度看,这就像一次本地连接。

大多数客户端都能自行建立隧道:连接设置里有一个“SSH”选项卡。请填写控制面板“概览” /hosting/vds/m/<id> 中的机器地址以及您的密钥。

这种方式的优点:无需改动数据库或防火墙的任何配置。

方式二:带限制的开放端口

这是最后手段——用于已知静态地址的外部服务需要连接时。以下每一步都是必须的:

ufw allow from 203.0.113.10 to any port 5432 proto tcp

对于 PostgreSQL:listen_addresses = '*',并在 pg_hba.conf 中加入一行 hostssl all all 203.0.113.10/32 scram-sha-256。对于 MySQL:bind-address = 0.0.0.0,并创建一个绑定到特定地址的用户:

CREATE USER 'app'@'203.0.113.10' IDENTIFIED BY 'long-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.10';

没有 TLS 时,这样的连接会以明文传输数据。不指定来源的 ufw allow 5432 正是“向整个互联网开放”的含义。

验证

从另一台机器上:

nmap -Pn -p 3306,5432,6379,27017 YOUR_ADDRESS

预期结果是所有端口都返回 filtered 或 closed。在本地检查监听情况以及监听位置:

ss -tulpn | grep -E '3306|5432|6379'

常见错误

现象原因
客户端无法通过隧道连接本地端口被占用——换一个
Host ... is not allowed to connectMySQL 用户绑定到了 localhost
no pg_hba.conf entry for host没有针对您地址的规则
端口开放但没有任何响应数据库只监听 127.0.0.1
一开始能用,后来不行了您的服务商分配的是动态地址——这又多了一个使用隧道的理由

这些机器没有 IPv6,也没有第二个地址。所有规则都针对“概览”中那唯一的公网 IPv4 地址来写——不会出现两套协议栈混淆的问题。