文档首页> 技术教程> MySQL 远程访问的安全开法

MySQL 远程访问的安全开法

发布时间:2025-12-19 13:52        更新时间:2025-12-20 09:21
MySQL 默认只听本机。远程能连上,是账号来源、监听地址、防火墙三层都放行的结果,配置和排错都按这三层来,顺序从里往外。 ## 一、建专用账号并限定来源 不要开 root 远程。给运维或同步用途单独建账号,host 写死允许的网段: ``` CREATE USER 'ops'@'10.0.0.%' IDENTIFIED BY '强密码'; GRANT SELECT, SHOW VIEW ON *.* TO 'ops'@'10.0.0.%'; FLUSH PRIVILEGES; ``` 'ops'@'10.0.0.%' 表示只允许 10.0.0.x 网段来源,比放开到 % 安全得多。账号名避开 admin、root 这类第一眼就会被尝试的名字,密码用密码管理器生成。GRANT 里的 *.* 表示全部库表,改成具体库名还能收得更细。权限按最小化给,只读用途绝不给写权限。粒度还能再细:GRANT 的对象写库名.表名,就只授那张表。 ## 二、改监听地址 配置文件里放开监听(CentOS 在 /etc/my.cnf,Ubuntu 在 /etc/mysql/mysql.conf.d/mysqld.cnf): ``` bind-address = 0.0.0.0 ``` 只在云内网互通的场景,这里写内网网卡地址更稳妥。改配置前备份一份原文件,回滚就是恢复文件再重启。注意和 skip-networking 区分,后者是彻底关掉网络监听,开了它改 bind-address 也没用。改完 systemctl restart mysqld,用 ss -lntp | grep 3306 确认监听已经放开。 ## 三、防火墙与安全组 firewalld 只对指定网段放行: ``` firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="3306" protocol="tcp" accept' firewall-cmd --reload ``` 云服务器还要到控制台检查安全组,3306 只对指定内网网段开,公网一律不开,这一步经常被漏掉。安全组和系统防火墙是两道独立的关卡,任何一道没放行都连不上,排错时两边都要看。 ## 四、连接验证与报错对照 在允许的客户端机器上: ``` mysql -uops -p -h 10.0.0.10 -e "SELECT 1;" ``` 连不上按现象对号:telnet 3306 不通,是防火墙或安全组的问题;报 Host is not allowed,是账号的 host 限定没包含这个来源;报认证插件相关错误,多半是 8.x 的 caching_sha2_password 遇上老客户端,升级客户端或改用兼容插件。网段写错是最常见的低级失误,10.0.0.% 和 10.0.% 是两个范围,账号建完用 SELECT user,host FROM mysql.user 复核一遍。 远程访问开得越窄越好:来源限定到网段,权限给到只读,出事时排查范围也小。临时排障更适合走跳板机或加密隧道,数据库端口长期暴露的面越小越好。