Appearance
一、整体实现思路
生产环境数据库不要直接开放 3306 到公网,否则容易被扫描、爆破、撞库。
正确做法是:
txt
本地电脑
↓ SSH 加密连接
服务器 SSH
↓ 转发到服务器本机
MySQL 127.0.0.1:3306也就是:
txt
本地连接 127.0.0.1:13306
实际访问 服务器内部 127.0.0.1:3306这样 MySQL 对公网不可见,但你本地仍然可以安全连接。
二、服务器侧配置 MySQL 只监听本机
找到 MySQL 配置文件,常见位置:
bash
/etc/mysql/mysql.conf.d/mysqld.cnf或:
bash
/etc/my.cnf修改:
ini
# 只允许服务器本机访问 MySQL,不监听公网网卡
bind-address = 127.0.0.1然后重启 MySQL:
bash
sudo systemctl restart mysql检查监听状态:
bash
ss -lntp | grep 3306理想结果类似:
txt
127.0.0.1:3306不要是:
txt
0.0.0.0:3306也不要是:
txt
公网IP:3306三、防火墙关闭 MySQL 公网端口
如果你用的是 ufw:
bash
# 禁止公网访问 MySQL
sudo ufw deny 3306只保留必要端口:
bash
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443查看状态:
bash
sudo ufw status如果你用的是云服务器安全组,也要在云厂商控制台关闭 3306 入站规则。
四、本地电脑通过 SSH 隧道连接 MySQL
在你本地电脑执行:
bash
# 将本地 13306 端口转发到服务器内部的 MySQL 3306
ssh -L 13306:127.0.0.1:3306 root@你的服务器公网IP保持这个终端不要关闭。
然后你本地数据库客户端连接:
txt
Host: 127.0.0.1
Port: 13306
User: 数据库用户名
Password: 数据库密码
Database: 数据库名注意:这里不是连服务器公网 IP,而是连你自己电脑的:
txt
127.0.0.1:13306五、Navicat / DataGrip / DBeaver 配置方式
如果你用数据库客户端,一般都有 SSH Tunnel 配置。
数据库连接配置
txt
Host: 127.0.0.1
Port: 3306
User: 数据库用户名
Password: 数据库密码SSH 隧道配置
txt
SSH Host: 服务器公网 IP
SSH Port: 22
SSH User: root 或 deploy 用户
SSH Password / SSH Key: 你的 SSH 登录凭据客户端会自动帮你完成:
bash
ssh -L 本地端口:127.0.0.1:3306 服务器六、项目 .env.production 推荐配置
如果应用和 MySQL 在同一台服务器上,生产环境可以这样:
env
# 应用部署在服务器本机时,直接连接服务器内部 MySQL
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
DATABASE_USER=your_user
DATABASE_PASSWORD=your_password
DATABASE_NAME=your_db不要写成:
env
DATABASE_HOST=服务器公网IP
DATABASE_PORT=3306七、最简安全方案
你的场景可以直接按这个方案做:
txt
MySQL:
bind-address = 127.0.0.1
服务器防火墙:
不开放 3306
只开放 22 / 80 / 443
本地连接:
ssh -L 13306:127.0.0.1:3306 root@服务器公网IP
数据库客户端:
连接 127.0.0.1:13306八、最终检查清单
md
- [ ] MySQL 监听地址是 127.0.0.1:3306
- [ ] 云服务器安全组没有开放 3306
- [ ] Linux 防火墙没有开放 3306
- [ ] 本地通过 SSH Tunnel 连接数据库
- [ ] 生产应用通过 127.0.0.1:3306 访问 MySQL
- [ ] 数据库密码、JWT、微信、LLM 等密钥已经轮换
- [ ] `.env.prod` 不再提交到代码仓库结论:数据库不暴露公网,不影响本地连接;本地通过 SSH 隧道连,是个人项目和小团队部署中最推荐的方式。