docker网络--多机通信--1--macvlan笔记

介绍

看了很多关于macvlan的文章,基本上没有能够跑通,有的可能没有问题,但是缺少细节(包括docker官网,太粗了)。我也尝试了很多种,用了hype-v,vmware,甚至是两个物理机器,但是没有跑通,最后是使用virtualbox才跑通的。下面的文章主要就是介绍,使用virtualbox跑通,单vlan跨主机通信,多vlan跨主机通信,以及多vlan跨主机跨vlan通信
关于优缺点和使用场景,主要参考文章Macvlan技术

使用场景

1.仅仅需要为虚拟机或容器提供访问外部物理网络的连接。
2.Macvlan 占用较少的 CPU,性能很好,同时提供较高的吞吐量,监控主机。

优缺点

Macvlan 是将 VM 或容器通过二层连接到物理网络的近乎理想的方案,但它也有一些局限性:
1.Linux 主机连接的交换机可能会限制同一个物理端口上的 MAC 地址数量。虽然你可以让网络管理员更改这些策略,但有时这种方法是无法实行的(比如你要去给客户做一个快速的 PoC 演示)。
2.许多 NIC 也会对该物理网卡上的 MAC地址数量有限制。超过这个限制就会影响到系统的性能。
3.IEEE 802.11 不喜欢同一个客户端上有多个 MAC 地址,这意味着你的 Macvlan 子接口在无线网卡或 AP 中都无法通信。
4.当使用 Macvlan 时,宿主机无法和 VM 或容器直接进行通讯。

实验-----单vlan通信(Bridge mode)

整体拓扑图
在这里插入图片描述

步骤
1.2台主机名称是xwl-1,xwl-2并且都已经安装好docker(此2台机器是用virtualbox安装的ubuntu server的虚拟机)
安装好系统,初始化系统,主要执行命令:
apt-get update && apt upgrade -y && apt install net-tools && apt install openssh-server -y && apt install docker. io -y
修改可以远程root登录,passwd root修改密码,以及需要修改/etc/ssh/sshd_config文件,然后再使用systemctl restart ssh即可
2.设置虚拟机的网络xwl-1和xwl-2的网络(如下图)
(做实验的时候,可以选择allow vms,实际上,最好选择allow all)
在这里插入图片描述

3.在2台机器上分别创建macvlan网络
机器xwl-1初始状态图
在这里插入图片描述
在xwl-1虚拟机上创建macvlan
在这里插入图片描述

机器xwl-2初始状态图
在这里插入图片描述
在xwl-2虚拟机上创建macvlan
在这里插入图片描述
4.在两个虚拟机上分别创建容器
机器1:root@xwl-1:docker run -itd --name c1 --ip=172.16.10.2 --network mac1 busybox
在这里插入图片描述
机器2:root@xwl-2:docker run -itd --name c2 --ip=172.16.10.3 --network mac1 busybox
在这里插入图片描述
5.将两个虚拟机的网卡设置成混杂模式
将虚拟机xwl-1的网卡设置成混杂模式
在这里插入图片描述
将虚拟机xwl-2的网卡设置成混杂模式
在这里插入图片描述
6.测试
虚拟机1(xwl-1)中的容器c1去ping虚拟机2(xwl-2)中的容器c2
在这里插入图片描述

虚拟机2(xwl-2)中的容器c2去ping虚拟机1(xwl-1)中的容器c1
在这里插入图片描述
7.拓展,
在虚拟机xwl-1机器上,在增加一个容器3,然后在和c1和c2通信
在这里插入图片描述
在xwl-2上去ping虚拟机的c3
在这里插入图片描述

实验-----多vlan通信(802.1q trunk bridge mode)

整体拓扑图
在这里插入图片描述
步骤:
1.将上个单vlan的相关配置全部清除,除了busybox镜像保留,关于虚拟机的网络整体配置,不变
虚拟机1,
在这里插入图片描述
虚拟机2
在这里插入图片描述
2.分别在 虚拟机 1和 虚拟机2 上基于两个 VLAN 子接口创建 2 个 macvlan 网络,mac10 和 mac20。
虚拟机1
在这里插入图片描述
虚拟机2
在这里插入图片描述
3. 分别在 虚拟机1 和 虚拟机2 上运行容器,并指定不同的 macvlan 网络
虚拟机1
在这里插入图片描述

