|
|
51CTO旗下网站
|
|
移动端

详解:Linux网络虚拟化技术

Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。

作者:佚名来源:今日头条|2019-07-24 10:06

Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。

本文从基本的网络设备讲起,到具体实验环节,希望能对 Linux 本身的虚拟网络环境有一个宏观的了解。

TUN 设备

TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为。先来看看物理设备是如何工作的:

详解:Linux网络虚拟化技术

所有物理网卡收到的包会交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户程序。下面看看 TUN 的工作方式:

详解:Linux网络虚拟化技术

普通的网卡通过网线收发数据包,但是 TUN 设备通过一个文件收发数据包。所有对这个文件的写操作会通过 TUN 设备转换成一个数据包送给内核;当内核发送一个包给 TUN 设备时,通过读这个文件可以拿到包的内容。

如果我们使用 TUN 设备搭建一个基于 UDP VPN,那么整个处理过程就是这样:

详解:Linux网络虚拟化技术

数据包会通过内核网络栈两次。但是经过 App 的处理后,数据包可能已经加密,并且原有的 ip 头被封装在 udp 内部,所以第二次通过网络栈内核看到的是截然不同的网络包。

TAP 设备

TAP 设备与 TUN 设备工作方式完全相同,区别在于:

TUN 设备的 /dev/tunX 文件收发的是 IP 层数据包,只能工作在 IP 层,无法与物理网卡做 bridge,但是可以通过三层交换(如 ip_forward)与物理网卡连通。

TAP 设备的 /dev/tapX 文件收发的是 MAC 层数据包,拥有 MAC 层功能,可以与物理网卡做 bridge,支持 MAC 层广播

MACVLAN

有时我们可能需要一块物理网卡绑定多个 IP 以及多个 MAC 地址,虽然绑定多个 IP 很容易,但是这些 IP 会共享物理网卡的 MAC 地址,可能无法满足我们的设计需求,所以有了 MACVLAN 设备,其工作方式如下:

详解:Linux网络虚拟化技术

MACVLAN 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡。单独使用 MACVLAN 好像毫无意义,但是配合之前介绍的 network namespace 使用,我们可以构建这样的网络:

详解:Linux网络虚拟化技术

由于 macvlan 与 eth0 处于不同的 namespace,拥有不同的 network stack,这样使用可以不需要建立 bridge 在 virtual namespace 里面使用网络。

MACVTAP

MACVTAP 是对 MACVLAN的改进,把 MACVLAN 与 TAP 设备的特点综合一下,使用 MACVLAN 的方式收发数据包,但是收到的包不交给 network stack 处理,而是生成一个 /dev/tapX 文件,交给这个文件:

详解:Linux网络虚拟化技术

由于 MACVLAN 是工作在 MAC 层的,所以 MACVTAP 也只能工作在 MAC 层,不会有 MACVTUN 这样的设备。

创建虚拟网络环境

使用命令

  1. $ ip netns add net0 

可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等。总之,与网络有关的组件都是独立的。

使用命令

  1. $ ip netns list 
  2. net0 

可以看到我们刚才创建的网络环境

进入虚拟网络环境

使用命令

  1. $ ip netns exec net0  
  2. `command` 

我们可以在 net0 虚拟环境中运行任何命令

详解:Linux网络虚拟化技术

这样我们可以在新的网络环境中打开一个shell,可以看到,新的网络环境里面只有一个lo设备,并且这个lo设备与外面的lo设备是不同的,之间不能互相通讯。

连接两个网络环境

新的网络环境里面没有任何网络设备,并且也无法和外部通讯,就是一个孤岛,通过下面介绍的这个方法可以把两个网络环境连起来,简单的说,就是在两个网络环境之间拉一根网线。

  1. $ ip netns add net1 

先创建另一个网络环境net1,我们的目标是把net0与net1连起来。

详解:Linux网络虚拟化技术

这里创建连一对veth虚拟网卡,类似pipe,发给veth0的数据包veth1那边会收到,发给veth1的数据包veth0会收到。就相当于给机器安装了两个网卡,并且之间用网线连接起来了。

  1. $ ip link set veth0 netns net0 
  2. $ ip link set veth1 netns net1 

这两条命令的意思就是把veth0移动到net0环境里面,把veth1移动到net1环境里面,我们看看结果。

详解:Linux网络虚拟化技术

veth0 veth1已经在我们的环境里面消失了,并且分别出现在net0与net1里面。下面我们简单测试一下net0与net1的联通性。

详解:Linux网络虚拟化技术

分别配置好两个设备,然后用ping测试一下联通性:

详解:Linux网络虚拟化技术

一个稍微复杂的网络环境

详解:Linux网络虚拟化技术

创建虚拟网络环境并且连接网线。

  1. ip netns add net0 
  2. ip netns add net1 
  3. ip netns add bridge 
  4. ip link add type veth 
  5. ip link set dev veth0 name net0-bridge netns net0 
  6. ip link set dev veth1 name bridge-net0 netns bridge 
  7. ip link add type veth 
  8. ip link set dev veth0 name net1-bridge netns net1 
  9. ip link set dev veth1 name bridge-net1 netns bridge 

在bridge中创建并且设置br设备:

  1. ip netns exec bridge brctl addbr br 
  2. ip netns exec bridge ip link set dev br up 
  3. ip netns exec bridge ip link set dev bridge-net0 up 
  4. ip netns exec bridge ip link set dev bridge-net1 up 
  5. ip netns exec bridge brctl addif br bridge-net0 
  6. ip netns exec bridge brctl addif br bridge-net1 

然后配置两个虚拟环境的网卡:

详解:Linux网络虚拟化技术

测试:

详解:Linux网络虚拟化技术

OK,以上便是今天的内容。

最后

NDK基础开发流程—Linux流程大纲

详解:Linux网络虚拟化技术

【编辑推荐】

  1. 网络虚拟化VXLAN网络架构
  2. KVM虚拟化使用详解
  3. 虚拟化平台运维 10 个知识和经验
  4. 三分钟了解VRRP、堆叠、M-LAG这三大虚拟化技术
  5. 虚拟机不能上网?虚拟机和宿主机不能互通?一文搞定网络问题
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

292人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

649人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

框架设计(第2版)CLR Via C#

作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问,本书作者Jeffrey Richter针对开发各种应用程序(如Web Form、Windows For...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客