精华内容
下载资源
问答
  • Macvlan与IPvlan

    2021-02-08 11:17:31
    本文主要就macvlan和ipvlan的工作模式以及差异做简要介绍;同时,为便于形象的理解,还会涉及到一些实际操作命令。 macvlan 这里的macvlan是linux kernel提供的一种network driver类型,它有别于传统交换机上提供的...

    本文主要就macvlan和ipvlan的工作模式以及差异做简要介绍;同时,为便于形象的理解,还会涉及到一些实际操作命令。

    macvlan

    这里的macvlan是linux kernel提供的一种network driver类型,它有别于传统交换机上提供的mac based vlan功能。可以在linux命令行执行lsmod | grep macvlan 查看当前内核是否加载了该driver;如果没有查看到,可以通过modprobe macvlan来载入,然后重新查看。

    如果要查看内核源码,可以到以下路径:/drivers/net/macvlan.c

    工作模式

    • Bridge:属于同一个parent接口的macvlan接口之间挂到同一个bridge上,可以二层互通(经过测试,发现这些macvlan接口都无法与parent接口互通)。
    • VPEA:所有接口的流量都需要到外部switch才能够到达其他接口。
    • Private:接口只接受发送给自己MAC地址的报文。

    三种模式之间的差异,可以通过下图形象的理解:
    在这里插入图片描述

    实验时间

    下面的实验创建了两个macvlan接口,分别放到两个netns中;然后验证这两个macvlan口之间客户互通。

    先使用bridge mode创建两个macvlan接口,其parent接口都是enp0s8。

    # ip link add link enp0s8 name macv1 type macvlan mode bridge
    # ip link add link enp0s8 name macv2 type macvlan mode bridge
    

    查看创建的结果(注意每个接口都有自己的mac地址):

    # ip link 
    3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether 08:00:27:31:1a:5d brd ff:ff:ff:ff:ff:ff
    7: macv1@enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1
        link/ether 06:95:37:0c:83:36 brd ff:ff:ff:ff:ff:ff
    8: macv2@enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1
        link/ether a2:e1:f1:e9:95:18 brd ff:ff:ff:ff:ff:ff
    

    创建网络命名空间,并将接口加入进来,并通过dhcp server来分配IP地址:

    # ip net add net-1
    # ip net add net-2
    
    # ip link set macv1 netns net-1
    # ip link set macv2 netns net-2
    
    # ip net exec net-1 ip addr add 10.0.2.18/24 dev macv1
    # ip net exec net-2 ip addr add 10.0.3.19/24 dev macv2
    

    发现macv1 ping不通宿主机接口enp0s8的地址:

    # ip net exec net-1 ping 10.0.2.19
    PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
    ^C
    --- 10.0.2.15 ping statistics ---
    4 packets transmitted, 0 received, 100% packet loss, time 3008ms
    

    但是可以ping通macv2的地址:

    # ip net exec net-1 ping 10.0.2.17
    PING 10.0.2.17 (10.0.2.17) 56(84) bytes of data.
    64 bytes from 10.0.2.17: icmp_seq=1 ttl=64 time=0.043 ms
    64 bytes from 10.0.2.17: icmp_seq=2 ttl=64 time=0.052 ms
    64 bytes from 10.0.2.17: icmp_seq=3 ttl=64 time=0.052 ms
    

    ipvlan

    下面介绍ipvlan接口,它也是linux kernel的一个network driver,具体代码见内核目录:/drivers/net/ipvlan/。与macvlan不同的是,macvlan是通过MAC查找macvlan设备,而ipvlan是通过IP查找ipvlan设备。

    可以思考一下,ipvlan接口和直接在eth0上添加多个ip address的效果有什么区别?

    工作模式

    应用kernel-docs的一句话来介绍这两种模式的差异性:

    • l2: the slaves will RX/TX multicast and broadcast (if applicable) as well.
    • l3: the slaves will not receive nor can send multicast / broadcast traffic.

    形象的理解见下图:
    在这里插入图片描述

    实验时间

    以下实验分别创建了两个ipvlan接口,并放到两个netns中;ipvlan可以配置到不同的网段,它们彼此之间通过内部路由能够互访。

    另外,L2 mode时,ipvlan接口能够接收到二层广播和组播报文;而L3 mode时,ipvlan接口不再处理所有二层报文。实验通过tcpdump抓ARP包的方式来验证该特性差异,通过实验,我们对ipvlan的两种模式应该有比较形象的理解。

    L3 mode实验

    创建两个ipvlan接口,都是使用l3mode;查看其mac地址都等同于其parent接口的mac地址:

    # ip link add link enp0s3 ipvlan1 type ipvlan mode l3
    # ip link add link enp0s3 ipvlan2 type ipvlan mode l3
    
    # ip addr
    2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 08:00:27:d7:d6:a9 brd ff:ff:ff:ff:ff:ff
        inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
           valid_lft 86193sec preferred_lft 86193sec
        inet6 fe80::c6bb:4c9:37e8:7ac2/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    7: ipvlan1@enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 08:00:27:d7:d6:a9 brd ff:ff:ff:ff:ff:ff
    8: ipvlan2@enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether 08:00:27:d7:d6:a9 brd ff:ff:ff:ff:ff:ff
    

    创建网络命名空间,并将接口放进命名空间:

    # ip net add net-1
    # ip net add net-2
    
    # ip link set ipvlan1 netns net-1
    # ip link set ipvlan2 netns net-2
    

    由于MAC地址一样,因此无法通过dhclient来分配IP地址,只能手动配置:

    # ip net exec net-1 ip addr add 10.0.2.18/24 dev ipvlan1
    # ip net exec net-2 ip addr add 10.0.3.19/24 dev ipvlan2
    

    添加默认路由

    # ip net exec net-1 route add default dev ipvlan1
    # ip net exec net-2 route add default dev ipvlan2
    

    可以ping通另一个namespace中的ipvlan接口(它们位于不同的网段中)

    # ip net exec net-2 ping 10.0.2.18
    PING 10.0.2.18 (10.0.2.18) 56(84) bytes of data.
    64 bytes from 10.0.2.18: icmp_seq=1 ttl=64 time=0.072 ms
    64 bytes from 10.0.2.18: icmp_seq=2 ttl=64 time=0.048 ms
    ^C
    --- 10.0.2.18 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    rtt min/avg/max/mdev = 0.048/0.060/0.072/0.012 ms
    

    此时,在对端接口上抓不到ARP报文,说明二层广播和组播都不处理,工作在L3

    # ip net exec net-1 tcpdump -ni ipvlan1 -p arp
    
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ipvlan1, link-type EN10MB (Ethernet), capture size 262144 bytes
    

    无法ping通父接口enp0s3的IP

    # ip net exec net-1 ping 10.0.2.15
    PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
    ^C
    --- 10.0.2.15 ping statistics ---
    97 packets transmitted, 0 received, 100% packet loss, time 96106ms
    

    L2 mode实验

    通L3mode类似,实验流程不再过多介绍:

    # ip link add link enp0s3 ipvlan1 type ipvlan mode l2
    # ip link add link enp0s3 ipvlan2 type ipvlan mode l2
    
    # ip net add net-1
    # ip net add net-2
    
    # ip link set ipvlan1 netns net-1
    # ip link set ipvlan2 netns net-2
    
    # ip net exec net-1 ip link set ipvlan1 up
    # ip net exec net-2 ip link set ipvlan2 up
    
    # ip net exec net-1 ip addr add 10.0.2.18/24 dev ipvlan1
    # ip net exec net-2 ip addr add 10.0.3.18/24 dev ipvlan2
    
    # ip net exec net-1 route add default dev ipvlan1
    # ip net exec net-2 route add default dev ipvlan2
    
    # ip net exec net-1 ip link set ipvlan1 up
    # ip net exec net-2 ip link set ipvlan2 up
    
    # ip net exec net-2 ip link set lo up
    # ip net exec net-1 ip link set lo up
    

    与L3 mode不通的是,发现可以抓取到ARP报文(二层广播)

    # ip net exec net-1 tcpdump -ni ipvlan1 -p arp
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on ipvlan1, link-type EN10MB (Ethernet), capture size 262144 bytes
    21:06:27.461824 ARP, Request who-has 10.0.3.18 tell 10.0.2.18, length 28
    21:06:27.461818 ARP, Request who-has 10.0.2.18 tell 10.0.3.18, length 28
    21:06:27.461842 ARP, Reply 10.0.2.18 is-at 08:00:27:d7:d6:a9, length 28
    21:06:27.461845 ARP, Reply 10.0.3.18 is-at 08:00:27:d7:d6:a9, length 28
    

    原文链接:https://www.dazhuanlan.com/2019/12/12/5df17e01243b0/

    展开全文
  • add IPVLAN support

    2021-01-07 08:52:34
    <div><p>add IPVLAN support for network configuration, exposes IPVLAN configuration to container through devLXD</p><p>该提问来源于开源项目:lxc/lxd</p></div>
  • ipvlan support default route

    2020-12-05 05:48:11
    <div><p>When I use flannel with ipVlan, I need the default route in container. Add "isDefaultGateway" in ipVlan, ipVlan can work in Kubernetes with 'l3s' mode.</p><p>该提问来源于开源...
  • Linux kernel contains another interface driver which is very similar to macvlan and works with Wi-Fi: ipvlan. Contrary to macvlan, it shares the same MAC address as the master interface, which allows ...
  • vlan macvlan ipvlan

    千次阅读 2018-07-23 14:39:52
    VLAN VLAN 技术主要就是在二层数据包的包头加上tag 标签,表示当前数据包归属的vlan 号。VLAN的主要优点: (1)广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。 (2)增强局域网的安全性:VLAN间不能直接通信...

    VLAN

    VLAN 技术主要就是在二层数据包的包头加上tag 标签,表示当前数据包归属的vlan 号。VLAN的主要优点: (1)广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。 (2)增强局域网的安全性:VLAN间不能直接通信,即一个VLAN内的用户不能和其它VLAN内的用户直接通信,而需要通过路由器或三层交换机等三层设备。 (3)灵活构建虚拟工作组:用VLAN可以划分不同的用户到不同的工作组,同一工作组的用户也不必局限于某一固定的物理范围,网络构建和维护更方便灵活。

    MACVLAN

    MACVLAN , IPVLAN 名字和VLAN 相近,但是机制有很大不同。

    MACVLAN技术是一种将一块以太网卡虚拟成多块以太网卡的极简单的方案。一块以太网卡需要有一个MAC地址,这就是以太网卡的核心中的核心。

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

     

    IPVLAN

    ipvlan类似于macvlan,区别在于端点具有相同的mac地址。 ipvlan支持L2和L3模式。 在ipvlan l2模式下,每个端点获得相同的mac地址但不同的ip地址。 在ipvlan l3模式下,数据包在端点之间路由,因此这提供了更好的可伸缩性。

     

    ipvlan 有两种不同的模式:L2 和 L3。一个父接口只能选择一种模式,依附于它的所有虚拟接口都运行在这个模式下,不能混用模式。

    L2 模式

    ipvlan L2 模式和 macvlan bridge 模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

    L3 模式

    L3 模式下,ipvlan 有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相 ping 通对方,因为 ipvlan 会在中间做报文的转发工作。

     

    IPVLAN和MACVLAN的区别在于它在IP层进行流量分离而不是基于MAC地址,因此,你可以看到,同属于一块宿主以太网卡的所有IPVLAN虚拟网卡的MAC地址都是一样的,因为宿主以太网卡根本不是用MAC地址来分流IPVLAN虚拟网卡的流量的。

     

    ipvlan 和 macvlan 两个虚拟网络模型提供的功能,看起来差距并不大,那么什么时候需要用到 ipvlan 呢?要回答这个问题,我们先来看看 macvlan 存在的不足:

    • 需要大量 mac 地址。每个虚拟接口都有自己的 mac 地址,而网络接口和交换机支持的 mac 地址有支持的上限
    • 无法和 802.11(wireless) 网络一起工作

    对应的,如果你遇到一下的情况,请考虑使用 ipvlan:

    • 父接口对 mac 地址数目有限制,或者在 mac 地址过多的情况下会造成严重的性能损失
    • 工作在无线网络中
    • 希望搭建比较复杂的网络拓扑(不是简单的二层网络和 VLAN),比如要和 BGP 网络一起工作

    展开全文
  • <div><p>Ipvlan is supported using tc filtering rules to redirect traffic between the ipvlan interface and tap interface.</p><p>该提问来源于开源项目:kata-containers/runtime</p></div>
  • 虚拟网络技术:ipvlan

    千次阅读 2019-09-07 13:28:52
    本文首发于我的公众号码农之屋(id:Spider1818),专注于干货分享,包含但不限于Java编程...=4.2,和macvlan类似,都是从一个主机接口虚拟出多个虚拟网络接口,ipvlan虚拟出的子接口共有物理接口的mac地址,但可配置...

    本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程、网络技术、Linux内核及实操、容器技术等。欢迎大家关注,二维码文末可以扫。

    导读:ipvlan是linux kernel比较新颖的特性,稳定的版本>=4.2,和macvlan类似,都是从一个主机接口虚拟出多个虚拟网络接口,ipvlan虚拟出的子接口共有物理接口的mac地址,但可配置不同的ip地址。


    一、ipvlan简介

    ipvlan和macvlan类似,都是从一个主机接口虚拟出多个虚拟网络接口。唯一比较大的区别就是ipvlan虚拟出的子接口都有相同的mac地址(与物理接口共用同个mac地址),但可配置不同的ip地址。由于所有的虚拟接口共享同个mac地址,因此有些地方需要注意:当使用DHCP协议分配ip时,一般会用mac地址作为机器的标识,因此需要配置唯一的ClientID字段作为机器的标识, DHCP server配置ip时需使用该字段作为机器标识,而不是使用mac地址。

    ipvlan是linux kernel比较新颖的特性,从3.19版本就开始支持ipvlan,但是比较稳定推荐的版本是 >=4.2(因为docker对接之前版本时存在bug)。


    二、两种工作模式

    ipvlan有两种不同的工作模式:L2和L3。一个父接口只能选择其中一种模式(不能采用混用模式),依附于它的所有虚拟接口都会运行在这个模式下。

    1、L2模式

    Ipvlan的L2模式和macvlan的bridge模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

    2、L3模式

    L3模式下,ipvlan有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相ping通对方,因为ipvlan会在中间做报文的转发工作。

    L3模式下的虚拟接口不会接收到多播或者广播的报文(ipvlan的虚拟接口会显示NOARP标志),在这个模式下,所有的网络报文都会发送给父接口,因此所有的ARP过程或者多播都是在底层的父接口完成的。需要注意的是:外部网络默认情况下是不知道ipvlan虚拟出来的网络的,如果不在外部路由器上配置好对应的路由规则,ipvlan的网络是不能被外部直接访问的。


    三、ipvlan不同模式下的代码流程

    如果是L2模式的话,分配ip给container,在container中会做arp的广播发送,当需要路由时,都是通过master设置进行路由转发。

    如果是L3模式的话,ipvlan的虚拟机接口是不处理arp的广播和请求的,二层的广播交给了master device进行处理。在这种模式下master设备类似于路由器进行转发,需要配置针对container的路由信息。具体的详细细节可以参考以下代码流程图。

    1、L2的发包流程

     

    2、L2的收包流程

     

    3、L3的发包流程

     

    4、L3的收包流程


    四、选择ipvlan还是macvlan?

    ipvlan和macvlan两个虚拟网络模型提供的功能,看起来差距并不大,那么什么时候需要用到ipvlan呢?要回答这个问题,我们先来看看macvlan存在的不足:

    1、需要大量mac地址。每个虚拟接口都有自己的mac地址,而网络接口和交换机支持的mac地址个数是有限的,在mac地址过多的情况下会造成严重的性能损失

    2、无法和802.11(wireless)网络一起工作

    假如你遇到了以上描述的问题,则这时就可以考虑使用ipvlan。

     

    我的公众号「码农之屋」(id: Spider1818) ,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

    展开全文
  • 原 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN ...
    转载于:https://blog.csdn.net/dog250/article/details/45788279
    Linux的网卡驱动中内含了很多“虚拟网卡”。早先的文章曾经详细分析过tun,ifb等虚拟网卡,类似的思路,在虚拟化大行其道的趋势下,Linux源码树中不断增加对“网络虚拟化”的支持,不光是为了支持“虚拟机”技术,更多的是给了用户和程序员更多的选择。
           这些对网络虚拟化的支持技术包括任何重量级的虚拟化技术,比较重的比如对虚拟机技术的支持,轻量级的则是net namespace技术。近期的工作基于net namespace技术,关于这个技术我也不多说了,它主要是提供了每个namespace独立的协议栈以及网卡,对于网络协议栈以及网卡之外的部分,所有namespace是共享的,这种轻量级的针对网络的虚拟化技术对于模拟多客户端网络连接特别有用而且操作简单。我会单独写一篇文章来展示这种操作。
           如果仅仅为了完成工作,那么我不会写这篇文章,早在去年的时候,我写过一篇关于net namespace的,根据那个里面的step by step,工作就已经可以完成了,并且在去年年末到今年年初,这个工作我们也已经做过了,然而对于学习而言,就不是这样了。学习应该是碰到一点折腾一点,我知道,很多人都知道,现在不比上学那会儿了,我们谁都没有整块的时间系统地进行学习,特别是对于我这种结了婚有了孩子,需要为了还贷款而不再任性的路人丙来讲,更是这样。因此就需要对所碰到的技术有一种可遇而不可求的相见恨晚的感觉,这样就有动力把它吃透了。
           本文中,我想通过几张图来介绍一下Linux中常用的几类和网络虚拟化相关的虚拟网卡,当然,这些虚拟网卡的使用场景并不仅限于net namespace,重量级的虚拟机也可以使用,之所以用net namespace举例是因为它的简单性。总体来说,这些虚拟网卡的原理就摆在那里,具体在什么场景下使用它们,就看你自己的想象力了。

    网络虚拟化

    总体来讲,所谓的网络虚拟化在本文中指的是主机中的网络虚拟化,侧重于在一台物理主机中,分离出多个TCP/IP协议栈的意思。网络虚拟化可以独立实现,也可以依托别的技术实现。在Linux中,独立的网络虚拟化实现就是net namespace技术,依托别的技术实现的网络虚拟化就是虚拟机技术,我们当然知道,每个虚拟机里面都有自己的协议栈,而这种依托虚拟机技术实现的网络虚拟化可能还要更简单一些,因为宿主机并不需要去“实现”一个协议栈,而是把这个任务交给了虚拟机的操作系统来完成,宿主机“相信”虚拟机里面一定运行着一个拥有协议栈的操作系统。

    理解虚拟网卡的要旨

    你要知道,一块网卡就是一道门,一个接口,它上面一般接协议栈,下面一般接介质。最关键的是,你要明确它们确实在上面和下面接的是什么。
           由于网卡的上接口在OS中实现,或者使用PF技术在用户态实现,总而言之,它们是软的,这就意味着你可以任意实现它们。反之,下接口便不受机器运行软件的控制了,你无法通过软件改变双绞线的事实,不是吗?故此,我们一般关注网卡下面接的是什么,是什么呢?姑且将它叫做endpoint吧。在开始正文之前,我先列举几个常见的endpoint:
    以太网ETHx:普通双绞线或者光纤;
    TUN/TAP:用户可以用文件句柄操作的字符设备;
    IFB:一次到原始网卡的重定向操作;
    VETH:触发虚拟网卡对儿peer的RX;
    VTI:加密引擎;
    ...
           关于数据在宿主网卡和虚拟网卡之间的路由(广义的路由),有很多方式,在早期的内核中,对bridge(Linux的bridge也算是一种虚拟网卡)的支持是靠一个在netif_receive_skb中硬编码调用的一个br_handle_frame_hook钩子来实现的,这个钩子由bridge模块注册。但是随着虚拟网卡种类的越来越多,总不能每一种都硬编码这么一种钩子,这样会使得netif_receive_skb显得太臃肿,因此一种新的方式被提出来了,事实上很简单,就是将这种钩子向上抽象了一层,不再硬编码,而是统一在netif_receive_skb中调用唯一的一个rx_handler的钩子。具体如何设置这种钩子,就看这个宿主网卡需要绑定哪种类型的虚拟网卡了,比如:
    对于bridge:调用netdev_rx_handler_register(dev, br_handle_frame, p),在netif_receive_skb中调用的是br_handle_frame;
    对于bonding:调用netdev_rx_handler_register(slave_dev, bond_handle_frame, new_slave),在netif_receive_skb中调用的是bond_handle_frame;
    对于MACVLAN:调用netdev_rx_handler_register(dev, macvlan_handle_frame, port),在netif_receive_skb中调用的是macvlan_handle_frame;
    对于IPVLAN:调用netdev_rx_handler_register(dev, ipvlan_handle_frame, port),在netif_receive_skb中调用的是ipvlan_handle_frame;
    对于...
    每一块宿主网卡只能注册一个rx_handler,但是网卡和网卡却可以叠加。

    VETH虚拟网卡技术

    关于这个虚拟网卡,我在《OpenVPN多处理之-netns容器与iptables CLUSTER》中有提到过,每一个VETH网卡都是一对儿以太网卡,除了xmit接口与常规的以太网卡驱动不同之外,其它的几乎就是一块标准的以太网卡。VETH网卡既然是一对儿两个,那么我们把一块称作另一块的peer,标准上也是这么讲的。其xmit的实现就是:将数据发送到其peer,触发其peer的RX。那么问题来了,这些数据如何发送到VETH网卡对儿之外呢?自问必有自答,自答如下:
    1.如果确实需要将数据发到外部,通过将一块VETH网卡和一块普通ETHx网卡进行bridge,通过bridge逻辑将数据forward到ETHx,进而发出;
    2.难道非要把数据包发往外部吗?类似loopback那样的,不就是自发自收吗?使用VETH可以很方面并且隐秘地将数据包从一个net namespace发送到同一台机器的另一个net namespace,并且不被嗅探到。
           VETH虚拟网卡非常之简单,原理图如下所示:




    VETH使用原始朴素的方式连接了不同的net namespace,符合UNIX的风格,因此你需要动用很多别的技术或者工具来完成net namespace的隔离以及数据的发送。

    MACVLAN虚拟网卡技术

    MACVLAN技术可谓是提出一种将一块以太网卡虚拟成多块以太网卡的极简单的方案。一块以太网卡需要有一个MAC地址,这就是以太网卡的核心中的核心。
           以往,我们只能为一块以太网卡添加多个IP地址,却不能添加多个MAC地址,因为MAC地址正是通过其全球唯一性来标识一块以太网卡的,即便你使用了创建ethx:y这样的方式,你会发现所有这些“网卡”的MAC地址和ethx都是一样的,本质上,它们还是一块网卡,这将限制你做很多二层的操作。有了MACVLAN技术,你可以这么做了。
           我们先来看一下MACVLAN技术的流程示意图:




    在具体的执行上,通过下面的命令,你可以创建一个MACVLAN网卡,它是基于eth0虚拟出来的:
    ip link add link eth0 name macv1 type macvlan
    你可以认为有人将双绞线“物理上”每根一分为二,接了两个水晶头,从而连接了两块网卡,其中一块是虚拟的MACVLAN网卡。但是既然共享介质,难道不用运行CSMA/CD吗?当然不用,因为事实上,最终的数据是通过eth0发出的,而现代的以太网卡工作的全双工模式,只要是交换式全双工(某些标准而言,这是必须的),eth0自己能做好。
           现在可以说一下MACVLAN技术构建的虚拟网卡的模式了。之所以MACVLAN拥有所谓的模式,是因为相比VETH,它更是将复杂性建立在了一个已经容不下什么的以太网概念上,因此相互交互的元素就会太多,它们之间的关系不同,导致最终MACVLAN的行为不同。还是图解的方式:

    1.bridge模式




    这个bridge只是针对同属于一块宿主以太网卡的MACVLAN网卡以及宿主网卡之间的通信行为的,与外部通信无关。所谓的bridge指的是在这些网卡之间,数据流可以实现直接转发,不需要外部的协助,这有点类似于Linux BOX内建了一个bridge,即用brctl命令所做的那一切。

    2.VEPA模式




    VEPA模式我后面会专门讲。现在要知道的是,在VEPA模式下,即使是MACVLANeth1和MACVLANeth2同时配在在eth0上,它们两者之间的通信也不能直接进行,而必须通过与eth0相连的外部的交换机协助,这通常是一个支持“发夹弯”转发的交换机。

    3.private模式




    这种private模式的隔离强度比VEPA更强。在private模式下,即使是MACVLANeth1和MACVLANeth2同时配在在eth0上,eth0连接了外部交换机S,S支持“发夹弯”转发模式,即便这样,MACVLANeth1的广播/多播流量也无法到达MACVLANeth2,反之亦然,之所以隔离广播流量,是因为以太网是基于广播的,隔离了广播,以太网将失去了依托。
           如果你想配置MACVLAN的模式,请在ip link命令后面添加mode参数:
    ip link add link eth0 name macv1 type macvlan mode bridge|vepa|private

    VETH网卡与MACVLAN网卡之间的异同

    我们先看一下如何配置一个独立的net namespace。

    1.VETH方式

    ip netns add ns1
    ip link add v1 type veth peer name veth1
    ip link set v1 netns ns1
    brctl addbr br0
    brctl addif br0 eth0
    brctl addif br0 veth1

    ifconfig br0 192.168.0.1/16

    2.MACVLAN方式

    ip link add link eth0 name macv1 type macvlan
    ip link set macv1 netns ns1
    可以看到,MACVLAN做起同样的事,比VETH来的简单了。那么效率呢?Linux的bridge基于软件实现,需要不断查找hash表,这个同样也是MACVLAN bridge模式的做法,但是VEPA模式和private模式下,都是直接转发的。它们的区别可以从下图展示出来:





    VEPA技术

    VEPA是什么?Virtual Ethernet Port Aggregator。它是HP在虚拟化支持领域对抗Cisco的VN-Tag的技术。所以说,Cisco的VN-Tag和VEPA旨在解决同一个问题或者说同一类问题。解决的是什么问题呢?通俗点说,就是虚拟机之间网络通信的问题,特别是位于同一个宿主机内的虚拟机之间的网络通信问题。
           难道这个问题没有解决吗?我使用的VMWare可以在我的PC中创建多个虚拟机,即便我拔掉我的PC机网线,这些虚拟机之间也能通信...VMWare内部有一个vSwitch。就是说,几乎所有的虚拟机技术,内置的交叉网络都能解决虚拟机之间的通信问题。那么还要VN-Tag以及VEPA干什么?
           这个问题涉及到两个领域,一个是扩展性问题,另一个是职责边界问题。说明白点就是,内置的vSwitch之类的东西在性能和功能上足以满足要求吗?它属于虚拟机软件厂商的边缘产品,甚至说不是一个独立的产品,它一般都是附属虚拟机软件赠送的,没有自己的销售盈利模式,虚拟机厂商之所以内置它是因为它只是为了让用户体验到虚拟机之间“有相互通信的能力”,所以厂商是不会发力将这种内置的虚拟交换机或者虚拟路由器做完美的,它们推的是虚拟机软件本身。
           另外,千百年来,网络管理员和系统管理员之间的职责边界是清晰的,直到到达了虚拟化时代。如果使用内置的虚拟交换机,那么如果这个交换机出了故障或者有复杂的配置任务计划,找谁呢?要知道这个虚拟交换机内置于宿主服务器内部,这是系统管理员的领域,一般的网管设置无法触摸到这些设备,数据中心复杂的三权分立管理模式也无法让网管去登录服务器。反过来,系统管理员对网络协议的认知程度又远远比不上专业网管。这就造成了内置于虚拟机软件的虚拟网络设备的尴尬处境。另一方面,这个虚拟的网络设备确实不是很专业的网络设备。爆炸!
           Cisco不愧为网络界的大咖。它总是在出现这种尴尬场景的时候率先提出一个标准,于是它改造了以太网协议,推出了VN-Tag,就像ISL之于IEEE802.1q那样。VN-Tag在标准的协议头中增加了一个全新的字段,这种做法的前提是Cisco有能力用最快的速度推出一款设备并让其真正跑起来。在看看HP的反击,HP没有Cisco那样的能力,它不会去修改协议头,但是它可以修改协议的行为从而解决问题,虽然比Cisco晚了一步,但是HP提出的VEPA不愧是一种更加开放的方式,Linux可以很容易的增加对其的支持。
           VEPA,它很简单,一个数据包从一个交换机的一个网口进入,然后从同一个网口发回去,好像是毫无意义的做法,但是它却没有改变以太网的协议头。这种做法在平常看来真的是毫无意义的,因为正常来讲,一块网卡连接一根网线,如果是自己发给自己的数据,那么这个数据是不会到达网卡的,对于Linux而言,直接就被loopback给bypass了。但是对于虚拟化场景而言,情况就有所不同了,虽然物理宿主机上可能拥有一块以太网卡,但是从该网卡发出的数据包却不一定来自同一个协议栈,它可能来自不同的虚拟机或者不同的net namespace(仅针对Linux),因为在支持虚拟化OS的内部,一块物理网卡被虚拟成了多块虚拟网卡,每一块虚拟网卡属于一个虚拟机...此时,如果不修改以太网协议头且又没有内置的虚拟交换机,就需要外部的一台交换机来协助转发,典型的就是从一个交换口收到数据包,把它从该口再发出去,由宿主网卡决定是否接收以及如何接收。如下图所示:




           对于以太网卡而言,硬件上根本就不需要任何修改,软件驱动修改即可,对于交换机而言,需要修改的很少,只要在MAC/Port映射表查询失败的情况下,将数据包广播到包括入口的所有端口即可,对于STP协议,也是类似的修改。对于HP而言,发出VEPA是一个正确的选择,因为它不像Cisco和Intel那样,可以大量生产网卡和设备,从而控制硬件标准。对于支持VEPA的交换机而言,仅仅需要支持一种“发夹弯”的模式就可以了。爆炸!

    IPVLAN虚拟网卡技术

    这个小节我们来看下IPVLAN。在理解了MACVLAN之后,理解IPVLAN就十分容易了。IPVLAN和MACVLAN的区别在于它在IP层进行流量分离而不是基于MAC地址,因此,你可以看到,同属于一块宿主以太网卡的所有IPVLAN虚拟网卡的MAC地址都是一样的,因为宿主以太网卡根本不是用MAC地址来分流IPVLAN虚拟网卡的流量的。具体的流程如下图所示:




    IPVLAN的创建命令如下:
    ip link add link <master-dev> <slave-dev> type ipvlan mode { l2 | L3 }
    将一个IPVLAN虚拟网卡放入一个独立的net namespace的方式和MACVLAN完全一样,但是它俩之间改如何作出选择呢?好在IPVLAN有Linux源码树上的Document,因此我就不多嘴了:
    4.1 L2 mode: In this mode TX processing happens on the stack instance attached to the slave device and packets are switched and queued to the master device to send out. In this mode the slaves will RX/TX multicast and broadcast (if applicable) as well.
    4.2 L3 mode: In this mode TX processing upto L3 happens on the stack instance attached to the slave device and packets are switched to the stack instance of the master device for the L2 processing and routing from that instance will be used before packets are queued on the outbound device. In this mode the slaves will not receive nor can send multicast / broadcast traffic.
    5. What to choose (macvlan vs. ipvlan)? These two devices are very similar in many regards and the specific use case could very well define which device to choose. if one of the following situations defines your use case then you can choose to use ipvlan - (a) The Linux host that is connected to the external switch / router has policy configured that allows only one mac per port. (b) No of virtual devices created on a master exceed the mac capacity and puts the NIC in promiscous mode and degraded performance is a concern. (c) If the slave device is to be put into the hostile / untrusted network namespace where L2 on the slave could be changed / misused.

    MACVTAP虚拟网卡技术

    这是本文谈到的最后一种虚拟网卡。为什么会有这种虚拟网卡呢?我们还是从问题说起。
           如果一个用户态实现的虚拟机或者模拟器,它在运行OS的时候,怎么模拟网卡呢?或者说我们实现了一个用户态的协议栈,和内核协议栈完全独立,你可以把它们想象成两个net namespace,此时如何把物理网卡的流量路由到用户态呢?或者反过来,如何将用户态协议栈发出的数据路由到BOX外部呢?按照常规的想法,我们知道TAP网卡的endpoint是一个用户态可访问的字符设备,OpenVPN使用的就是它,很多轻量级用户态协议栈也有用到它,我们会给出下面的方案:




    又要用到“万能的bridge”。这是多么的麻烦,这是多么的可悲。

           正如MACVLAN替代VETH+Bridge一样,稍微该一下的MACVLAN也能替代TAP+Bridge,很简单,那就是将rx_handler实现修改一下,宿主以太网卡收到包之后,不交给MACVLAN的虚拟网卡上接口连接的协议栈,而是发到一个字符设备队列。很简单吧,这就是MACVTAP!




    遗憾的多队列TUN/TAP虚拟网卡技术

    这是老湿在2014年的时候做的,其实只是做了一些移植和修改工作。但是发现有了MACVTAP之后,我的这个版本瞬间就被爆了。遗憾!向之所欣,俯仰之间,已为陈迹。
    展开全文
  • (OK) 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN
  • Macvlan 和 IPvlan

    2019-09-21 05:59:40
    介绍 macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。macvlan 本质上是一种网卡虚拟化技术(最大优点是性能极好) 可以...
  • IPVLAN和MACVLAN的区别在于它在IP层进行流量分离而不是基于MAC地址,因此,你可以看到,同属于一块宿主以太网卡的所有IPVLAN虚拟网卡的MAC地址都是一样的,因为宿主以太网卡根本不是用MAC地址来分流IPVLAN虚拟网卡的...
  • IPVLAN和MACVLAN的区别在于它在IP层进行流量分离而不是基于MAC地址,因此,你可以看到,同属于一块宿主以太网卡的所有IPVLAN虚拟网卡的MAC地址都是一样的,因为宿主以太网卡根本不是用MAC地址来分流IPVLAN虚拟网卡的...
  • 我们常说的CNI,可以包括IPAM(IP地址管理),也可以不包括IPAM。不过,通过情况下,CNI插件的实现和 IPAM插件的实现是分开为不同的可执⾏⽂件的。但是如果你写到⼀起,这样的CNI也可以⽤。按照K8S本⾝规 范,我们在...
  • MAC VLANIP子网VLAN

    2020-05-23 21:34:55
    基于MAC VLAN配置方法: [H3C]vlan 2 to 255 [H3C]mac-vlan mac-address B00C-D1FF-FFFF mask FFFF-FF00-0000 vlan 10     #将前6位一致划分到vlan10中 [H3C]mac-vlan mac-address B00C-E1FF-...
  • 协议VLANIP子网VLAN的简介

    千次阅读 2011-07-21 10:31:15
    协议vlanip子网vlan的简介 协议vlanip子网vlan是对基于端口的vlan报文转发方式的一种补充。 协议vlan可以根据用户接收到的无标签报文的类型和封装格式决定报文所属vlan ip子网vlan则是通过所接收的无标签的...
  • 基于IP划分VLAN

    千次阅读 2015-09-09 22:47:50
    划分vlan的方法:1、基于vlan2、基于端口3、基于网络协议,例如IP4、基于策略常见的是如上四种,当然还有其他方法,但并不多见。其实在企业中,我也是基本依据端口来划分VLAN,划分VLAN的好处就不多赘述了,最重要的...
  • 1.创建VLAN并将接口加入VLAN,实现基于IP子网的VLAN可以透传当前接口。2.使能基于IP子网划分VLAN功能,并关联IP子网和VLAN,实现根据报文中的源IP地址或指定网段确定VLAN。配置介绍:Switch的配置文件#sysname ...
  • 基于IP地址划分VLAN

    万次阅读 2020-05-08 22:31:58
    1、当检测IP在192.168.10.0./24时,PC接入交换机时,将其划分为VLAN 10,且可以和VLAN 10的服务器通信 2、当检测IP在192.168.20.0/24时,PC接入交换机时,将其划分为VLAN 20,且可以和VLAN 20的服务器通信 SW1 <...
  • 1.创建VLAN并将接口加入VLAN,实现基于IP子网的VLAN可以透传当前接口。2.使能基于IP子网划分VLAN功能,并关联IP子网和VLAN,实现根据报文中的源IP地址或指定网段确定VLAN。配置介绍:Switch的配置文件#sysname ...
  • 基于ip子网划分vlan

    千次阅读 2020-07-16 18:13:50
    VLAN的高级配置二(基于ip子网划分vlan) 1.实验目的:掌握基于ip子网划分vlan的操作方法。 2.实验拓扑: 3.配置步骤。 3.1 LSW1的GE0/0/1口做trunk;LSW4的GE0/0/1口做trunk interface GigabitEthernet0/0/1 port ...
  • iproute 设置vlan命令

    2020-09-24 18:59:02
    [root]# ip link add link eth0 name eth0.1 type vlan id 1 [root]# ip link add link eth0 name eth0.2 type vlan id 2 [root]# ip addr add 192.168.1.1/24 dev eth0.1 brd + [root]# ip addr add 192.168.2.1/24...
  • 华为交换机怎么配置VLANVLANif接口IP地址?华为交换机想要配置VLANVLANif,该怎么配置呢?下面我们就来啊看看你详细的教程,需要的朋友可以参考下
  • 基于端口的静态VLAN  直接指示哪些端口是一个VLAN组,比如一个交换机上有8个端口,我们指示1,3,5,7为VLAN1分组,2,4,6,8为VLAN2分组, 不同的交换机之间也可以进行VLAN组别划分。... 基于IP地址的VLAN,则...
  • 基于IP子网划分VLAN 某企业拥有多种业务,如IPTV、VoIP、Internet等,每种业务使用的IP地址网段各不相同,为了便于管理,现在需要将同一种类型业务划分到同一个VLAN中; 创建VLAN: [sw1]vlan batch 10 20 30 接口...
  • 基于IP子网的vlan:在此之前,需要把之前的vlan配置清空,并且注意了基于IP子网、基于mac地址、基于协议的vlan功能只能在Hybrid端口配置 配置命令如下: SWA]vlan 10 [SWA-vlan10]ip-subnet-vlan ip 10.10.10.0...
  • 华为路由器、交换机配置 ...整个系列课程包含知识点:路由器交换机升级操作系统、备份恢复配置、系统口令恢复、系统升级失败拯救、 IP子网划分、arp、vlan、trunk、telnet、dhcp、acl、stp、Rip、ospf、bgp、防火墙等等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,518
精华内容 3,807
关键字:

ipvlan