在使用Docker进行端口映射时,仅依赖iptables的白名单规则存在安全隐患。Docker会自行管理iptables规则,绕过标准的INPUT链,并采用黑名单机制,导致非白名单IP也能访问端口。为加强安全性,建议关闭Docker的自动防火墙管理功能,通过在/etc/docker/daemon.json中添加"iptables": false来禁用,并手动清理Docker生成的规则链,之后再自行管理防火墙规则,以确保端口访问的安全性。
🔑 **Docker端口映射的潜在安全漏洞**:Docker通过-p或--publish选项映射端口到宿主机时,虽然可以通过iptables INPUT链设置白名单限制访问IP,但Docker会自行管理iptables规则,插入名为DOCKER的Rule Chain,绕过INPUT链的管理。这导致即使IP不在白名单内,也可能能够访问映射的端口,这是一个重大的安全风险。
🚫 **Docker防火墙机制的冲突**:与标准的防火墙(如iptables、Windows防火墙)默认采用白名单制以提高安全性不同,Docker的防火墙机制实际上是黑名单制的。这种默认的黑名单方式与安全理念相悖,为安全管理带来了挑战。
🛠️ **关闭Docker自动防火墙管理**:为了解决上述安全问题,建议用户关闭Docker的自动防火墙管理功能。这可以通过修改Docker的配置文件/etc/docker/daemon.json,并添加配置项`"iptables": false`来实现。禁用此功能后,Docker将不再自动管理iptables规则。
🧹 **手动管理防火墙规则**:在关闭Docker自动防火墙管理后,需要手动清理Docker之前向iptables中添加的所有Rule Chain。之后,用户可以根据自身安全需求,手动配置iptables规则,以更精细地控制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 的防火墙,来加强安全。