[转帖]linux 网络虚拟化: ipvlan

linux,网络,虚拟化,ipvlan · 浏览次数 : 0

小编点评

## ipvlan 和 macvlan 的区别 | 特征 | ipvlan | macvlan | |---|---|---| | mac 地址 | 与虚拟网卡接口相同的 IP 地址 | 与物理网络接口不同的 IP 地址 | | 虚拟网络数量 | 多个 | 单个 | | ip 地址范围 | 与物理网络接口相同的 IP 地址 | 与物理网络接口不同的 IP 地址 | | 使用场景 | 建立复杂的网络拓扑,例如 BGP 网络 | 建立简单网络拓扑,例如 VLAN | ## ipvlan 的优点 * 支持 L3 模式,可以进行不同网络之间的路由转发。 * 避免了 macvlan 中的 IP 地址冲突问题。 * 对于需要构建复杂的网络拓扑的应用场景更适合。 ## ipvlan 的缺点 * 与 macvlan 相似,需要指定 ClientID 字段,配置 DHCP 服务器使用该字段作为机器标识。 * L3 模式可能导致网络性能下降。 ## ipvlan 的应用场景 * 建立复杂网络拓扑,例如 BGP 网络。 * 需要使用 L3 模式,例如与路由器的路由转发。 * 需要在容器中设置 ClientID 字段,配置 DHCP 服务器使用该字段作为机器标识。

正文

https://cizixs.com/2017/02/17/network-virtualization-ipvlan/

 

简介

IPVlan 和 macvlan 类似,都是从一个主机接口虚拟出多个虚拟网络接口。一个重要的区别就是所有的虚拟接口都有相同的 macv 地址,而拥有不同的 ip 地址。因为所有的虚拟接口要共享 mac 地址,所有有些需要注意的地方:

  • DHCP 协议分配 ip 的时候一般会用 mac 地址作为机器的标识。这个情况下,客户端动态获取 ip 的时候需要配置唯一的 ClientID 字段,并且 DHCP server 也要正确配置使用该字段作为机器标识,而不是使用 mac 地址

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

两种模式

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

L2 模式

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

L3 模式

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

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

实验

实验环境:

➜  ~ uname -a
Linux cizixs-ThinkPad-T450 4.4.0-57-generic #78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
➜  ~ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:    16.04
Codename:    xenial

先创建两个用做测试的 network namespace,关于 namespace 可参考之前的文章

➜  ~ sudo ip netns add net1
➜  ~ sudo ip netns add net2

然后创建出 ipvlan 的虚拟网卡接口,因为 L2 和 macvlan 功能相同,我们这里测试一下 L3 模式。创建 ipvlan 虚拟接口的命令和 macvlan 格式相同:

➜  ~ sudo ip link add ipv1 link eth0 type ipvlan mode l3
➜  ~ sudo ip link add ipv2 link eth0 type ipvlan mode l3

把 ipvlan 接口放到前面创建好的 namespace 中:

➜  ~ sudo ip link set ipv1 netns net1
➜  ~ sudo ip link set ipv2 netns net2
➜  ~ sudo ip netns exec net1 ip link set ipv1 up
➜  ~ sudo ip netns exec net2 ip link set ipv2 up

给两个虚拟网卡接口配置上不同网络的 ip 地址,并配置好路由项:

➜  ~ sudo ip netns exec net1 ip addr add 10.0.1.10/24 dev ipv1
➜  ~ sudo ip netns exec net2 ip addr add 192.168.1.10/24 dev ipv2
➜  ~ sudo ip netns exec net1 ip route add default dev ipv1
➜  ~ sudo ip netns exec net2 ip route add default dev ipv2

测试两个网络的连通性:

➜  ~ sudo ip netns exec net1 ping -c 3 192.168.1.10
PING 192.168.1.10 (192.168.1.10) 56(84) bytes of data.
64 bytes from 192.168.1.10: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 192.168.1.10: icmp_seq=2 ttl=64 time=0.035 ms
64 bytes from 192.168.1.10: icmp_seq=3 ttl=64 time=0.036 ms

--- 192.168.1.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.035/0.041/0.053/0.009 ms

docker ipvlan 网络

docker(v1.13) 也在开发对 ipvlan 的支持,不过目前只是 experiment 阶段。你可以安装最新版的 docker 来进行测试:


# 首先是创建 ipvlan 的网络,这和 macvlan 网络的操作基本一致,只是把 driver 修改成 `ipvlan`,然后选项中通过 `ipvlan_mode=l3` 设置 ipvlan 的工作模式:

