一、概述

接上篇网络虚拟化之虚拟网卡技术veth再来看看虚拟交换机技术Linux Bridge。

几个核心点:

1.veth只能成对出现,多对多就需要一个交换机

2.Linux Bridge覆盖物理交换机所有功能

3.Linux Bridge比物理交换机多一个转发本机协议栈的数据包

4.单IP的主机上多个容器可以通过Bridge与外部通讯,此时主机扮演路由器角色实现SNAT和DNAT转换

二、核心原理

有了虚拟网卡,很自然也会联想到让网卡接入到交换机里,实现多个容器间的相互连接。Linux Bridge 便是 Linux 系统下的虚拟化交换机,虽然它以“网桥”(Bridge)而不是“交换机”(Switch)为名,然而使用过程中,你会发现 Linux Bridge 的目的看起来像交换机,功能使用起来像交换机、程序实现起来也像交换机,实际就是一台虚拟交换机。Linux Bridge 是在 Linux Kernel 2.2 版本开始提供的二层转发工具,由 brctl 命令创建和管理。Linux Bridge 创建以后,便能够接入任何位于二层的网络设备,无论是真实的物理设备(譬如 eth0)抑或是虚拟的设备(譬如 veth 或者 tap)都能与 Linux Bridge 配合工作

Linux Bridge 允许给自己设置 IP 地址,比普通交换机多出一种特殊的转发情况:
如果数据包的目的 MAC 地址为网桥本身,并且网桥有设置了 IP 地址的话,那该数据包即被认为是收到发往创建网桥那台主机的数据包,此数据包将不会转发到任何设备,而是直接交给上层(三层)协议栈去处理。通过这种方式可以实现连接到Linux bridge的设备与外部通信,主机扮演路由器角色。

三、使用示例

1.用iproute2创建一个bridge:

sudo ip link add name mbr0 type bridge
sudo ip link set mbr0 up

ifconfig可以看到这个设备

ifconfig

