本文最后更新于 2025-07-13,文章内容可能已经过时。

引入 br_netfilter​模块

首先引入 br_netfilter​模块,该模块将桥接流量转发到 iptables​。

[root@openEuler ~]# modprobe br_netfilter

可以使用下面的命令验证是否成功引入 br_netfilter​模块。

lsmod | grep br_netfilter

如果出现结果则说明该模块已成功导入。

重启机器后加载 br_netfilter​模块

由于模块会在服务器重启后失效,所以需要写个 Shell 脚本实现系统启动时加载内核模块。

新建 /etc/rc.sysinit​文件,然后编写 Shell 脚本

#!/bin/bash

for file in /etc/sysconfig/modules/*.modules
do
[ -x $file ] && $file
done

这段脚本代码首先遍历 /etc/sysconfig/modules/​目录下所有后缀为.modules​的文件,然后 [ -x $file ]​是查找目录下所有的可执行文件,&& $file​是执行查找到的所有可执行文件。

然后在 /etc/sysconfig/modules/​目录下新建 br_netfilter.modules​文件,内容为

modporbe br_netfilter

然后给予该文件 755 权限,确保其可被执行

chmod 755 /etc/sysconfig/modules/br_netfilter.modules

验证

可以直接重启服务器后,输入 lsmod | grep br_netfilter ​验证是否启动时添加,也可以使用 moprobe -r br_netfilter ​卸载掉 br_netfilter​模块,然后运行 /etc/rc.sysinit​脚本,然后再使用 lsmod | grep br_netfilter ​验证脚本是否正常。

修改内核参数

修改内核参数开启转发,在 /etc/sysctl.d/docker.conf​文件(默认没有的)中填写配置。

cat > /etc/sysctl.d/docker.conf << EOF
> net.bridge.bridge-nf-call-ip6tables =1
> net.bridge.bridge-nf-call-iptables =1
> net.ipv4.ip_forward = 1
> EOF

net.ipv4.ip_forward = 1

将系统作为路由或者 VPN 服务时必须要开启 IP 转发功能,当 linux 主机有多个网卡时,一个网卡收到的数据会转发到其他网卡,实现 VxLAN(Virtual eXtensible LAN,虚拟可扩展局域网)功能,不开启会导致 docker 部署的应用无法访问。

VxLAN 是一种“在三层网络中跑二层网络”的封装协议,让不同主机的虚拟机 / 容器像在同一个局域网里一样通信,且可以支持大规模部署。

然后需要重新加载内核参数才是生效,使用下述命令将新配置的内核参数重新加载。

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

然后重启 docker 即可生效

systemctl restart docker