远程连接家里的 MySQL / Redis:用 Navicat 从外网直连数据库
场景很常见:数据库在家里服务器/办公室内网(自建 MySQL、跑在 NAS 上的 PostgreSQL、开发机的 Redis), 人在外面想用 Navicat / DataGrip / DBeaver 直接连上去查数据、导报表。数据库是 TCP 服务, 内网穿透映射对应端口即可获得公网入口——但数据库比 Web 服务更不能裸奔, 这篇把打通步骤和安全加固一起讲清楚。
常见数据库端口速查
| 数据库 | 默认端口 | 协议 |
|---|---|---|
| MySQL / MariaDB | 3306 |
TCP |
| PostgreSQL | 5432 |
TCP |
| Redis | 6379 |
TCP |
| MongoDB | 27017 |
TCP |
| SQL Server | 1433 |
TCP |
第一步:让数据库接受非本机连接
默认配置大多只听本机回环,先在数据库侧放开(但仍只放开到局域网,公网交给穿透管):
-
MySQL 8:配置文件
bind-address = 0.0.0.0(或家里的内网网段),为远程使用的账户授权:CREATE USER 'dev'@'%' IDENTIFIED BY '强密码'; GRANT ... ON 库名.* TO 'dev'@'%';——权限按库给,别直接 root@'%'。 -
PostgreSQL:
postgresql.conf的listen_addresses = '*',pg_hba.conf加一行host 库名 用户 家里内网网段 scram-sha-256。 -
Redis:必须设置
requirepass,bind保持内网地址即可; 切记「无密码 + 0.0.0.0」是挖矿木马最爱的组合。
验证:在跑客户端的设备上 telnet 数据库内网IP 3306 通了再进入下一步。
第二步:创建 TCP 映射
- 在与数据库同内网的常开设备上安装 NA-Vlet(免费下载)并登录;
- 「隧道映射」→ 新建:协议选 TCP,选「数据库」模板,内网目标填
192.168.1.20:3306(数据库实际地址端口); - 保存后拿到公网地址与端口(形如
公网IP:39xxx); - 建议立刻配置安全组白名单:只放行你办公/常用的出口 IP,把互联网上无休止的扫描器挡掉。
第三步:客户端连接
# Navicat / DataGrip / DBeaver 填写
主机: 映射的公网IP
端口: 映射的公网端口(不是 3306)
用户/密码: 数据库账户
# 测试连接通过即完成
# 命令行同理
mysql -h 公网IP -P 映射端口 -u dev -p
redis-cli -h 公网IP -p 映射端口 -a '口令'
想要更体面的访问方式,给映射绑定自有域名,以后连接串就是 db.你的域名:端口,
换服务器/换端口也不用到处改客户端配置。
数据库暴露公网的安全清单(重要)
数据库端口是自动化攻击的第一目标:全网扫描器 24 小时爆破 3306/6379。穿透打通 ≠ 可以裸奔,以下按优先级执行:
- IP 白名单(最有效):NA-Vlet 安全组规则只放行你的固定出口 IP;家庭宽带 IP 会变的话,平时停用映射、用时再开;
- 最小权限账户:远程只用业务库的受限账户,禁用 root/超级用户远程登录(
MySQL root 限 localhost); - 强密码 + 非默认端口意义有限:强密码必须有;改端口只能挡最浅的扫描,白名单才是硬门槛;
- Redis 一定设密码并考虑
rename-command FLUSHALL;历史上大量 Redis 被写入 crontab 挖矿就是无密码裸奔; - 隧道 TLS 加密:NA-Vlet 隧道默认 TLS,数据库明文协议(MySQL 手shake、Redis 全明文)在公网段也拿不到内容;
- 限速:防止误操作(比如全表导出)把你家上行吃满,也降低被恶意拖库的速度;
- 用完即关:临时查数就临时开映射,长期入口只保留确有需求的。
开发者常见用法
- 异地开发直连家里库:本地项目配置文件指向映射地址,在家/在公司同一套数据;
- 给同事演示数据:临时开一条映射发连接串,演示完即关,不用把库同步到云上;
- 配合 webhook 联调:回调打到本机(见本地环境暴露教程),数据库在家里,两端各一条映射,整套环境随身走。