docker网络--多机通信--2--ipvlan
一.介绍
ipvlan的模式主要就是2种,L2和L3,L2模式和macvlan的模式很像(关于macvlan,可以参考我上一篇文章),L3模式就是在每台主机上添加路由器,转发各个endpoint 路由报文。关于本文章中提到的使用场景,如果想了解的更详细,请参考此文章。
关于IPvlan的2层模式和3层模式的具体介绍和详细解读,请参考此文章1和文章2
对于本文章中,关于实验的部分,主要是基于docker的官网,在此基础上,进行实验和进一步扩展,docker官方文档地址。对于IPvlan关于IPv6部分,因为不懂IPv6,暂时没有做任何研究。
a.使用场景
如果有几下匹配到场景那么久可以适用ipvlan
1.Linux主机连接到的外部交换机已经做了一端口一mac的绑定。
2.有创建mac个数限制/NIC处于混杂模式/性能的考虑。
3.如果slave设备放置在一个容易改变的/错误使用的二层环境里面。
b.工作模式
两种工作模式
ipvlan有两种不同的工作模式:L2和L3。一个父接口只能选择其中一种模式(不能采用混用模式),依附于它的所有虚拟接口都会运行在这个模式下。
1.L2模式
Ipvlan的L2模式和macvlan的bridge模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。
2.L3模式
L3模式下,ipvlan有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相ping通对方,因为ipvlan会在中间做报文的转发工作。
L3模式下的虚拟接口不会接收到多播或者广播的报文(ipvlan的虚拟接口会显示NOARP标志),在这个模式下,所有的网络报文都会发送给父接口,因此所有的ARP过程或者多播都是在底层的父接口完成的。需要注意的是:外部网络默认情况下是不知道ipvlan虚拟出来的网络的,如果不在外部路由器上配置好对应的路由规则,ipvlan的网络是不能被外部直接访问的。
二.实验-----L2模式单vlan跨主机通信
a.IPvlan的网络和宿主机处于同一个网络
整体拓扑图
步骤:
1.准备一台虚拟机(xwl-1),ubuntu系统,该虚拟机与宿主机通过bridge桥接到宿主机的无线网卡,网络如下图:
2.虚拟机未配置之前的状态图
3.创建ipvlan网络,使它和宿主机在同一个网络
docker network create -d ipvlan --subnet 192.168.100.0/24 --gateway 192.168.100.1 -o ipvlan_mode=l2 -o parent=enp0s3 pub_net
4.创建容器c1和c2.
docker run -itd --network pub_net --name c1 busybox
docker run -itd --network pub_net --name c2 busybox
5.验证网络情况
能够ping通内部网络的主机
能够ping通容器
能够ping通网关
能够ping通外网
b.IPvlan的网络和宿主机处于不同一个网络
整体拓扑图
步骤:
1.将上个实验的状态恢复成初始状态
2.增加一台虚拟机2,并且需要安装docker
3.在两台虚拟机上分别创建ipvlan
docker network create -d ipvlan --subnet 172.16.1.0/24 --gateway 172.16.1.1 -o ipvlan_mode=l2 -o parent=enp0s3 vlan1
在虚拟机1
在虚拟机2
4.创建4个容器
在虚拟机1
docker run -itd --network vlan1 --ip 172.16.1.2 --name c1 busybox
docker run -itd --network vlan1 --ip 172.16.1.3 --name c2 busybox
在虚拟机2
docker run -itd --network vlan1 --ip 172.16.1.4 --name c3 busybox
docker run -itd --network vlan1 --ip 172.16.1.5 --name c4 busybox
5.验证网络通信情况,因为都属于同一个网络,4个容器应该能够互相通信
在虚拟机1
在虚拟机2
c.关于–internal参数
感觉这个参数和private很像,上面关于ipvlan的internal参数解释,我是从docker官网上摘抄的,其实这段话,告诉我们三方面的信息,
第一使用场景,就是加上这个–internal参数,就相当与隔离容器网络与外部网络的任何通信,像平时所用的private网络,只能在本机的容器网络中互相访问,其他都不行
第二是用方法,就是如果在使用docker network create -d创建ipvlan时,如果不加网口的-o parent,就相当与加了–internal
第三是原理,如果未指定父接口或使用 --internal 标志,则会为用户创建一个 netlink 类型的虚拟父接口并用作有效地完全隔离网络的父接口。
下面做实验,验证一下,是否符合
整体拓扑图
步骤:
1.将上一个实验环境还原成初始状态
虚拟机1
虚拟机2
2.创建带有–internal的ipvlan网络
docker network create -d ipvlan --subnet 172.16.1.0/24 --internal vlan1
在虚拟机1
在虚拟机2
3.在两个虚拟机创建4个容器
在虚拟机1
docker run -itd --network vlan1 --ip 172.16.1.2 --name c1 busybox
docker run -itd --network vlan1 --ip 172.16.1.3 --name c2 busybox
在虚拟机2
docker run -itd --network vlan1 --ip 172.16.1.4 --name c3 busybox
docker run -itd --network vlan1 --ip 172.16.1.5 --name c4 busybox
4.验证
理论上,因为ipvlan加了–internal参数后,c1可以ping通c2,但是不可以ping通c3,c4,同理c3能够ping通c4,不能ping通c1,c2
在虚拟机1上
在虚拟机2上(道理和上图一样)
三.实验-----L2模式多vlan跨主机通信(trunk)
整体拓扑图
步骤:
1.将上一个实验中的两个机器,还原成初始状态
虚拟机1
虚拟机2
2.在虚拟机1和虚拟机2上,分别创建vlan20,vlan30
docker network create -d ipvlan --subnet 192.168.20.0/24 --gateway 192.168.20.1 -o parent=enp0s3.20 ipvlan20
docker network create -d ipvlan --subnet 192.168.30.0/24 --gateway 192.168.30.1 -o parent=enp0s3.30 ipvlan30
在虚拟机1上
在虚拟机2上
3.在两个虚拟机上,创建4个容器
在虚拟机1上创建c1和c2
在虚拟机2上创建c3和c4
4.验证
因为c1和c3都属于vlan20,理论上应该可以ping的通的,c1和c2,c4不同vlan,理论上ping不通
在虚拟机1上
在虚拟机2上(道理和上图一样,同vlan的可以通信,不同vlan的无法通信)
四.实验-----L3模式
不同vlan的可以通信,使用L3模式
整体拓扑图
步骤:
1.将上一个实验中的两个机器,还原成初始状态
虚拟机1
虚拟机2
2.在虚拟机1和虚拟机2上,分别L3网络
docker network create -d ipvlan --subnet 192.168.20.0/24 --subnet 192.168.30.0/24 -o ipvlan_mode=l3 ipvlanl3
在虚拟机1上
在虚拟机2上
3.创建4个容器
在虚拟机1上
在虚拟机2上
4.验证处于不同子网下的容器能够互相通信
明天继续补充
五.遗留问题
目前实际工作中,并未用到ipvlan,估计用到的时候,可能会有其他一些奇怪的问题
对于ipvlan的原理,还需要再花时间去研究。
六.参考链接
1.docker关于ipvlan官网
https://docs.docker.com/network/ipvlan/
2.ipvlan原理介绍
https://www.cnblogs.com/lovezbs/p/14609276.html
https://blog.csdn.net/lsz137105/article/details/100596277
3.关于ipvaln和macvlan总结性的文章,文章最后,关于选择macvlan和ipvlan做了对比
https://blog.csdn.net/liuliuzi_hz/article/details/81167342
4.IPVLAN/MACVLAN 实现 Docker 和物理局域网络真正互联互通
https://blog.gazer.win/essay/connect-container-networks-to-physical-networks.html
5.ipvlan源码解读
https://juejin.cn/post/7030291455235080205
6.关于ipvlan网络协议站的解读
https://www.jianshu.com/p/783fe769f335