数据包过滤与防火墙

在 Linux 上,Docker 会创建防火墙规则来实现网络隔离、端口发布和过滤。

由于这些规则是 Docker 桥接网络正常运行所必需的,因此您不应修改 Docker 创建的规则。

本页介绍控制 Docker 防火墙规则的选项,这些规则用于实现端口发布以及 NAT/伪装等功能。

Note

Docker 会为桥接网络创建防火墙规则。

不会为 ipvlanmacvlanhost 网络创建规则。

防火墙后端

默认情况下,Docker Engine 使用 iptables 创建其防火墙规则,参见 Docker 与 iptables。它也支持 nftables,参见 Docker 与 nftables

对于桥接网络,iptables 和 nftables 具有相同的功能。

可以使用 Docker Engine 选项 firewall-backend 来选择使用 iptables 还是 nftables。参见 守护进程配置

路由器上的 Docker

在 Linux 上,Docker 需要在主机上启用“IP 转发”。因此,如果启动时尚未启用,它会启用 sysctl 设置 net.ipv4.ip_forwardnet.ipv6.conf.all.forwarding。执行此操作时,它还会配置防火墙以丢弃转发的数据包,除非它们被显式接受。

当 Docker 将默认转发策略设置为“丢弃”(drop)时,它将阻止您的 Docker 主机充当路由器。这是在启用 IP 转发时的推荐设置,除非需要路由器功能。

要阻止 Docker 将转发策略设置为“丢弃”,请在 /etc/docker/daemon.json 中包含 "ip-forward-no-drop": true,或者在 dockerd 命令行中添加选项 --ip-forward-no-drop

Note

使用实验性的 nftables 后端时,Docker 不会自己启用 IP 转发,也不会创建默认的“丢弃” nftables 策略。参见 从 iptables 迁移到 nftables

阻止 Docker 操作防火墙规则

守护进程配置中将 iptablesip6tables 键设置为 false,将阻止 Docker 创建其大部分 iptablesnftables 规则。但是,此选项不适合大多数用户,它可能会破坏 Docker Engine 的容器网络。

例如,如果禁用了 Docker 防火墙且没有替换规则,桥接网络中的容器将无法通过伪装访问互联网主机,但其所有端口都将对本地网络上的主机可访问。

无法完全阻止 Docker 创建防火墙规则,并且事后创建规则非常复杂,超出了本文档的范围。

与 firewalld 集成

如果您在运行 Docker 时将 iptablesip6tables 选项设置为 true,并且您的系统上启用了 firewalld,那么除了其通常的 iptables 或 nftables 规则外,Docker 还会创建一个名为 dockerfirewalld 区域,其目标为 ACCEPT

Docker 创建的所有桥接网络接口(例如 docker0)都会被插入到 docker 区域中。

Docker 还会创建一个名为 docker-forwarding 的转发策略,该策略允许从 ANY 区域到 docker 区域的转发。

Docker 与 ufw

Uncomplicated Firewall (ufw) 是一个随 Debian 和 Ubuntu 附带的前端,用于管理防火墙规则。Docker 和 ufw 使用防火墙规则的方式使它们彼此不兼容。

当您使用 Docker 发布容器的端口时,进出该容器的流量在经过 ufw 防火墙设置之前就会被转移。Docker 在 nat 表中路由容器流量,这意味着数据包在到达 ufw 使用的 INPUTOUTPUT 链之前就被转移了。数据包在防火墙规则应用之前就被路由了,从而有效地忽略了您的防火墙配置。