虚拟机2
在这里插入图片描述
4.开启混杂模式
虚拟机1
在这里插入图片描述
虚拟机2
在这里插入图片描述

5.验证d1 和 d3,d2 和 d4 在同一 macvlan 网络下,互相可以 ping 通,d1 和 d2,d1 和 d4 在不同的 macvlan 网络下,互相 ping 不通。
虚拟机1
在这里插入图片描述
在这里插入图片描述
虚拟机2
在这里插入图片描述

实验-----跨vlan通信

整体拓扑图
在这里插入图片描述

步骤:
1.在virtualbox上再安装一个虚拟机xwl-3,与虚拟机1、2安装类似,都需要安装docker
2.网络配置
在这里插入图片描述
3.在虚拟机3(xwl-3)上,打开路由转发sysctl -w net.ipv4.ip_forward=1
在这里插入图片描述
4.创建两个 VLAN 子接口,一个作为 macvlan 网络 mac10 的网关,一个作为 mac20 的网关
在这里插入图片描述
5.添加iptables规则
在这里插入图片描述
6.验证跨vlan通信
在虚拟机1上
在这里插入图片描述
在虚拟机2上,与虚拟机1上类似,可以实现同vlan通信,也可以实现跨vlan通信
在这里插入图片描述
7.跨vlan通信原理说明(举例主要说明d1和d4是怎么通信的)
a.首先看一下跨vlan通信整体拓扑图
在这里插入图片描述
b.d1(172.16.10.10)和d4(172.16.20.11)是如何通信
1.在虚拟机1(xwl-1)上,数据流转
容器d1首先将数据包交给自己的网卡eth0,然后eth0再将数据包交给网卡enp0s3.100,然后再将数据包交给enp0s3这
个网卡,因为目的地址是20网络,非10网络,所以,会把数据包交给10网络的网关,10网络的网关是虚拟机3(xwl3)

2.在虚拟机3(xwl-3)上,数据流转
首先查看虚拟机3的iptables的filter表
在这里插入图片描述
再查看iptalbes的nat表
在这里插入图片描述
查看路由表
在这里插入图片描述
数据在虚拟机xwl-3上如何流转的呢?

enp0s3网卡
  1.虚拟机3收到虚拟机1发的数据包,目标地址为172.16.20.11,源地址为172.16.10.10,虚拟机3的网卡enp0s3首先将数据包交给网卡enp0s3.100(10网络的网关)
enp0s3.100网卡
  2.数据包进入网卡enps03.100后,走iptables规则链(该网卡总体会走PREROUTING-->INPUT-->OUTPUT-->POSTROUTING)
  3.数据会先进入PREROUTING链,这个时候,需要看nat表的PREROUTING,PREROUTING表对于该数据包,没有任何规则,默认是接受,然后准备路由到本机
  4.数据进入到INPUT链,这个时候,需要查看filter表的INPUT,INPUT表对于该数据包,没有任何规则,默认是接受
  5.数据进入到OUTPUT链,这个时候,需要查看filter表的OUTPUT,OUTPUT对于该数据包,没有任何规则,默认是接受
  6.数据进入到POSTROUTING链,这个时候,需要查看filter表的POSTROUTING,POSTROUTING对于该数据包有规则,将数据包进行SNAT,将数据包的源地址修改为172.16.10.1即为网卡enp0s3.100的地址,目的地址不变,仍然为172.10.20.11。
  是这条规则起作用
  iptables -t nat -A POSTROUTING -o enp0s8.100 -j MASQUERADE
  7.根据系统的路由规则,数据包会由enp0s3.100发给enp0s3.200网卡 
        Destination     Gateway         Genmask         Flags   Metric        Ref    Use        Iface
        172.16.20.0     0.0.0.0         255.255.255.0       U          0      0        0      enp0s3.200
