一、为什么公网直连MySQL是高危操作
1.1 常规直连配置(不推荐)
Navicat常规页面填写服务器公网IP、端口3306,安全组放行入方向3306端口,直接外网访问数据库。
主机:服务器公网IP
端口:3306
安全组规则:入方向允许0.0.0.0/0访问3306
1.2 三大安全隐患
端口全网暴露,极易被暴力破解
3306是MySQL默认端口,全网扫描工具会7×24小时批量探测,持续尝试弱密码,一旦数据库账号密码简单,数据会直接泄露。数据明文传输,抓包可窃取信息
不开启SSL的前提下,SQL查询、账号密码、业务数据在公网明文传输,局域网、公共WiFi环境极易被抓包窃取。扩大服务器攻击面
多开放一个端口,就多一条入侵通道,黑客可利用MySQL漏洞入侵服务器,删除、篡改全部业务数据。
常见报错:若关闭安全组3306放行,直连模式会直接弹出”Connection refused”,这也是很多人不愿关闭3306的原因,但本质是方案本身存在缺陷。
二、安全标准方案:SSH隧道连接MySQL
2.1 原理说明
不对外暴露数据库3306端口,仅通过SSH端口建立加密隧道:
- Navicat先通过SSH账号登录Linux服务器;
- 在服务器本地访问
127.0.0.1:3306本地MySQL服务; - 数据库流量全部封装在SSH加密通道中转回本地,外网无法直接接触数据库。
2.2 Navicat完整配置教程
① 常规标签页(数据库层配置)
- 主机:
127.0.0.1 - 端口:
3306 - 用户名:MySQL数据库账号(如root)
- 密码:MySQL数据库独立密码
② SSH标签页(服务器系统层配置)
勾选「使用SSH通道」
- SSH主机:服务器公网IP
- SSH端口:
22(或自定义高位端口) - SSH用户名:服务器系统账号(阿里云默认root)
- SSH密码:服务器实例登录密码
两层账号区分:SSH是服务器登录账号,常规是数据库登录账号,二者互相独立。
2.3 方案核心优势
数据库完全隐藏内网
安全组无需放行3306入方向,外网无法扫描到数据库端口,从根源杜绝爆破攻击。全程加密传输
SSH通道自带高强度加密,所有SQL操作、数据交互不会明文泄露。适配动态宽带IP
家用、公司宽带公网IP不固定,无需DDNS脚本,仅放行SSH端口即可远程管理数据库。不影响本地数据库操作
SSH登录服务器后,依旧可以通过mysql -u账号 -p本地命令行操作数据库,兼顾可视化工具与命令行。
三、进阶加固:SSH自定义高位端口
3.1 改造思路
默认22端口是全网扫描重灾区,家用宽带为动态公网IP无法限制访问来源,因此将SSH监听端口修改为高位22022,大幅减少暴力爆破流量。
区分两个关键配置文件:
/etc/ssh/ssh_config:SSH客户端配置,控制本机向外连接的参数,无需修改;/etc/ssh/sshd_config:SSH服务端配置,控制外部访问服务器的准入规则,修改端口必须编辑此文件。
3.2 服务端配置修改
⚠️ 重要警告:修改期间请不要退出当前SSH连接!保持现有终端窗口打开,使用新终端测试新端口,确保新端口可用后再关闭原连接。
- 编辑sshd服务配置
vim /etc/ssh/sshd_config
先搜索确认文件中是否已有 Port 配置:
grep "^Port" /etc/ssh/sshd_config
根据搜索结果选择配置方式:
- 如果已有
Port 22:在该行下方添加新端口,确保两个端口都监听:
Port 22
Port 22022
MaxAuthTries 3
- 如果没有
Port配置:在文件末尾添加,必须同时包含22和22022:
Port 22
Port 22022
MaxAuthTries 3
⚠️ 关键说明:如果只添加
Port 22022而不保留Port 22,重启后sshd将只监听22022端口,若防火墙/安全组未正确放行新端口,将导致无法登录!务必同时保留两个端口,待新端口测试成功后再关闭22端口。
- Port 22:保持原有端口可用,作为兜底连接通道;
- Port 22022:新增高位端口,后续切换为主连接端口;
- MaxAuthTries 3:密码输错3次直接断开连接,限制爆破尝试次数。
- 配置防火墙放行新端口(CentOS/RHEL 7+ 使用 firewalld)
firewall-cmd --permanent --add-port=22022/tcp
firewall-cmd --reload
Debian/Ubuntu 用户(使用 ufw):
ufw allow 22022/tcp
ufw reload
- 校验配置语法(防止配置错误导致SSH彻底失联)
sshd -t
无报错再执行重启命令加载新配置:
systemctl restart sshd
- 验证端口监听是否生效
ss -tulnp | grep ssh
应同时显示0.0.0.0:22和0.0.0.0:22022两个端口监听,代表修改成功。
- 用新端口测试登录(关键步骤,确认新端口可用后再处理旧端口)
打开新终端窗口,使用新端口测试连接:
ssh root@服务器公网IP -p 22022
⚠️ 重要提醒:此时sshd同时监听22和22022两个端口,原连接(22端口)仍保持可用。务必先用新端口登录成功后,再进行下一步。不要关闭原终端窗口,直到确认新端口完全可用。
- 确认新端口可用后,关闭原22端口
vim /etc/ssh/sshd_config
找到或添加的 Port 22 行,注释掉或删除:
# Port 22
Port 22022
保存后重启sshd:
systemctl restart sshd
验证22端口已不再监听:
ss -tulnp | grep ssh
只显示0.0.0.0:22022即为成功。
⚠️ 安全组同步调整:此时再到阿里云安全组将22端口规则改为「拒绝」,拦截恶意扫描流量。详见第4.3节。
3.3 配套工具同步修改端口
SFTP工具(FileZilla)
协议选择SFTP,主机填写服务器公网IP,端口手动填写22022,使用服务器root账号密码登录。Navicat MySQL SSH隧道
SSH标签页内,SSH端口同步修改为22022,否则隧道建立失败,无法远程管理数据库。
3.4 方案优势
- 屏蔽默认22端口海量扫描请求,服务器登录日志大幅减少;
- 高位端口极少被自动化扫描工具探测,暴力破解攻击量下降90%;
- 无需固定公网IP、无需DDNS脚本,适配家用动态宽带环境;
- 操作简单无额外学习成本。
四、阿里云安全组落地配置(最简5条规则)
4.1 安全组规则清单
| 优先级 | 协议类型 | 端口 | 访问来源 | 用途 |
|---|---|---|---|---|
| 1 | 自定义TCP | 8080 | 0.0.0.0/0 | 后台服务外网访问 |
| 1 | TCP | 443 | 0.0.0.0/0 | 网站HTTPS加密访问 |
| 100 | TCP | 80 | 0.0.0.0/0 | 网站HTTP基础访问 |
| 100 | ICMP-IPv4 | - | 0.0.0.0/0 | Ping测试服务器网络连通性 |
| 100 | 自定义TCP | 22022 | 0.0.0.0/0 | SSH远程登录、MySQL隧道专用通道 |
4.2 必须删除的高危规则
- 入方向3306 MySQL放行规则(核心高危端口,彻底移除)
- 闲置端口自定义TCP放行(例如未使用的8090端口)
- Windows远程桌面3389端口规则(Linux服务器完全无用)
- VPC内网网段全流量放行(单台服务器无多机互通需求,冗余规则)
4.3 安全组调整要点
⚠️ 执行前提:必须先完成第3.2节服务端配置,并确认使用22022端口能成功登录服务器后,再执行以下操作。
- 新增22022端口规则:添加一条入方向自定义TCP规则,端口范围
22022/22022,访问来源0.0.0.0/0; - 拒绝22端口规则:原有系统自带「SSH远程连接Linux实例(22端口)」规则,无需删除,将授权策略改为拒绝,拦截所有访问22端口的恶意扫描流量。
4.4 极简安全组优势
- 无数据库公网暴露端口,从底层阻断MySQL外网攻击;
- 仅开放业务必需端口,最小化服务器攻击面;
- 仅依靠22022端口完成远程管理,适配家用动态IP;
- 规则分层设置优先级,业务访问逻辑清晰,无端口拦截冲突。
五、额外MySQL与SSH加固建议
- 禁止MySQL root账号外网访问:仅本地127.0.0.1授权;
- 设置高强度数据库密码:避免123456、root等弱密码;
- 定期备份数据库:防止误删、入侵导致数据丢失;
- SSH进阶加固:关闭密码登录,改用密钥登录,进一步降低爆破风险;
- 安装Fail2ban:自动封禁多次SSH登录失败的恶意IP:
dnf install fail2ban -y
systemctl enable --now fail2ban
六、总结
MySQL公网直连3306是最低成本、最高风险的偷懒方案,无论个人建站还是小型业务,都应放弃该方式。
SSH隧道连接无需额外成本、配置简单,搭配SSH高位端口+极简安全组规则,既能实现远程可视化管理数据库,又能彻底隐藏数据库端口,是兼顾易用性与安全性的最优选择。