在默认配置下,MySQL、MariaDB 和 PostgreSQL 都只监听本机回环地址,外部无法直接连接。若需要从本地开发机或另一台服务器访问 VPS 上的数据库,就需要开放远程连接——但每一步都要同步做好安全控制,否则数据库将直接暴露在互联网上。本文介绍正确的远程连接配置流程,并推荐更安全的 SSH 隧道方案。
本文要点
- MySQL/MariaDB:修改 bind-address 并授权远程用户
- PostgreSQL:修改 listen_addresses 与 pg_hba.conf
- 防火墙:只放行可信 IP,不要对全网开放数据库端口
- SSH 隧道:更安全、无需修改 bind-address 的替代方案
MySQL / MariaDB 开启远程访问
第一步:修改 bind-address
默认 bind-address = 127.0.0.1 只允许本地连接。修改为 0.0.0.0 让服务监听所有接口:
# 编辑配置文件
nano /etc/mysql/mariadb.conf.d/50-server.cnf
# 找到并修改:
# bind-address = 127.0.0.1
# 改为:
bind-address = 0.0.0.0
# 重启数据库
systemctl restart mariadb第二步:创建允许远程连接的用户
mysql -u root -p
-- 创建允许从指定 IP 连接的用户(推荐:只允许特定 IP)
CREATE USER 'myapp_user'@'1.2.3.4' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'1.2.3.4';
FLUSH PRIVILEGES;
-- 若确实需要允许任意 IP(不推荐):
-- CREATE USER 'myapp_user'@'%' IDENTIFIED BY '强密码';
-- GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'%';不要用 % 通配符除非迫不得已
'user'@'%' 表示允许任意 IP 连接,配合数据库端口开放到公网,等于把数据库直接暴露在互联网。始终优先指定精确的来源 IP。PostgreSQL 开启远程访问
修改 listen_addresses
# 编辑 postgresql.conf
nano /etc/postgresql/17/main/postgresql.conf
# 找到并修改:
# listen_addresses = 'localhost'
# 改为:
listen_addresses = '*'
# 重启服务
systemctl restart postgresql修改 pg_hba.conf 授权远程 IP
nano /etc/postgresql/17/main/pg_hba.conf
# 在文件末尾添加(只允许特定 IP):
# TYPE DATABASE USER ADDRESS METHOD
host myapp myapp_user 1.2.3.4/32 scram-sha-256
# 重载配置
systemctl reload postgresql防火墙配置
开放数据库端口时,务必在防火墙层面限制来源 IP:
# MySQL/MariaDB:只允许可信 IP 访问 3306
ufw allow from 1.2.3.4 to any port 3306
# PostgreSQL:只允许可信 IP 访问 5432
ufw allow from 1.2.3.4 to any port 5432
# 确认规则已生效
ufw status numbered| 数据库 | 默认端口 | 配置文件 |
|---|---|---|
| MySQL / MariaDB | 3306 | 50-server.cnf(bind-address) |
| PostgreSQL | 5432 | postgresql.conf(listen_addresses) |
| Redis | 6379 | redis.conf(bind) |
更安全的方案:SSH 隧道
SSH 隧道将本地端口通过加密 SSH 连接转发到服务器内的数据库端口,数据库端口完全不需要对外开放,安全性大幅提升:
# 在本地机器执行,将本地 3307 转发到服务器的 3306
ssh -L 3307:127.0.0.1:3306 -N user@服务器IP -p SSH端口
# 然后本地数据库客户端连接 127.0.0.1:3307 即可
# MySQL 客户端示例:
mysql -h 127.0.0.1 -P 3307 -u myapp_user -p
# PostgreSQL 客户端示例:
psql -h 127.0.0.1 -p 5433 -U myapp_user -d myappSSH 隧道的优势
- 数据库端口完全不暴露到公网
- 连接全程加密,无需额外配置 TLS
- 无需修改 bind-address,配置最简
- 只需要开放 SSH 端口(22 或自定义)即可
小结
- 优先使用 SSH 隧道,数据库端口不对外暴露是最安全的做法
- 必须开放远程时,bind-address/listen_addresses 修改后立即配置防火墙限制来源 IP
- 数据库授权不用 % 通配符,明确指定可信 IP
- 定期审查数据库用户列表,删除不再使用的账户
常见问题
数据库端口对外开放有多危险?
非常危险。互联网上有大量自动化扫描器持续探测 3306、5432 端口,一旦发现弱密码或漏洞立即尝试入侵。如无强需求,数据库端口不应对外开放。
SSH 隧道断开后数据库连接会怎样?
SSH 隧道断开后,通过隧道建立的数据库连接也会断开。可以加 -o ServerAliveInterval=60 参数保持隧道活跃,或使用 autossh 自动重连。
如何查看当前数据库有哪些远程连接?
MySQL:SHOW PROCESSLIST; 可查看所有活跃连接及来源 IP。PostgreSQL:SELECT * FROM pg_stat_activity; 可查看当前会话。
开放远程后连接仍然拒绝,怎么排查?
依次检查:① 服务确实在监听(ss -tlnp | grep 3306)② 防火墙放行规则(ufw status)③ 数据库用户的 Host 字段是否匹配来源 IP ④ 密码是否正确。