mysql容器暴露3306端口并映射至公网等于将数据库登录界面裸露于互联网,极易遭扫描爆破;正确做法是容器绑定内网地址或专用docker网络,防火墙仅白名单放行可信ip,并确保bind-address与网络配置一致。

MySQL容器暴露3306端口但只允许内网访问
直接映射 3306:3306 并开放给公网,等于把数据库的登录界面挂在互联网上任人扫描。真实生产中,绝大多数爆破和慢查询攻击都源于这一步配置失当。
正确做法是:容器本身不监听 0.0.0.0:3306,而是绑定到宿主机内网地址或 Docker 自定义网络;防火墙规则只放行可信来源(如应用服务器 IP 或内网段)。
- 启动容器时用
--network=mysql-net创建专用桥接网络,不使用默认bridge,避免被其他容器意外访问 - 宿主机防火墙禁止所有对
3306的入向连接:sudo ufw deny 3306(Ubuntu)或firewall-cmd --remove-port=3306/tcp --permanent(CentOS) - 仅对必要来源开白名单,例如:
sudo ufw allow from 192.168.5.10 to any port 3306(应用服务器 IP) - 若必须走宿主机端口映射(如
-p 3307:3306),防火墙规则目标端口应为3307,不是3306
bind-address 和 Docker 网络配置不一致导致“端口通但连不上”
现象是 telnet host_ip 3307 成功,但 mysql -h host_ip -P 3307 -u root -p 报 Access denied 或直接超时——大概率是 MySQL 容器内部配置和外部网络路径没对齐。
my.cnf 中的 bind-address 决定 MySQL 听谁,而 Docker 的 -p 或 --network 决定流量怎么进来。两者错位就会断连。
- 如果用
--network=mysql-net,MySQL 容器内应设bind-address = 0.0.0.0(或留空,默认行为),并确保用户权限含'root'@'172.18.0.%'这类网段授权 - 如果只希望本地开发连,
bind-address = 127.0.0.1+-p 3306:3306是危险组合,必须配合ufw deny 3306或改用host网络模式 - 检查容器内实际监听地址:
docker exec -it mysql-container ss -tln | grep :3306,输出应含*:3306或127.0.0.1:3306,而非127.0.0.1:3306却对外映射
conntrack 超时引发“连接突然中断”
客户端执行长事务或空闲等待后报 Lost connection to MySQL server during query,但 MySQL 错误日志里没有异常记录——这是 Linux 防火墙连接跟踪表(nf_conntrack)提前清理了连接状态所致。
Docker 宿主机的 net.netfilter.nf_conntrack_tcp_timeout_established 默认值常为 432000 秒(5 天),但某些云厂商内核会压到 300 秒以下,而 MySQL 的 wait_timeout 可能设为 28800(8 小时)。一旦防火墙先删连接,后续包就被丢弃。
- 查当前值:
sysctl net.netfilter.nf_conntrack_tcp_timeout_established - 临时调大:
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400 - 永久生效需写入
/etc/sysctl.conf,但注意部分云主机(如阿里云轻量)会在重启后被 init 脚本覆盖,得配合rc.local或 systemd drop-in 补救 - 更稳妥的做法是让应用层主动控制连接生命周期,比如用连接池设置
maxLifetime小于 conntrack 超时值
云服务器安全组与宿主机防火墙规则重复或冲突
在阿里云、腾讯云等平台部署时,即使宿主机 ufw 或 firewalld 已放行 3307,连接仍失败——八成卡在安全组没开。
云平台的安全组是第一道网关,它工作在网络层,优先级高于宿主机防火墙。规则没配或配错,后面全白搭。
- 安全组入方向规则必须显式添加:协议
TCP,端口3307(不是容器内3306),源 IP 建议精确到单 IP(如192.168.10.5/32)或最小业务网段 - 禁止写
0.0.0.0/0开放整个端口,这是线上最常见被扫出弱口令的根源 - 确认安全组已绑定到对应 ECS 实例,且实例处于运行中状态;修改后无需重启实例,但规则生效有秒级延迟
- 安全组和宿主机防火墙不要做相同功能(比如都开
3307),容易因顺序或策略冲突导致拦截漏放