docker network  create  -d ipvlan \
    --subnet=192.168.30.0/24 \
    -o parent=eth0 \
    -o ipvlan_mode=l3 ipvlan30

# 启动两个容器,可以发现在同一个 ipvlan 的两个容器可以互相 ping 通
docker run --net=ipvlan30 -it --name ivlan_test3 --rm alpine /bin/sh
docker run --net=ipvlan30 -it --name ivlan_test4 --rm alpine /bin/sh

# 再创建另外一个 ipvlan 网络,和前面的网络不在同一个广播域
docker network  create  -d ipvlan \
    --subnet=192.168.110.0/24 \
    -o parent=eth0 \
    -o ipvlan_mode=l3 ipvlan110

# 在新建的网络中运行容器,可以发现可以 ping 同前面网络中的容器
docker run --net=ipvlan30 -it --name ivlan_test3 --rm alpine /bin/sh

这里只介绍了最基本的 ipvlan 在 docker 中的使用,更多可以参考 docker 官方文档

ipvlan 还是 macvlan?

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

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

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

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

参考资料

与[转帖]linux 网络虚拟化: ipvlan相似的内容:

[转帖]linux 网络虚拟化: ipvlan

https://cizixs.com/2017/02/17/network-virtualization-ipvlan/ 简介 IPVlan 和 macvlan 类似,都是从一个主机接口虚拟出多个虚拟网络接口。一个重要的区别就是所有的虚拟接口都有相同的 macv 地址,而拥有不同的 ip 地址。因为

[转帖]Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

一.网络流量上不去二.中断绑定 2.1 关闭中断平衡守护进程 2.2 脱离中断平衡守护进程 2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下: 网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理

【转帖】Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

一.网络流量上不去二.中断绑定 2.1 关闭中断平衡守护进程 2.2 脱离中断平衡守护进程 2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下: 网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理

[转帖]macvlan 网络模式实现跨主机 Docker 通信

https://www.jianshu.com/p/cc481870236b macvlan 网络模式概念 macvlan 本身是 linux 内核的模块,本质上是一种网卡虚拟化的技术,其功能是允许在同一个物理网卡上虚拟出多个网卡,通过不同的 MAC 地址在数据链路层进行网络数据的转发。 一块网卡上

[转帖]命令行安装kvm虚拟机、桥接网络、用virt-manager管理

https://www.shuzhiduo.com/A/Ae5RDQpNzQ/ 前进的code 2022-11-10 原文 宿主机CentOS Linux release 7.2.1511 (Core),内核3.10.0-327.el7.x86_64 1、配置宿主机网络桥接 想让虚拟机有自己的ip且

[转帖]VMware-ovftool命令行部署与导出镜像

ESXI6.0之后管理为WEB,OVF导出/部署是个渣渣,如果虚拟机文件过大,一般会报网络异常中断而失败,可使用官方ovftool工具解决,快而方便,支持linux和Mac OSX,可脚本操作,批量处理等。 在windows如已经安装vmware workstation,有个OVFTool目录直接可

【转帖】【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重

目录 即看即用 详细信息 软件简介 安装 ethtool的使用 输出详解 其他指令 将 ethtool 设置永久保存 如何使用 ethtool 优化 Linux 虚拟机网卡性能 ethtool 解决网卡丢包严重和网卡原理 即看即用 查看: ethtool ethx 查看eth0网卡的基本设置 内容包

[转帖]关于Linux操作系统中LUN的队列深度(queue_depth)

Linux中的queue_depth(队列深度),可以用lsscsi查看。不过今天在我的vm 虚拟机环境中(无外界存储),是没有lsscsi命令。不过,从网上,搜到了如下的信息:$ lsscsi -l[0:0:1:0] disk FUJITSU MAM3184MP 0105 /dev/sda sta

[转帖]Linux 网络栈原理、监控与调优:前言(2022)

http://arthurchiao.art/blog/linux-net-stack-zh/ Published at 2022-07-02 | Last Update 2022-07-02 本文尝试从技术研发与工程实践(而非纯理论学习)角度,在原理与实现、监控告警、 配置调优三方面介绍内核5.1

[转帖]Linux 网络栈接收数据(RX):原理及内核实现(2022)

http://arthurchiao.art/blog/linux-net-stack-implementation-rx-zh/ Published at 2022-07-02 | Last Update 2022-08-28 Fig. Steps of Linux kernel receivin