如何阻止Docker容器对外开放?MySQL端口遭暴力攻击求助
解决Docker MySQL端口遭暴力攻击的问题
你的iptables规则失效的核心原因
- 未替换占位符网卡名:你用的
ext_if是示例占位符,必须替换成服务器实际的外网网卡名称(比如eth0、ens33)。可以通过ip addr命令查看网卡列表,找到对应外网流量的网卡。 - 未指定目标端口:之前的规则会拦截所有非指定来源的流量,而非仅MySQL端口,精准度不足还容易引发其他问题。
正确的iptables配置示例
假设你的外网网卡是eth0,仅允许内网192.168.1.0/24段访问MySQL的3306端口,执行以下命令:
iptables -I DOCKER-USER -i eth0 ! -s 192.168.1.0/24 -p tcp --dport 3306 -j DROP
执行后可以用iptables -L DOCKER-USER -n查看规则是否生效。如果需要重启后保留规则,执行iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(CentOS)。
更彻底的防范方案
除了iptables,还可以从源头减少暴露风险:
- 仅绑定内网IP暴露端口:启动MySQL容器时,不要绑定
0.0.0.0,只绑定服务器内网IP,比如:
这样外网无法直接访问该端口。docker run -d -p 192.168.1.100:3306:3306 --name mysql mysql:latest - 使用Docker内部网络:创建专用Docker网络,让关联服务通过容器名/内部IP访问MySQL,完全不对外暴露端口:
docker network create mysql-net docker run -d --name mysql --network mysql-net mysql:latest # 其他服务连接时同样加入该网络,用mysql:3306访问 - MySQL自身限制:在
my.cnf中设置bind-address = 192.168.1.0/24,仅允许指定IP段连接;同时禁用root用户远程登录,创建专用业务账号并限制IP。 - 启用fail2ban:监控MySQL日志(比如
/var/log/mysql/error.log),自动封禁多次失败登录的IP,降低暴力攻击成功率。 - 修改默认端口:将MySQL端口从3306改为其他非默认端口,减少被批量扫描的概率。
内容的提问来源于stack exchange,提问作者Avora
相关产品推荐
相关产品推荐

