3306端口暴露公网等于主动 inviting 攻击:5分钟内可完成nmap扫描→hydra暴力破解→获取root权限;bind-address=0.0.0.0、弱密码、旧版本漏洞(如CVE-2012-2122)、SSL未真启用等任一缺失均使其形同虚设。

3306端口在公网环境下等于把数据库的锁孔直接焊在大门上——攻击者不用撬锁,只要敲几下就能试出钥匙。
3306端口暴露后,攻击者5分钟内能干成什么
真实渗透测试中,从端口开放到拿到数据库 root 权限,常见路径是:nmap -p3306 扫到服务 → hydra -t 4 -L users.txt -P pass.txt mysql://x.x.x.x:3306 暴力破解 → 成功登录。整个过程常低于5分钟。一旦 root@% 账户存在且密码弱(如 123456、password 或空),基本无抵抗能力。CVE-2012-2122 这类认证绕过漏洞虽已修复,但大量未升级的老版本(如 MySQL 5.5.30 之前)仍在野活跃,可跳过密码直接进库。
bind-address = 0.0.0.0 是最常被忽略的致命配置
MySQL 默认配置里没有显式设置 bind-address,某些发行版(如 Ubuntu 的包管理安装)会默认监听 0.0.0.0;另一些则默认为 127.0.0.1。但只要运维手动改过配置文件却忘了加这一行,或用 Docker 启动时没加 --bind-address=127.0.0.1,就极可能全网可连。
- 检查方法:
mysql -e "SHOW VARIABLES LIKE 'bind_address';" - 正确值必须是
127.0.0.1(本地)或具体内网 IP(如192.168.10.10),绝不能是0.0.0.0或公网 IP - 改完需重启 mysqld,且要确认进程实际监听地址:
ss -tlnp | grep :3306,输出中应只含127.0.0.1:3306或内网地址
防火墙和云安全组不是“补丁”,而是第一道也是最后一道防线
很多团队以为“我开了 SSH 隧道,所以 3306 开着也无所谓”,这是错觉。只要端口在公网路由可达,扫描器就会持续打它。哪怕你没开 skip-grant-tables,只要账户密码弱、版本旧、插件有漏洞(如 mysql_native_password 在低版本中的实现缺陷),都可能被击穿。
- 云厂商安全组:默认拒绝所有入向,仅放行 DBA 办公 IP 或跳板机 IP 到
3306 - 系统级防火墙(如 iptables):加规则
iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.10.0/24 -j DROP,强制只允内网段 - 切忌只改端口(如改成
3307):端口扫描毫秒级全覆盖,换端口≠隐藏服务
SSL 强制不等于加密生效
启用了 require_secure_transport = ON 和 ssl_mode = REQUIRED 之后,仍要验证客户端是否真走加密连接。常见失效点:
- 应用连接字符串里没加
?ssl-mode=REQUIRED(MySQL 8.0+)或?useSSL=true(旧版) - 证书未被客户端信任(自签证书需额外配置
ssl_ca) -
SHOW STATUS LIKE 'Ssl_cipher';返回空,说明当前连接未加密
真正安全的链路,是「内网监听 + 防火墙白名单 + 强密码 + SSL 强制 + 客户端显式启用」四者缺一不可。少一个,3306 就只是个带锁的玻璃门。


















