修改my.cnf中[mysqld]段的port=3307仅是基础隔离,必须同步禁用默认端口暴露、限制访问来源、关闭远程root、配置bind-address、开放防火墙及云安全组,否则单独改端口无效。

改 my.cnf 里的 port 本身不提高安全性,只是基础隔离手段;真正起作用的是配合禁用默认端口暴露、限制访问来源和关闭远程 root——单独改端口,攻击者扫到新端口照样打。
必须写在 [mysqld] 段里,其他位置全无效
MySQL 只认 [mysqld] 下的 port,写在 [client] 或 [mysql] 里只会让本地命令行默认连错端口,服务本身还在听 3306。
-
port = 3307要顶格写,行首不能有空格,行尾不能有中文分号或注释符# - 检查有没有重复的
port行,MySQL 只取第一个有效值,后面的直接忽略 - 删掉同段里的
skip-networking = 1,否则无论 port 设多少,MySQL 都不监听任何 TCP 端口
改完必须重启 mysqld,且确认配置文件被真实加载
MySQL 启动时按固定顺序读多个 my.cnf 路径,你改的文件可能根本没被加载。运行 mysqld --help --verbose | grep "Default options" 看实际生效路径,别只盯着 /etc/my.cnf。
- Linux 常见加载顺序:
/etc/my.cnf→/etc/mysql/my.cnf→/usr/local/mysql/etc/my.cnf→~/.my.cnf - 改完后执行
sudo systemctl restart mysql(systemd)或sudo service mysql restart(SysVinit) - 重启失败?立刻查日志:
sudo tail -20 /var/log/mysql/error.log,常见报错是端口被占用或配置语法错误
验证端口是否真监听,别信 SHOW GLOBAL VARIABLES LIKE 'port'
SHOW GLOBAL VARIABLES LIKE 'port' 返回的是配置值,不是实际监听状态。你可能改对了配置,但 MySQL 因 bind-address 冲突或权限问题压根没绑上新端口。
- 查进程监听:宿主机上运行
ss -tlnp | grep :3307,看到mysqld进程才说明真起来了 - 容器环境额外验证:进容器跑
docker exec mysql8 ss -tlnp | grep :3307 - 客户端连一下:
mysql -h 127.0.0.1 -P 3307 -u root -p,注意是大写-P,小写-p是输密码
端口改了,但防火墙、安全组、bind-address 一个都不能漏
只改 my.cnf 是半截操作。宿主机防火墙、云平台安全组、MySQL 自身绑定地址三者必须同步调整,否则端口开着也连不上。
-
bind-address默认是127.0.0.1,想从外部连,得改成0.0.0.0或具体 IP;生产环境严禁无条件设0.0.0.0 - Linux 防火墙:Ubuntu 用
sudo ufw allow 3307/tcp,CentOS 用sudo firewall-cmd --permanent --add-port=3307/tcp - 阿里云/腾讯云安全组:手动添加入方向 TCP 3307 规则,只放行可信 IP 段(如
192.168.1.0/24),别开“0.0.0.0/0”
最常被跳过的其实是 bind-address 和安全组——改完端口兴冲冲 telnet 测试,发现不通,结果翻日志发现 MySQL 根本没尝试监听外部地址,或者云服务器根本没放行这个端口。











