用主机防火墙限制了访问来源,可容器发布的端口依然对公网开放,扫描工具能直接连上数据库。
原因不止一个,得分开看。容器运行时直接写底层规则,插在防火墙规则之前。也可能是发布端口时绑定了所有网卡地址。
少数情况下是防火墙本身没有开启转发链的过滤。
上来先确认端口监听在哪个地址
ss -lntp | grep 3306
然后改成只绑本机地址
docker run -p 127.0.0.1:3306:3306 mysql
接着在转发链上补过滤规则
iptables -I DOCKER-USER -p tcp --dport 3306 -j DROP
从外部验证是否已关闭
nc -zv -w 3 服务器IP 3306
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。外部无法连接该端口,本机应用仍能正常访问容器服务。
只改发布参数对已经在跑的容器没用,必须重建;数据库这类服务最好根本不要发布到公网。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。