码头工人跨主机网络,手册

  

1。Macvlan简介

  

在Macvlan出现之前,我们只能为一块以太网卡添加多个IP地址,却不能添加多个MAC地址,因为MAC地址正是通过其全球唯一性来标识一块以太网卡的,即便你使用了创建ethx: y这样的方式,你会发现所有这些“网卡”的MAC地址和ethx都是一样的,本质上,它们还是一块网卡,这将限制你做很多二层的操作。有了Macvlan技术,你可以这么做了。

  

Macvlan允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络接口有自己独立的MAC地址,也可以配置上IP地址进行通信.Macvlan下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域.Macvlan和桥比较相似,但因为它省去了桥的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,Macvlan自身也完美支持VLAN。

  

同一VLAN间数据传输是通过二层互访,即MAC地址实现的,不需要使用路由。不同VLAN的用户单播默认不能直接通信,如果想要通信,还需要三层设备做路,由Macvlan也是如此。用Macvlan技术虚拟出来的虚拟网卡,在逻辑上和物理网卡是对等的。物理网卡也就相当于一个交换机,记录着对应的虚拟网卡和MAC地址,当物理网卡收到数据包后,会根据目的MAC地址判断这个包属于哪一个虚拟网卡。这也就意味着,只要是从Macvlan子接口发来的数据包(或者是发往Macvlan子接口的数据包),物理网卡只接收数据包,不处理数据包,所以这就引出了一个问题:本机Macvlan网卡上面的IP无法和物理网卡上面的IP通信!关于这个问题的解决方案我们下一节再讨论。
码头工人跨主机网络,手册》> <br/>简单来说,Macvlan虚拟网卡设备是寄生在物理网卡设备上的。发包时调用自己的发包函数,查找到寄生的物理设备,然后通过物理设备发包。收包时,通过注册寄生的物理设备的rx_handler回调函数,处理数据包。</p>
  <h2> 2。简单介绍手册的流程</h2>
  <p> macvlan就如它的名字一样,是一种网卡虚拟化技术,它能够将一个物理网卡虚拟出多个接口,每个接口都可以配置MAC地址,同样每个接口也可以配自己的IP,每个接口就像交换机的端口一样,可以为它划分VLAN。</p>
  <p> macvlan的做法其实就是将这些虚拟出来的接口与码头工人容器直连来达到通信的目的。一个macvlan网络对应一个接口,不同的macvlan网络分配不同的子网,因此,相同的macvlan之间可以互相通信,不同的macvlan网络之间在二层上不能通信,需要借助三层的路由器才能完成通信,如下,显示的就是两个不同的macvlan网络之间的通信流程。<br/> <img src=
我们用一个Linux主机,通过配置其路由表和iptables,将其配成一个路由器(当然是虚拟的),就可以完成不同macvlan网络之间的数据交换,当然用物理路由器也是没毛病的。

  

3。Macvlan的特点:

  

1。可让使用者在同一张实体网卡上设定多个MAC地址。
2。承上,带有上述设定的MAC地址的网卡称为子接口(子接口),而实体网卡则称为父接口(父接口)。
3。父接口可以是一个物理接口(eth0),可以是一个802.1 q的子接口(eth0.10),也可以是成键接口。
4。可在父/子界面上设定的不只是MAC地址,IP地址同样也可以被设定。
5。子接口无法直接与父接口通讯(带有子接口的虚拟机或容器无法与主机直接通讯)。
承上,若VM或容器需要与主机通讯,那就必须额外建立一个下标6.接口给主机用。
7。子接口通常以mac0@eth0的形式来命名以方便区別。
用张图来解释一下设定Macvlan后的样子:

  

码头工人跨主机网络,手册》> </p>
  <h2> 4。实验环境</h2>
  
  
  
  docker01
  docker02
  
  
  
  
  192.168.1.11
  192.168.1.13
  
  
  
  <p> <>强关闭防火墙和禁用selinux,更改主机名</强> </p>
  <pre> <代码> [root@localhost ~] # hostnamectl set-hostname docker01
  root@localhost ~ # su -
  上一次登录:二2019年12月17日08:20:36 CST从192.168.1.1pts/0上
  (root@docker01 ~) # systemctl firealld停止
  未能阻止firealld。服务:firealld单位。服务不加载。
  (root@docker01 ~) # setenforce 0
  setenforce: SELinux是禁用的
  (root@docker01 ~) # systemctl daemon-reload
  (root@docker01 ~) # systemctl重启码头工人</代码> <h2 class=码头工人跨主机网络,手册