写点什么

滴普技术荟 - 云原生基座 OpenKube 开放容器实践(三):理解 linux 虚拟网络设备 bridge

发布于: 2021 年 01 月 26 日
滴普技术荟-云原生基座OpenKube开放容器实践(三):理解linux虚拟网络设备bridge

前言

 

上一节我们介绍了 Linux veth 设备,了解了如何把多个独立网络命名空间(下面开始简称 NS)与主机互通,并且多个 NS 间也能相互通信,在这一节我们将介绍另一种方式,用 linux bridge。

 

linux bridge

 

Linux bridge 即 linux 虚拟网桥,工作方式类似于物理的网络交换机,工作在二层时,能够转发以太网报文,能够学习 MAC 地址与端口的映射关系,下面通过一些示例来了解一下。我们将通过 linux bridge 连接两个 NS,通过下面的命令可以创建一个 linux bridge 并启动:

 


接下来我们创建两个新的 NS 和两对 linux veth 网卡:

 


接下来就是把主机这边的两个端都插到 bridge 上:

 


就这样两个 NS 就可以相互 PING 通了,因为是相同网段,所以暂不需要默认网关,又因为 linux bridge 会广播 ARP 请求,NS1 的协议栈能通过 ARP 广播拿到 NS2 中网卡的 MAC 地址。

但是此时在主机上 ping 两个 ns 反而是 ping 不通的,因为主机不知道怎么去 192.168.10.0/24 网段,所以先给主机加条路由:

 


注意主机的这条路由针对的是整个网段 192.168.10.0/24,就是说后面如果继续加新的 NS,只要 IP 还在这个段内,就不用再增加主机路由了。

来看一下现状:

 


主机加了路由后,从主机 ping ns1 还是不行,应该是 ns1 缺默认网关,所以不知道怎么回这个包,看一下当前 NS1 中的路由信息:

 


这条路由是我们在给 veth0 设置 ip 的时候由系统自动生成的。

 

我们给 ns1 和 ns2 都加个默认路由,然后打开 br0 的 arp 代答:

 


这时候应该就 ping 得通了。

 

为什么给 ns1 和 ns2 设置的默认网关是 169.2.2.2?这个在上一章有解释过了,想了解的话请看回上一章的内容

 

区别

 

到目前为止我们介绍了两种在同个主机连接多个 ns 的方法,现在来介绍一下两种方法异同点:如果只是用 veth 连接,就是单纯地把主机当成路由器,两个 ns 之间的通信数据包都是要走主机协议栈的三层转发流程的,如图 1 所示:

 


而用 bridge 的方式,则在二层直接把数据包就从 ns1 转到了 ns2,没有再走主机协议栈的三层,如图 2 所示:

 


这个我们可以用如下方式求证,用 bridge 的情况下,关掉主机的路由转发功能:

 


然后你会发现 ns1 中 ping ns2 其实还是可以 ping 通的。

 

那这样一来,主机的防火墙策略岂不是没用了?k8s 的网络策略就是在主机的 iptables 规则中来控制的,为了让这个规则生效,还是有办法的,可以让经过 linux bridge 的数据包也过一遍 iptabls 规则:

 


开启了这个参数,数据包还是没有经过主机的协议栈的三层处理,只是 linux bridge 的__br_forward 方法中显式地调用了 NF_HOOK(NFPROTO_BRIDGE, NF_BR_FORWARD,net, NULL, skb, indev, skb->dev,br_forward_finish)


代码在:/net/bridge/br_forward.c

这时候在主机的 iptables 防火墙里增加一个过滤规则,把数据包全拦截掉:

 


然后 ns1 就 ping 不通 ns2 了。

 

总结

前面介绍的 linux veth 和 linux bridge 主要是用于完成同主机容器的相互通信,下一章我们来介绍一下如何配置跨主机的容器通信。

 

linux bridge 不能跨网络命名空间,所以不要尝试把 br0 转到 ns1 中,下面的命令会报错


ip link set br0 netns ns1


RTNETLINK answers: Invalid argument


凡是 netns-local 为 on 的设备都不能跨网络命名空间,像 loopback/vxlan/bridge,用下面的命名可以查看 eth0 的 netns-local 的值


ethtool -k eth0|grep netns-local

 

更多信息欢迎关注滴普科技官网 www.deepexi.com

 

作者:刘海峰,IT 行业资深码农,从事.net/java/go 语言开发十余年,长期关注 springcloud/k8s/linux 网络相关的技术。

 

了解更多详情请登录:https://www.deepexi.com/

 

发布于: 2021 年 01 月 26 日阅读数: 15
用户头像

还未添加个人签名 2020.12.22 加入

滴普科技2048实验室致力于探索科技未知,以点滴努力,普惠科技为驱动力,立足于数据智能、创新性技术和应用技术的研究院。

评论

发布
暂无评论
滴普技术荟-云原生基座OpenKube开放容器实践(三):理解linux虚拟网络设备bridge