只开ufw的3306端口远远不够,必须同步处理云平台安全组、mysql绑定地址、用户权限三处,否则99%会连不上;需确认mysql监听0.0.0.0:3306、ufw精确放行3306/tcp(推荐限制来源ip)、云安全组开放tcp 3306(严禁0.0.0.0/0)、创建'用户'@'指定ip'并授权且刷新权限,mysql 8+还需注意认证插件兼容性。

直接说结论:只开UFW的3306端口远远不够,必须同步处理云平台安全组、MySQL绑定地址、用户权限三处,否则99%会连不上。
确认MySQL服务已监听0.0.0.0:3306而非127.0.0.1
很多用户执行sudo ufw allow 3306/tcp后仍无法远程连接,根本原因是MySQL默认只监听本地回环地址。用netstat -tlnp | grep :3306检查输出,如果看到的是127.0.0.1:3306,说明还没改配置。
- 编辑
/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address = 127.0.0.1这一行 - 改成
bind-address = 0.0.0.0(开发测试)或指定内网IP(如192.168.1.100) - 重启服务:
sudo systemctl restart mysql - 再次
netstat -tlnp | grep :3306,确认显示*:3306或0.0.0.0:3306
UFW放行3306端口时必须指定协议类型
写成sudo ufw allow 3306是错的——它默认放行TCP+UDP,而MySQL只用TCP。不加/tcp后缀可能被误匹配到其他服务,也可能在某些UFW版本中行为不一致。
- 正确命令是:
sudo ufw allow 3306/tcp - 若只要特定IP访问,加
from参数:sudo ufw allow from 192.168.1.50 to any port 3306 proto tcp - 执行后务必运行
sudo ufw status verbose,确认规则中3306/tcp出现在To列,且Action为ALLOW - 别忘了
sudo ufw enable(如果还没启用)
阿里云/腾讯云安全组规则优先级高于UFW
即使UFW开了、MySQL也监听了0.0.0.0,云服务器外部仍连不上,大概率是卡在安全组。它的过滤发生在网络层更上游,UFW根本收不到包。
- 登录云控制台 → 找到对应ECS实例 → 进入「安全组」→ 「配置规则」
- 添加入方向规则:
协议类型选TCP,端口范围填3306/3306,授权对象填具体IP(如192.168.1.50)或最小化网段(如192.168.1.0/24),生产环境严禁填0.0.0.0/0 - 保存后等待10–30秒生效,部分云厂商需手动刷新页面才能看到新规则
- 验证方式:从另一台同VPC机器用
telnet your-server-ip 3306测试端口通不通,排除DNS和客户端问题
MySQL用户权限必须显式授权远程host
即使前面全对,用root@localhost创建的用户也无法从外部IP登录。MySQL的user表是按user + host组合匹配的,'root'@'%' 和'root'@'localhost'是两个完全不同的账户。
- 登录MySQL:
sudo mysql -u root -p - 执行:
CREATE USER 'appuser'@'192.168.1.50' IDENTIFIED BY 'StrongPass123!';(不要用root远程) - 再执行:
GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'appuser'@'192.168.1.50'; - 最后:
FLUSH PRIVILEGES; - 注意:
'appuser'@'%'虽方便但风险高;'%'不包含localhost,本地登录仍要用'appuser'@'localhost'单独授权
最容易被忽略的是:MySQL 8.0默认认证插件是caching_sha2_password,旧版客户端(如Navicat 11以下、某些Python驱动)会报Authentication plugin 'caching_sha2_password' cannot be loaded。临时解法是在创建用户时指定IDENTIFIED WITH mysql_native_password,或者全局修改default_authentication_plugin配置项。











