数据包过滤与防火墙
在 Linux 上,Docker 会创建防火墙规则来实现网络隔离、端口发布和过滤。
由于这些规则是 Docker 桥接网络正常运行所必需的,因此您不应修改 Docker 创建的规则。
本页介绍控制 Docker 防火墙规则的选项,这些规则用于实现端口发布以及 NAT/伪装等功能。
NoteDocker 会为桥接网络创建防火墙规则。
不会为
ipvlan、macvlan或host网络创建规则。
防火墙后端
默认情况下,Docker Engine 使用 iptables 创建其防火墙规则,参见 Docker 与 iptables。它也支持 nftables,参见 Docker 与 nftables。
对于桥接网络,iptables 和 nftables 具有相同的功能。
可以使用 Docker Engine 选项 firewall-backend 来选择使用 iptables 还是 nftables。参见 守护进程配置。
路由器上的 Docker
在 Linux 上,Docker 需要在主机上启用“IP 转发”。因此,如果启动时尚未启用,它会启用 sysctl 设置 net.ipv4.ip_forward 和 net.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 操作防火墙规则
在守护进程配置中将 iptables 或 ip6tables 键设置为 false,将阻止 Docker 创建其大部分 iptables 或 nftables 规则。但是,此选项不适合大多数用户,它可能会破坏 Docker Engine 的容器网络。
例如,如果禁用了 Docker 防火墙且没有替换规则,桥接网络中的容器将无法通过伪装访问互联网主机,但其所有端口都将对本地网络上的主机可访问。
无法完全阻止 Docker 创建防火墙规则,并且事后创建规则非常复杂,超出了本文档的范围。
与 firewalld 集成
如果您在运行 Docker 时将 iptables 或 ip6tables 选项设置为 true,并且您的系统上启用了 firewalld,那么除了其通常的 iptables 或 nftables 规则外,Docker 还会创建一个名为 docker 的 firewalld 区域,其目标为 ACCEPT。
Docker 创建的所有桥接网络接口(例如 docker0)都会被插入到 docker 区域中。
Docker 还会创建一个名为 docker-forwarding 的转发策略,该策略允许从 ANY 区域到 docker 区域的转发。
Docker 与 ufw
Uncomplicated Firewall (ufw) 是一个随 Debian 和 Ubuntu 附带的前端,用于管理防火墙规则。Docker 和 ufw 使用防火墙规则的方式使它们彼此不兼容。
当您使用 Docker 发布容器的端口时,进出该容器的流量在经过 ufw 防火墙设置之前就会被转移。Docker 在 nat 表中路由容器流量,这意味着数据包在到达 ufw 使用的 INPUT 和 OUTPUT 链之前就被转移了。数据包在防火墙规则应用之前就被路由了,从而有效地忽略了您的防火墙配置。