Bridge
Bridge
bridge一般叫网桥,它也是一种虚拟网络设备,所以具有虚拟网络设备的特征,可以配置 IP、MAC 地址等。与其他虚拟网络设备不同的是,bridge 是一个虚拟交换机,和物理交换机有类似的功能。bridge 一端连接着协议栈,另外一端有多个端口,数据在各个端口间转发是基于 MAC 地址。
bridge 可以工作在二层(链路层),也可以工作在三层(IP 网路层)。默认工作在二层。默认情况下,其工作在二层,可以在同一子网内的的不同主机间转发以太网报文;当给 bridge 分配了 IP 地址,也就开启了该 bridge 的三层工作模式。在 Linux 下,你可以用iproute2或 brctl命令对 bridge 进行管理。
创建 bridge 与创建其他虚拟网络设备类似,只需要制定 type 为 bridge:
|
|
但是这样创建出来的 bridge 一端连接着协议栈,其他端口什么也没有连接,因此我们需要将其他设备连接到该 bridge 才能有实际的功能。
|
|
事实上,一旦 br0 和 veth0 连接后,它们之间将变成双向通道,但是内核协议栈和 veth0 之间变成了单通道,协议栈能发数据给 veth0,但 veth0 从外面收到的数据不会转发给协议栈 ,同时 br0 的 MAC 地址变成了 veth0 的 MAC 地址。我们可以验证一下:
|
|
如果我们使用 tcpdump 在 br0 上抓包就会发现:
|
|
可以看到 veth0 收到应答包后没有给协议栈,而是直接转发给 br0,这样协议栈得不到 veth1 的 mac 地址,从而 ping 不通。br0 在 veth0 和协议栈之间数据包给拦截了。但是如果我们给 br 配置 IP,会怎么样呢?
|
|
这样,网络结构就变成了下面这样:
这时候再通过 br0 来 ping 一下 veth1,会发现结果可以通:
|
|
其实当去掉 veth0 的 IP 地址,而给 br0 配置了 IP 之后,协议栈在路由的时候不会将数据包发给 veth0,为了表达更直观,我们协议栈和 veth0 之间的连接线去掉,这时候的 veth0 相当于一根网线。
在现实中,bridge 常用的使用场景:
虚拟机
典型的虚拟机网络实现就是通过 TUN/TAP 将虚拟机内的网卡同宿主机的 br0 连接起来,这时 br0 和物理交换机的效果类似,虚拟机发出去的数据包先到达 br0,然后由 br0 交给 eth0 发送出去,这样做数据包都不需要经过 host 机器的协议栈,运行效率非常高。
容器
而对于容器网络来说,每个容器的网络设备单独的网络命名空间中,所以很好地不同容器的协议栈,我们在接下来的笔记中进一步讨论不同的容器实现。
参考资料
-
No backlinks found.