陈奇网络工作室

文档跨越主机网络——手册

云计算

1. Macvlan介绍

在Macvlan出现之前,即使使用制作ethx:y的方法,所有的网卡的MAC地址和ethx都是相同的,本质上是网卡,会限制制作很多两层。 由于MAC地址在世界上是唯一的,所以无法添加多个IP地址。如果有Macvlan技术,您可以这样做。

使用Macvlan,可以在主机的单个网络接口上配置多个虚拟网络接口。 这些网络接口具有自己的MAC地址,您也可以配置用于通信的IP地址。 Macvlan下的虚拟机或容器网络和主机位于同一网段中,并共享同一个广播域。 Macvlan和Bridge比较相似,但由于省略了Bridge的存在,因此配置和调试简单,效率也相对较高。 此外,Macvlan本身也完美地支持VLAN。

同一VLAN之间的数据传输通过两层互访实现,即MAC地址,不需要使用路由。 不同VLAN的用户单播默认情况下无法直接通信。 尝试通信时,还需要三层设备进行路由。 Macvlan也是如此。 利用Macvlan技术虚拟化的虚拟网卡在逻辑上与物理网卡对等。 物理网卡相当于包含相应虚拟网卡和MAC地址的交换机,当物理网卡接收到包时,它根据目标MAC地址确定该包属于哪个虚拟网卡也就是说,若是从Macvlan端子接口发出的数据包(或发给Macvlan端子接口的数据包),物理网卡只会接收数据包,不处理数据包,所以本机的Macvlan卡这个问题的解决方案将在下一节讨论。

简而言之,Macvlan虚拟NIC设备寄生在物理NIC设备上。 下单时调用自己的下单函数,找到寄生的物理设备,然后通过物理设备下单。 在接收分组时,通过注册寄生物理设备的rx_handler回调函数来处理分组。

简单介绍手册的流程

macvlan顾名思义,是一种将一个物理网卡虚拟化到多个接口的网卡虚拟化技术,可以在每个接口上设置MAC地址。 同样,每个接口也可以有自己的IP,每个接口可以像交换机端口一样分隔VLAN。

macvlan的方法实际上是将这些虚拟化的接口直接连接到docker容器以实现通信目的。 一个macvlan网络对应一个接口,不同的macvlan网络分配不同的子网,从而可以在同一macvlan之间相互通信,不同的macvlan网络之间通过两层通信以下是两个不同的macvlan网络之间的通信流程。

我们可以用一台Linux主机,配置其路由表和iptables,将其组合在一个路由器(当然是虚拟的)上,完成不同macvlan网络之间的数据交换。 当然,使用物理路由器也没有问题。

3.Macvlan的特点:

1 .允许在同一物理网卡上设置多个MAC地址。

2 .根据情况,具有上述设定的MAC地址的网卡称为子接口( sub interface )。 物理网卡称为父接口( parent interface )。

3.parent interface可以是物理接口( eth0)或802.1q子接口( eth0.10 )或绑定接口。

parent/sub接口不仅可以设置MAC地址,还可以同样设置IP地址。

5 .子接口无法直接与parent接口通信(带有子接口的虚拟机或容器无法直接与主机通信)。

是的,如果虚拟机或容器需要与主机进行通信,则必须为主机创建其他sub 6.interface。

7.sub interface通常以mac0@eth0的形式命名以便于区分。

用图说明设置Macvlan后的情况:

4 .实验环境

文档01

文档02

192.168.1.11

192.168.1.13

关闭防火墙,禁用selinux并更改主机名

[ root @ localhost~] # hostnamectlset-hostname docker 01

[root@localhost ~]# su -

上次登录:二12月1708:20:36 CST 2019192.168.1.1 pts/0至

[ root @ docker 01~] # systemctlstopfirealld

failedtostopfirealld.service:unitfirealld.servicenotloaded。

[root@docker01 ~]# setenforce 0

setenforce: SELinux is disabled

[ root @ docker 01~] # systemctldaemon-reload

[ root @ docker 01~] # systemctlrestartdocker

4.1 macvlan的单网络通信

1 )打开网卡混合模式

必须同时在docker01和docker02_上操作。

[ root @ docker 01~] # iplinkshowens 33

//查看网卡模式

[ root @ docker 01~] # iplinksetens 33 promisc on

//NIC创建模式为混合模式

[ root @ docker 01~] # iplinkshowens 33

//查看网卡模式

2 )在docker01 .中创建macvlan网络

[ root @ docker 01~~ ] # dockernetworkcreate-dmac VLAN-- subnet 172.22.16.0/24-- gateway 172.22.16.1-o pareparer

制作macvlan模式的网络

-o parent=绑定在哪个网卡上

