详解:Linux网络虚拟化技术
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。
本文从基本的网络设备讲起,到具体实验环节,希望能对 Linux 本身的虚拟网络环境有一个宏观的了解。
TUN 设备
TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为。先来看看物理设备是如何工作的:
所有物理网卡收到的包会交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户程序。下面看看 TUN 的工作方式:
普通的网卡通过网线收发数据包,但是 TUN 设备通过一个文件收发数据包。所有对这个文件的写操作会通过 TUN 设备转换成一个数据包送给内核;当内核发送一个包给 TUN 设备时,通过读这个文件可以拿到包的内容。
如果我们使用 TUN 设备搭建一个基于 UDP VPN,那么整个处理过程就是这样:
数据包会通过内核网络栈两次。但是经过 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 设备,其工作方式如下:
MACVLAN 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡。单独使用 MACVLAN 好像毫无意义,但是配合之前介绍的 network namespace 使用,我们可以构建这样的网络:
由于 macvlan 与 eth0 处于不同的 namespace,拥有不同的 network stack,这样使用可以不需要建立 bridge 在 virtual namespace 里面使用网络。
MACVTAP
MACVTAP 是对 MACVLAN的改进,把 MACVLAN 与 TAP 设备的特点综合一下,使用 MACVLAN 的方式收发数据包,但是收到的包不交给 network stack 处理,而是生成一个 /dev/tapX 文件,交给这个文件:
由于 MACVLAN 是工作在 MAC 层的,所以 MACVTAP 也只能工作在 MAC 层,不会有 MACVTUN 这样的设备。
创建虚拟网络环境
使用命令
- $ ip netns add net0
可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等。总之,与网络有关的组件都是独立的。
使用命令
- $ ip netns listnet0
可以看到我们刚才创建的网络环境
进入虚拟网络环境
使用命令
- $ ip netns exec net0
- `command`
我们可以在 net0 虚拟环境中运行任何命令
这样我们可以在新的网络环境中打开一个shell,可以看到,新的网络环境里面只有一个lo设备,并且这个lo设备与外面的lo设备是不同的,之间不能互相通讯。
连接两个网络环境
新的网络环境里面没有任何网络设备,并且也无法和外部通讯,就是一个孤岛,通过下面介绍的这个方法可以把两个网络环境连起来,简单的说,就是在两个网络环境之间拉一根网线。
- $ ip netns add net1
先创建另一个网络环境net1,我们的目标是把net0与net1连起来。
这里创建连一对veth虚拟网卡,类似pipe,发给veth0的数据包veth1那边会收到,发给veth1的数据包veth0会收到。就相当于给机器安装了两个网卡,并且之间用网线连接起来了。
- $ ip link set veth0 netns net0
- $ ip link set veth1 netns net1
这两条命令的意思就是把veth0移动到net0环境里面,把veth1移动到net1环境里面,我们看看结果。
veth0 veth1已经在我们的环境里面消失了,并且分别出现在net0与net1里面。下面我们简单测试一下net0与net1的联通性。
分别配置好两个设备,然后用ping测试一下联通性:
一个稍微复杂的网络环境
创建虚拟网络环境并且连接网线。
ip netns add net0ip netns add net1ip netns add bridgeip link add type vethip link set dev veth0 name net0-bridge netns net0ip link set dev veth1 name bridge-net0 netns bridgeip link add type vethip link set dev veth0 name net1-bridge netns net1ip link set dev veth1 name bridge-net1 netns bridge
在bridge中创建并且设置br设备:
ip netns exec bridge brctl addbr brip netns exec bridge ip link set dev br upip netns exec bridge ip link set dev bridge-net0 upip netns exec bridge ip link set dev bridge-net1 upip netns exec bridge brctl addif br bridge-net0ip netns exec bridge brctl addif br bridge-net1
然后配置两个虚拟环境的网卡:
测试:
OK,以上便是今天的内容。
详解:Linux网络虚拟化技术相关推荐
- 网络安全nmap扫描端口命令详解linux网络探测
简介: nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting).它是网络管理员必用的 ...
- 详解Linux内核IO技术栈
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 在开始正式的讨论 ...
- 详解“硬核”虚拟化技术SR-IOV原理
2007年9月,PCI-SIG官方发布了<Single Root I/O Virtualization and Sharing Specification Revision 1.0>规范, ...
- linux网络服务详解,Linux网络服务器配置基础详解 (3)
Linux网络服务器配置基础详解 (3) Linux网络服务器配置基础详解 (3) 第三步:编辑"inetd.conf"文件(vi /etc/inetd.conf),禁止所有不需要 ...
- linux常用网络命令详解,linux网络命令详解(鸟哥)
[root@linux ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae] [-qX] [-r 檔案] [所欲擷取的資料內容] 參數: -nn:直接以 ...
- Linux网络虚拟化基石 network namespace
1 网络虚拟化基石 network namespace Linux的namespace的作用就是"隔离内核资源". 在Linux的世界里,文件系统挂载点.主机名.POSIX进程间通 ...
- 超详细!一文详解容器网络发展
推荐大家关注一个公众号 点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Somethings,I don't ta ...
- VxLAN网络虚拟化技术详解(HCIE)
学习目标: 1.了解VxLAN解决的问题 2.了解VxLAN的专业术语NVO3.NVE.VTEP.VNI 3.通过实验来深入了解VxLAN 4.了解VxLAN的报文封装 VxLAN的由来 VPN种类大 ...
- 网络虚拟化技术(一): linux网络虚拟化,网络虚拟化技术(一): Linux网络虚拟化...
网络虚拟化技术(一): Linux网络虚拟化 2018-12-11 01 March 2013 笔者现在在做云计算的网络设计,涉及到上百台服务器与交换机,在实测前必须进行原型测试,但是我只有一个工作用 ...
最新文章
- 离散信号与系统分析(上)
- 科大星云诗社动态20201119
- Shell 脚本的时间的加减,以及时间差的计算
- 图解浏览器缓存,教你提高用户体验
- oo第一次博客-三次表达式求导的总结与反思
- Windows 用户怒了!系统漏洞简直泛滥成灾
- 【2021Java最新学习路线】java前端开发
- SQL Server性能调优:资源管理之内存管理篇(上)
- Android studio 不能识别(显示?????)部分手机的解决办法
- 使用Newtonsoft JsonConvert反序列化Json数据到DataTable
- Atitit 图像处理 halcon类库的使用 范例边缘检测 attilax总结
- 1067 Sort with Swap(0, i) (25 分) 好,容易出错
- 响应式布局基础知识详解
- faker假数据php,php faker 伪造数据
- 小样本(少样本)目标检测概述(few-shot object detection)
- 浅谈大数据专业的就业前景
- Arcgis API For js 的离线部署
- sklearn 中的Ridge函数
- 10.3国庆作业(UART实验)
- 本科计算机辅导,计算机及应用自考本科辅导
热门文章
- javadoc: 错误 - 无效的标记: --source-path 解决方式
- 关于微软excel在线预览的使用小记
- 生成excel文档即便没有安装微软Excel
- “奥特维速度”:光伏设备国产化按下快进键
- 建筑企业施工现场推行5S管理的基本原则
- 一个油腻的中年大叔重新捡起硬件开发,不为别的,就为了兴趣和不得老年痴呆
- Java代码通过JDBC连接Hiveserver2
- CAD生成外轮廓线插件v1.0绿色版
- 【转】php中的会话机制(2)
- python爬去智联招聘网_Python爬虫爬取智联招聘(进阶版)