br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::2c0a:ceff:fe21:d304  prefixlen 64  scopeid 0x20<link>
        ether 2e:0a:ce:21:d3:04  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 656 (656.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

新建一个bridge时,它是一个独立的网络设备,只有一个端口连着协议栈,其它的端口啥都没连,这样的bridge没有任何实际功能。注意此时的Mac地址!

2.将bridge和veth设备相连

上篇网络虚拟化之虚拟网卡技术veth 中创建过一对veth设备,并配置上IP

sudo ip link add veth0 type veth peer name veth1
sudo ip addr add 10.1.1.100/24 dev veth0
sudo ip addr add 10.1.1.101/24 dev veth1
sudo ip link set veth0 up
sudo ip link set veth1 up

将veth0连上mbr0

sudo ip link set dev veth0 master mbr0

再次ifconfig看一下:

mbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::2c0a:ceff:fe21:d304  prefixlen 64  scopeid 0x20<link>
        ether 92:53:19:cf:65:d4  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 656 (656.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

mbr0的Mac地址变了,变成veth0的Mac地址。

通过bridge link命令可以看到mbr0上连接了哪些设备

sudo bridge link

网络连接如下:

5: veth5479fd5 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master docker0 state forwarding priority 32 cost 2
17: veth0 state UP @veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2

(本机还有另外一个veth,忽略。)

先来测试下通过veth0能否连接上veth1。

ping 10.1.1.101 -I veth0
PING 10.1.1.101 (10.1.1.101) from 10.1.1.100 veth0: 56(84) bytes of data.
^C
--- 10.1.1.101 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

结果是没通!

veth0抓包如下:

sudo tcpdump -n -i veth0 -v
tcpdump: listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:35:10.736503 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.1.1.101 tell 10.1.1.100, length 28
17:35:10.736537 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28
17:35:11.738057 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.1.1.101 tell 10.1.1.100, length 28
17:35:11.738103 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28
17:35:12.740059 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.1.1.101 tell 10.1.1.100, length 28
17:35:12.740143 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28

veth1抓包如下:

sudo ip netns exec test-yao tcpdump -n -i veth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1, link-type EN10MB (Ethernet), capture size 262144 bytes
17:35:10.736516 ARP, Request who-has 10.1.1.101 tell 10.1.1.100, length 28
17:35:10.736536 ARP, Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28
17:35:11.738069 ARP, Request who-has 10.1.1.101 tell 10.1.1.100, length 28
17:35:11.738103 ARP, Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28
17:35:12.740122 ARP, Request who-has 10.1.1.101 tell 10.1.1.100, length 28
17:35:12.740142 ARP, Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28

都存在ARP包,并且回复了mac地址。

虚拟交互机mbr0的包数据:

sudo tcpdump -n -i mbr0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on mbr0, link-type EN10MB (Ethernet), capture size 262144 bytes17:41:25.954578 ARP, Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28
17:41:26.956075 ARP, Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28
17:41:27.958091 ARP, Reply 10.1.1.101 is-at 82:ed:5e:ed:4f:94, length 28

mbr0收到了所有的ARP的Reply,但是并没有往协议栈发送,所以ping进程并读不到Mac就通信失败了。

结论:mbr0拦截在veth0和协议栈之间,将veth0本来要转发给协议栈的数据给拦截了,全部转发给bridge了,同时mbr0也可以向veth0发数据。

上面提到过如果mbr0不配置IP是不能转发数据包给协议栈了,在这种情况,通过veth0来ping veth1当然就不通了。

接下来给虚拟交换机mbr0配置上IP,可以配置成跟veth0一致试试。因为veth0已经不会从协议栈接收和发送数据,而是通过mbr0,veth0只负责连接mbr0和veth1,退化成一根网线。

sudo ip addr add 10.1.1.100/24 dev mbr0

看下路由表信息:

route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 veth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 mbr0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0
172.1.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.2.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

为避免veth0路由影响建议删除:sudo ip addr del 10.1.1.100/24 dev veth0

此时通过mbr0来访问veth1,试验一下:

ping 10.1.1.101 -I mbr0
PING 10.1.1.101 (10.1.1.101) from 10.1.1.100 mbr0: 56(84) bytes of data.
64 bytes from 10.1.1.101: icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from 10.1.1.101: icmp_seq=2 ttl=64 time=0.107 ms
64 bytes from 10.1.1.101: icmp_seq=3 ttl=64 time=0.108 ms

成功啦!

PS: 此时直接ping 101地址,不指定mbr0也是可以通的;在未配置IP前也是不通的。

可以创建很多veth pair,一端都连在同一个bridge上,另一端连在容器里,这样就可以互相通讯,解决同一台主机上多个容器间的通讯问题。如果bridge指定IP后,主机可以访问容器内,容器内可以访问主机和外部。

网络虚拟化之虚拟交换机技术Linux Bridge相关推荐

  1. 服务器栈虚拟交换机,FusionSphere分布式虚拟交换机技术白皮书1.docx

    DOCPROPERTY "Product Project Name" 华为FusionSphere DOCPROPERTY DocumentName 分布式虚拟交换机技术白皮书 S ...

  2. 网络虚拟化——QEMU虚拟网卡

    写在前面 网络虚拟化曾经只是内核虚拟化功能开发者才会关注的技术.但随着云计算模式和云原生概念的推广,云上业务的部署形态都已转向了虚拟机和容器,而两者都依赖网络虚拟化技术提供高性能网络功能,因此虚拟网络 ...

  3. esxi 虚拟交换机上行链路_【热门技术】网络虚拟化的基石交换机堆叠与集群

    点击蓝字关注我们 //一 交换机的堆叠iStack和集群CSS 1- iStack iStack,全称Intelligent Stack--智能堆叠,是指将多台支持堆叠特性的交换机设备组合在一起,从逻 ...

  4. Linux 虚拟化网络技术 — KVM + Linux Bridge 的网络虚拟化解决方案

    目录 文章目录 目录 KVM 虚拟机应用 Linux Bridge + VLAN 实现网络隔离 TSG: Failed to restart network KVM 虚拟机应用 Linux Bridg ...

  5. 从 Bridge 到 OVS,深度探索虚拟交换机

    Linux Bridge 和物理网络一样,虚拟网络要通信,必须借助一些交换设备来转发数据.因此,对于网络虚拟化来说,交换设备的虚拟化是很关键的一环. 上文网络虚拟化已经大致介绍了 Linux 内核为了 ...

  6. 虚拟化架构下虚拟交换机和分布式虚拟交换机解析

    在VMware vSphere虚拟化架构下服务器可以虚拟出交换机来供虚拟机使用,虚拟交换机可分为两种,vSwitch虚拟交换机和vNetwork分布式虚拟交换机. 虚拟交换机vSwitch由ESXI内 ...

  7. 删除Windows中隐藏的物理网卡和网络虚拟化失败后的虚拟网卡

    Windows环境下,在更换硬件服务器主板和网卡等硬件.恢复操作系统或者网络虚拟化失败后,可能会出现网卡方面的问题.例如,设备管理器中多了不应该存在的网卡:因命名冲突无法重命名当前网络连接:IP地址冲 ...

  8. 一台服务器虚拟交换机,虚拟化架构下虚拟交换机和分布式虚拟交换机解析

    vNetwork分布式虚拟交换机其实就是将几台ESX服务器的虚拟交换机合并成一个大的虚拟交换机,所有的客户端都接入到这个大的交换机中,适合于大规模的网络部署. 如图示: vNetwork分布式虚拟交换 ...

  9. 华为dra路由方式分为relay和proxy_华为云计算(3)——网络虚拟化

    ​关注微信公众号IT小组,获取更多干货知识~ 一.网络虚拟化 网络虚拟化在介绍网络虚拟化之前,需要考虑一个问题--为什么需要网络虚拟化呢?之所以要对网络进行虚拟化,是因为在没有进行虚拟化之前,每个服务 ...

  10. 从SDN鼻祖Nicira到VMware NSX 网络虚拟化平台的简单探讨

    以前的大二层技术,一般是在物理网络底层使用IS-IS路由技术,再在此基础之上,实现数据中心网络的二层扩展,如公有的Trill.SPB技术和Cisco私有的OTV.Fabricpath技术:前沿一些的网 ...

最新文章

  1. 关闭swap的危害——一旦内存耗尽,由于没有SWAP的缓冲,系统会立即开始OOM
  2. PetClinic 没有分页功能
  3. 当一个程序员真正掌握算法之后,会变得有多强...
  4. linux终端vim底行模式点冒号,Vim基本使用方法
  5. (王道408考研操作系统)第二章进程管理-第二节3:调度算法详解1(FCFS、SJF和HRRN)
  6. 看完这篇文章,还说自己不会使用Zookeeper命令吗
  7. Python输出帮助文档的方法及命令详解
  8. C++网络编程实例2(socket)
  9. 数字电子钟设计(基于quartus软件)
  10. Chrome版本下载
  11. 985硕士程序员年薪80万!邻居眼中不如一个老师?你怎么看?
  12. WordPress二次元博客主题模板-Sakurairo v2.5.1.1
  13. wxPython 俄罗斯方块游戏
  14. java在web里被禁用_JavaWEB_Session被禁用的后果和解决方法
  15. mangos新手教程 - 服务器配置文件中文说明
  16. 掌握这些核心算法,拿不到10个offer你来找我,我锤你个不争气的
  17. 【分层实验框架】阿里妈妈大规模在线分层实验实践
  18. python--计数算法
  19. Python 专用类方法
  20. 【2019】【1080P】【动作/奇幻/冒险】《地狱男爵:血皇后崛起》 Hellboy

热门文章

  1. 移动安全-IOS逆向第三天——实战HOOK RSA/DES加密
  2. matlab工程热力学大程序,西安交通大学工程期末编程大作业(完整版
  3. 神经网络模型应用实例SPSS - 典型的神经网络模型 - 神经网络模型的应用
  4. 抖音海外版tiktok404 amp; 简洁国际版apk
  5. *明确插件的功效*千千静听听音效插件使用介绍及相关下载
  6. windows 10 下载工具
  7. 谢尔宾斯基三角形——python递归
  8. 北理复试上机题2010年
  9. Linux 优秀软件资源大全中文版
  10. excel怎么将英文小写转大写