在默认配置下,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 / MariaDB330650-server.cnf(bind-address)
PostgreSQL5432postgresql.conf(listen_addresses)
Redis6379redis.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 myapp

SSH 隧道的优势

  • 数据库端口完全不暴露到公网
  • 连接全程加密,无需额外配置 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 ④ 密码是否正确。