docker info 显示 bridge-nf-call-iptables 禁用的处理

树莓派Raspberry Pi OS(64位)安装Docker 完成后(实际上很多 Linux环境安装Docker 都会遇到),执行 docker info 检查会看到如下警告:

docker info 显示 bridge-nf-call-iptables 被禁止的警告
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

这个警告实际上是 预期特性 :

  • bridge-nf-call-iptables 内核参数控制穿过网桥 bridge 的数据包是否由host主机系统上的 iptables 规则处理。通常不建议启用这个选项:

    • 启用 bridge-nf-call-iptables 内核参数( 1 ) 可能 会导致 容器流量 被针对host主机的iptables规则阻止(出现不可预测的行为,通常容器不希望流量收到主机级别防火墙干扰/保护)

    • 这也是为何 libvirt 网桥型网络 要求 禁止 bridge-nf-call-iptables 内核参数( 0 ),否则可能因为host主机配置了iptables防火墙(默认netfilter激活在bridge上会通过FORWARD规则过滤掉bridge上主机之间流量),导致bridge模式连接到 br0 的虚拟机之间网络不能互通

/etc/sysctl.d/bridge.conf 禁止bridge设备的netfilter
cat << EOF > /etc/sysctl.d/bridge.conf
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0 
net.bridge.bridge-nf-call-arptables=0
EOF

sysctl -p /etc/sysctl.d/bridge.conf
  • KVM / Libvirt虚拟机管理器 环境中,要求 禁止 bridge-nf-call-iptables 内核参数( 0 ),是因为希望在虚拟机内部管理网络过滤,防止host主机iptables FORWARD 影响虚拟机 libvirt 网桥型网络

  • Docker 容器环境中,要求 启用 bridge-nf-call-iptables 内核参数( 1 ),是因为容器内部不能通过 iptables 控制内核过滤规则,需要借助host主机iptables来管理容器网络。

Docker环境启用 bridge-nf-call-iptables (内核参数 1 )

libvirt 网桥型网络 配置相反(方法可借鉴),执行以下命令为Docker的host主机启用 bridge-nf-call-iptables (内核参数 1 ):

启用 bridge-nf-call-iptables (内核参数 1 )
cat << EOF > /etc/sysctl.d/bridge.conf
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF

sysctl -p /etc/sysctl.d/bridge.conf

br_netfilter 内核模块(提供 bridge-nf-call-iptables 入口)

我在 树莓派Raspberry Pi 5 上的 Raspbery Pi OS(Raspbian) 遇到如下报错:

ARM架构的 Raspbery Pi OS(Raspbian) 提示报错显示没有 bridge-nf-call-iptables 内核参数入口
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

这个内核入口错误是因为内核没有加载 br_netfilter 模块导致的,所以修正如下:

加载 br_netfilter 内核模块
modprobe br_netfilter
echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf

参考