打开网易新闻 查看精彩图片

令人惊讶的是,Docker 无法与 Linux 的“通用防火墙”或 UFW 一起使用。它们都修改了相同的 iptables 配置,这可能导致错误配置暴露不应该公开的容器。这是修复它的方法。

为什么 Docker 不能与 UFW 一起使用?

UFW 旨在成为一个非常简单的防火墙。问题是 UFW 和 Docker 都试图修改相同的底层防火墙规则,如果你想一起运行 UFW 和 Docker,这种冲突需要额外的设置来解决。

如果您将基本的 UFW 防火墙设置为默认拒绝并允许 HTTP 和 SSH,这将显得安全——但它不会阻止 Docker 启动绑定到其他端口的容器。这个问题很难发现,因为 UFW 和 Docker 是独立的系统。UFW 在不知不觉中对您撒谎,并且不会显示 Docker 容器的开放端口

打开网易新闻 查看精彩图片

如果你没有抓住它,这可能是一个大问题。例如,也许您想在端口 8000 上运行一个内部管理面板,并将其列入您自己的 IP 地址的白名单。虽然这不是最安全的设置,但通常没问题,特别是如果面板有额外的身份验证。

但是,UFW 会将防火墙规则显示为正确列入白名单,并且您当然可以从您列入白名单的位置看到它。但是,如果它通过 Docker 运行,则默认情况下它会在任何地方的 8000 端口上可见。

修复 Docker 的配置

Docker 提供了一个解决方案,通过编辑 或 完全关闭 Docker 的 功能:

/etc/default/docker

/etc/docker/daemon.json

iptables

DOCKER_OPTS="--iptables=false"

这可行,但是,这只是解决方案的一半。它禁用了 Docker 管理自己的网络的能力,并可能导致容器根本无法访问互联网。这仍然可以工作,但是您需要手动维护 Docker 容器和自定义网络的规则,这很复杂,很烦人,并且违背了 UFW 简单的目的。

iptables

真正的解决方案很复杂,但幸运的是很常见,有一个有用的 Github 存储库详细说明了问题和解决问题的步骤。本质上,您需要修改 UFW 的配置以 在末尾添加以下块:

/etc/ufw/after.rules

# 开始 UFW 和 Docker
*筛选
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j 返回 -s 10.0.0.0/8
-A 码头工人用户 -j 返回 -s 172.16.0.0/12
-A 码头工人用户 -j 返回 -s 192.168.0.0/16
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A 码头工人用户 -j 返回
-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP
犯罪
# 结束 UFW 和 Docker

您可以手动执行此操作,但此 repo 中还提供了一个不错的实用程序,可以自动执行此操作,并提供一些有用的命令来检查真实的防火墙状态。你可以从这个 repo 下载它:

sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker

然后,安装配置,然后重新启动 UFW。

ufw-docker 安装
sudo systemctl 重启 ufw

重新启动后,更改应该会自动应用,但如果没有,您可能需要重新启动 Docker 或您的机器。一旦启用,所有端口都应该被正确阻止。

打开网易新闻 查看精彩图片

使用 UFW 将 Docker 容器端口列入白名单

此解决方案确实需要您稍微不同地配置端口。该 实用程序有一个命令,可以选择性地将特定 Docker 容器的端口列入白名单。

ufw-docker

ufw-docker 允许 httpd 80

但是,如果您想使用更高级的规则,例如基于 IP 的白名单,则必须使用

ufw route allow

ufw route 允许从 1.2.3.4 到任何端口 9443 的 proto tcp