远程访问数据库:如何不把它暴露给整个互联网
从工作电脑连接 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 connect | MySQL 用户绑定到了 localhost |
no pg_hba.conf entry for host | 没有针对您地址的规则 |
| 端口开放但没有任何响应 | 数据库只监听 127.0.0.1 |
| 一开始能用,后来不行了 | 您的服务商分配的是动态地址——这又多了一个使用隧道的理由 |
这些机器没有 IPv6,也没有第二个地址。所有规则都针对“概览”中那唯一的公网 IPv4 地址来写——不会出现两套协议栈混淆的问题。