enps03.200网卡
  8.数据包进入到网卡enp0s3.200后,然后走iptables规则链(该网卡总体也会走PREROUTING-->FORWARD-->POSTROUTING)
  9.数据会先进入PREROUTING链,这个时候,需要看nat表的PREROUTING,PREROUTING表对于该数据包,没有任何规则,默认是接受,因为该数据包的目的地址不是172.16.20.1,所以该数据包,下一步会将数据路由到FORWARD链
  10.数据包进入到FORWARD,这个时候,需要看nat表的FORWARD,FORWARD表对于该数据包有规则,其实就是接受
  是这两条规则起作用
  iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -m state --state RELATED,ESTABLISHED -j ACCEPT
  iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -j ACCEPT
  我觉得这两条规则,有第2条就够了,第一个不要,应该也没关系,但是必须得有,因为FORWARD链中的数据默认是不转发直接丢弃的。
  11.数据包进入到POSTROUTING链,这个时候,需要查看filter表的POSTROUTING,POSTROUTING对于该数据包有规则,将数据包进行SNAT,将数据包的源地址修改为172.1620.1即为网卡enp0s3.200的地址,目的地址不变,仍然为172.10.20.11。
  是这条规则起作用
  iptables -t nat -A POSTROUTING -oenp0s8.200 -j MASQUERADE
  12.现在数据包的源ip为172.10.20.1,目的地址不变,仍然为172.10.20.11,就可以先发送给虚拟机(xwl-2)的网卡enp0s3了

3.在虚拟机2(xwl-2)上,数据流转
虚拟机(xwl-2)的网卡enp0s3收到数据后,根据mac地址,将数据转发给enp0s3.200网卡,然后再将数据包发给容器d4的网卡eth0了,然后容器里服务或者应用就可以处理数据包了
4.根据步骤123,知道了d1–>d4方向的通信,d4–>d1方向的通信,就是根据来的数据包的源端口号和IP进行原路返回即可
PS:
1.macvlan的容器地位相当高,对于同一个vlan,能够跟物理机的网卡和虚拟机的网卡地位是一样的
2.我们列子用的是macvlan的bridge模式,一个macvlan可以有多个容器,处于同一个bridge上

遗留问题

  1. docker macvlan默认的模式是bridge模式,其他另为3种模式暂时未去尝试配置(原理看过,如果工作中用到,再做研究)
  2. vmware暂时没配置通过
    a.对于跨主机还是无法通信,对于处于同vlan中多个容器,本机能够正常通信
    b.对于跨主机无法通信,主要卡在vmware默认是无法进行混杂模式设置的,需要自己手工设置,但是我手工设置多次,仍然未成功,暂时放弃
    在这里插入图片描述
    c.按照截图中的网址,进行设置,仍然未成功(https://kb.vmware.com/s/article/287)
  3. 对于hype-v暂时未配置通过,等工作如果用到再做研究,暂时不管
  4. 对于实体物理机器,暂时未配置通过
  5. a.对于同一个vlan,本机多个容器,能够进行通信
    
  6. b.对于同一个vlan,能够进行跨主机通信
    
  7. c.对于配置trunk模式,同一个vlan没法进行通信,暂时工作中,用不到,等用到,再进行研究(估计是混杂模式没有设置好)
    
  8. d.如果再研究这个,需要看文章中https://www.cnblogs.com/bakari/p/10893589.html如下的截图部分,当时没有进行设置
    

在这里插入图片描述

参考链接

    1.macvlan原理
    https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247485246&idx=1&sn=c42a3618c357ebf5f6b7b7ce78ae568f&chksm=ea743386dd03ba90ad65940321385f68f9315fec16d82a08efa12c18501d8cadf95cf9e614a2&scene=21#wechat_redirect
    2.详细说明了macvlan技术,并且对比了docker的macvlan和docker的bridge网络技术
    https://cloud.tencent.com/developer/article/1495440
    3.Docker 网络模型之 macvlan 详解
    https://www.cnblogs.com/bakari/p/10893589.html
    4.docker官网,关于macvlan
    https://docs.docker.com/network/macvlan/
    5.关于macvlan和ipvlan比较总结性文章
    https://blog.csdn.net/liuliuzi_hz/article/details/81167342
    6.Docker 跨主机网络overlay、macvlan和flannel
    https://blog.csdn.net/wfs1994/article/details/80659232
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂奔的蜗牛x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值