滴普技术荟 - 云原生基座 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/
版权声明: 本文为 InfoQ 作者【滴普科技2048实验室】的原创文章。
原文链接:【http://xie.infoq.cn/article/175ca77657202fa150c84ec0a】。文章转载请联系作者。
评论