在使用Docker进行端口映射时,通常会通过iptables的INPUT Chain设置白名单规则来限制访问IP。然而,Docker为了实现其功能,会自行管理iptables,插入一系列名为DOCKER的Rule Chain,绕过INPUT Chain的管理,导致非白名单IP也能访问。这与防火墙默认的白名单安全理念相悖。文章建议关闭Docker的自动防火墙管理功能,通过修改/etc/docker/daemon.json添加"iptables": false,然后手动清理Docker生成的Rule Chain,并自行管理防火墙规则,以增强安全性。
🛡️ Docker端口映射安全隐患:Docker在进行端口映射时,会绕过iptables的INPUT Chain,插入自定义的Rule Chain,使得非白名单IP也能访问。这是因为Docker默认采用黑名单机制管理iptables,与通用的白名单安全策略相冲突。
💡 Docker绕过iptables的机制:通过执行`iptables --list --verbose --numeric`和`iptables --list --verbose --numeric --table nat`命令,可以发现Docker在iptables中创建了大量以DOCKER命名的Rule Chain,这些Chain的插入使得Docker的网络流量管理独立于传统的防火墙规则。
✅ 规避风险的配置方案:为了解决这一安全问题,建议在`/etc/docker/daemon.json`文件中添加`"iptables": false`来关闭Docker的自动防火墙管理功能。
🛠️ 手动管理防火墙的必要性:关闭Docker的自动管理后,需要手动清理Docker先前添加的所有Rule Chain,并自行配置iptables规则,以实现更精细化的访问控制,确保只有授权的IP地址能够访问Docker暴露的端口。
我们在使用 docker 时,一般会使用 -p / --publish 来映射端口到宿主机,然后在 iptables 的 INPUT Chain 里开一条白名单规则,允许指定的 IP 或 IP 范围来访问这个端口。
问题是,很多朋友测试能访问后,很容易偷懒,不再测试别的 IP 是否能访问了。docker 的重磅安全漏洞也就在这里出现。如果你继续测试,你会发现,不在白名单的 IP 地址,也能访问这个端口。
原因在于 docker 自行管理 iptables ,它给 iptables 里插入一大堆 Rule Chain ,绕开了 INPUT Chain 的管理。
通过以下两条命令:
iptables --list --verbose --numeric
iptables --list --verbose --numeric --table nat
可以发现 docker 插入了一堆以 DOCKER 命名的 Rule Chain 。
本来标准的软硬件防火墙,包括 iptables 、Windows 防火墙,为了安全,都是默认使用白名单制,而 docker 的防火墙却是黑名单制的,这与安全理念冲突。
建议关闭 docker 的自行管理防火墙的功能,向 /etc/docker/daemon.json 添加 "iptables": false
然后手动清理 docker 向 iptables 里添加的各种 Rule Chain
最后手动管理 docker 的防火墙,来加强安全。