[ root @ docker 01~] # dockernetworkls

//查看网卡信息

3 )基于创建的macvlan网络运行容器

[ root @ docker 01~] # docker run-itdname bbox 1IP 172.22.16.10network MAC _ net1 busybox

4 )在docker02 .上创建macvlan网络(与docker01的macvlan一模一样) )。

[ root @ docker 02~~ ] # dockernetworkcreate-dmac VLAN-- subnet 172.22.16.0/24-- gateway 172.22.16.1-o pareparer

[ root @ docker 02~~ ] # dockernetworkls

5 )在docker02 .上,基于创建的macvlan网络运行容器,并验证与docker01 .上的容器的通信。

[ root @ docker 02~~ ] # docker run-itd-- name bbox2--network MAC _ net1-- IP 172.22.16.20 busybox

基于busybox创建容器

[ root @ docker 02~~ ] # docker exec-it bbox2/bin/sh

进入bbox2容器

/# ping 172.22.16.10

尝试//ping docker 01的主体

4.2macvlan的多网络通信

1 )文件01和文件02验证内核模块8021q包

macvlan需要解决的问题:基于实际的ens33网卡,生产新的虚拟网卡。

[root@docker01 ~]# modinfo 8021q

//内核模块8021q软件包验证

[root@docker01 ~]# modprobe 8021q

//如果内核模块未打开,请运行上面的命令并尝试导入

2 ) docker01基于ens33创建虚拟网卡

修改ens33NIC配置文件

[ root @ docker 01~~ ] # CD/etc/sys config/network-scripts /

[ root @ docker 01net work-scripts ] # vimifcfg-ens 33

手动添加虚拟NIC配置文件

[ root @ docker 01~~ ] # CD/etc/sys config/network-scripts /

[ root @ docker 01net work-scripts ] # CP-pif CFG-ens 33 if CFG-ens 33.10

//-p保留源文件或目录的属性

[ root @ docker 01net work-scripts ] # vimifcfg-ens 33.10

修改ens33.10网卡的配置文件

BOOTPROTO=none

NAME=ens33.10

DEVICE=ens33.10

on boot=是

IPADDR=192.168.10.10

PREFIX=24

GATEWAY=192.168.10.2

VLAN=是

请注意,IP与ens33网段区分开来,保证网关和网段的IP一致性、设备名称和配置文件的一致性,并打开VLAN支持模式。

创建第二个虚拟NIC配置文件

[ root @ docker 01net work-scripts ] # CP-pif CFG-ens 33.10 if CFG-ens 33.20

[ root @ docker 01net work-scripts ] # vimifcfg-ens 33.20

更改//ens33.20NIC的配置文件

BOOTPROTO=none

NAME=ens33.20

DEVICE=ens33.20

on boot=是

IPADDR=192.168.20.20

PREFIX=24

GATEWAY=192.168.20.2

VLAN=是

使用docker01,启用创建的虚拟网卡:

[ root @ docker 01net work-scripts ] # ifupifcfg-ens 33.10

[ root @ docker 01net work-scripts ] # ifupifcfg-ens 33.20

[ root @ docker 01net work-scripts ] # ifconfig

//查看IP

3 ) docker02基于ens33创建虚拟网卡

修改ens33NIC配置文件

[ root @ docker 02~~ ] # CD/etc/sys config/network-scripts /

[ root @ docker 02 network-scripts ] # vimifcfg-ens 33

手动添加虚拟NIC配置文件

[ root @ docker 02~~ ] # CD/etc/sys config/network-scripts /

[ root @ docker 02 network-scripts ] # CP-pif CFG-ens 33 if CFG-ens 33.10

//-p保留源文件或目录的属性

[ root @ docker 02 network-scripts ] # vimifcfg-ens 33.10

修改ens33.10网卡的配置文件

BOOTPROTO=none

NAME=ens33.10

DEVICE=ens33.10

on boot=是

IPADDR=192.168.10.11

PREFIX=24

GATEWAY=192.168.10.2

VLAN=是

请注意,IP与ens33网段区分开来,保证网关和网段的IP一致性、设备名称和配置文件的一致性,并打开VLAN支持模式。

创建第二个虚拟NIC配置文件

[ root @ docker 02 network-scripts ] # CP-pif CFG-ens 33.10 if CFG-ens 33.20

[ root @ docker 02 network-scripts ] # vimifcfg-ens 33.20

更改//ens33.20NIC的配置文件

BOOTPROTO=none

NAME=ens33.20

DEVICE=ens33.20

on boot=是

IPADDR=192.168.20.21

PREFIX=24

GATEWAY=192.168.20.2

VLAN=是

使用docker02,启用创建的虚拟网卡:

[ root @ docker 02 network-scripts ] # systemctlrestartnetwork

