引入br_netfilter​模块

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

[root@openEuler ~]# modprobe br_netfilter

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

lsmod | grep br_netfilter

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

image

重启机器后加载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