[ root @ docker 02 network-scripts ] # ifupifcfg-ens 33.10

[ root @ docker 02 network-scripts ] # ifupifcfg-ens 33.20

[ root @ docker 02 network-scripts ] # ifconfig

//查看IP

4 ) docekr01和docker02基于虚拟网卡建立macvlan网络

[ root @ docker 02 network-scripts ] # dockernetworkcreate-dmac VLAN-- subnet 172.16.10.0/24-- gateway 172.16.17

//创建新网卡基于ens33.10

[ root @ docker 02 network-scripts ] # dockernetworkcreate-dmac VLAN-- subnet 172.16.20.0/24-- gateway 172.16.24

//创建新网卡基于ens33.20

5 ) Docker01引入私人仓库

文档01

72文档拉入注册表

下载注册镜像

73 docker run-itd---name registry-p 5000:5000-- restart=always registry:latest

基于注册镜像启动容器

76 dockertagbusybox:latest 192.168.1.11:5000/busybox:v1

//更改一个容器的名称

77文档PS

78更改vim/usr/lib/systemd/system/docker.service # 13行

execstart=/usr/bin/dockerd---- insecure-registry 192.168.1.11:5000

80系统释放

81 systemctlrestartdocker.service

重新启动文档生成器

100 docker push 192.168.1.11:5000/busybox:v1

//将集装箱上载到私人土地仓库

101文档图像

文档02

78更改vim/usr/lib/systemd/system/docker.service # 13行

execstart=/usr/bin/dockerd---- insecure-registry 192.168.1.11:5000

80系统释放

81 systemctlrestartdocker.service

重新启动文档生成器

9 docker pull 192.168.1.11/busybox:v1

//下载刚上传的镜像

6 ) docker01和docker02基于busybox:v1镜像和网卡mac_net10、mac_net20创建容器。

文档01

[ root @ docker 01~~ ] # docker run-itd-- name bbox 10-- network MAC _ net10-- IP 172.16.10.10192.168.1.11 :

[ root @ docker 01~~ ] # docker run-itd-- name bbox 20-- network MAC _ net 20-- IP 172.16.20.20192.168.1.11 :

* *文档02 * *

[ root @ docker 02~~ ] # docker run-itd-- name bbox 10-- network MAC _ net10-- IP 172.16.10.10192.168.1.11 :

[ root @ docker 02~~ ] # docker run-itd-- name bbox 20-- network MAC _ net 20-- IP 172.16.20.20192.168.1.11 :

*这里需要注意的是,这里的操作与docker01和上面的操作一模一样,操作步骤大致如下。

8021q内核包验证

ens33.10和ens33.20 (注意,docker 01 .中的ens33.10和ens33.20位于同一网段,且IP不冲突)基于此网络运行容器。 (注意: docker01上的容器基于刚创建的macvlan网络,但IP地址不能冲突。)

7 )验证

通过docker01 .进入容器bbox10和docker02 .的bbox11进行通信。

通过docker01 .进入容器bbox20和docker02 .的bbox21进行通信。

注意: VMware网络必须设置为网桥模式。

将文档01和文档02的网络模式设置为桥接模式

测试同一网卡上的主机是否可以ping

[ root @ docker 01~] # docker exec-it bbox 10/bin/sh

/# ping 172.16.20.20

[ root @ docker 02~~ ] # docker exec-it bbox 20/bin/sh

/# ping 172.16.20.20

5.Macvlan的局限性

Macvlan是将虚拟机或容器双层连接到物理网络的几乎理想方案,但存在一些限制。

1 .连接到1.Linux主机的交换机可能会限制同一物理端口上的MAC地址的数量。 您可以让网络管理员更改这些策略,但可能无法通过此方式执行。 例如,向客户进行快速的PoC演示。

2 .许多NIC对物理网卡上的MAC地址的数量也有限制。 超过此限制将影响系统性能。

3.IEEE 802.11不喜欢在同一客户端上有多个MAC地址。 这意味着Macvlan子接口无法通过无线网卡或AP进行通信。 可以用复杂的方法突破这个限制,但还有更简单的方法。 那就是使用Ipvlan,如果有兴趣的话自己查相关资料。

6 .总结

macvlan是将一个网卡虚拟化为多个网卡的网卡虚拟化技术。

在macvlan的特定通信模式中,常用的模式是bridge。

在Docker中,macvlan仅支持网桥模式。

同一macvlan可以通信,不同macvlan的第2层不能通信,可以通过第3层路由完成通信。

想想看:

macvlan bridge与bridge的区别

此外,还有一种类似的技术,即多个虚拟网卡共享同一MAC地址,但具有独立的IP地址。 这是什么技术?

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3