网络虚拟化技术(一): Linux网络虚拟化

2018-12-11

01 March 2013

笔者现在在做云计算的网络设计,涉及到上百台服务器与交换机,在实测前必须进行原型测试,但是我只有一个工作用开发机,本文介绍一种方法,使用这一台机器模拟数十台服务器以及路由器的网络环境。

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

创建虚拟网络环境

使用命令

$ ip netns add net0

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

ip命令需要root权限的,但是由于本文大量使用ip命令,于是笔者给ip命令添加了capability,使普通用户也能使用ip命令

使用命令

$ ip netns listnet0

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

进入虚拟网络环境

使用命令

$ ip netns exec net0 `command`

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

$ ip netns exec net0 bash$ ip ad1: lo: mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

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

连接两个网络环境

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

$ ip netns add net1

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

$ ip link add type veth$ ip ad1: lo: mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0081: veth0: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff82: veth1: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 32:4f:fd:cc:79:1b brd ff:ff:ff:ff:ff:ff

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

$ ip link set veth0 netns net0$ ip link set veth1 netns net1

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

$ ip ad1: lo: mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00$ ip netns exec net0 ip ad1: lo: mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0081: veth0: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff$ ip netns exec net1 ip ad1: lo: mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0082: veth1: mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 32:4f:fd:cc:79:1b brd ff:ff:ff:ff:ff:ff

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

$ ip netns exec net0 ip link set veth0 up$ ip netns exec net0 ip address add 10.0.1.1/24 dev veth0$ ip netns exec net1 ip link set veth1 up$ ip netns exec net1 ip address add 10.0.1.2/24 dev veth1

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

$ ip netns exec net0 ping -c 3 10.0.1.2PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.101 ms64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.057 ms64 bytes from 10.0.1.2: icmp_req=3 ttl=64 time=0.048 ms--- 10.0.1.2 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 1999msrtt min/avg/max/mdev = 0.048/0.068/0.101/0.025 ms

一个稍微复杂的网络环境

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

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

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

ip netns exec net0 ip link set dev net0-bridge upip netns exec net0 ip address add 10.0.1.1/24 dev net0-bridge

ip netns exec net1 ip link set dev net1-bridge upip netns exec net1 ip address add 10.0.1.2/24 dev net1-bridge

测试

$ ip netns exec net0 ping -c 3 10.0.1.2PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.121 ms64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.072 ms64 bytes from 10.0.1.2: icmp_req=3 ttl=64 time=0.069 ms--- 10.0.1.2 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 1999msrtt min/avg/max/mdev = 0.069/0.087/0.121/0.025 ms

配置lldpd检查线路链接情况

随着虚拟网络环境增加,环境中网卡数量也在不断增加,经常会忘记环境中哪些网卡连接到哪里,通过 lldp [2] 协议,我们可以清楚看到每个网卡连接到了哪些环境中的哪个网卡。

github 上有一个 lldp 在 linux 下的开源实现 [3],通过在每个环境中起一个 lldp daemon,我们就可以实时查看每个网卡的连接情况

Bridge 上 lldp 的数据

网络虚拟化技术(一): linux网络虚拟化,网络虚拟化技术(一): Linux网络虚拟化...相关推荐

  1. vmware服务器虚拟化部署sdn,使用VMware的NSX多面落地软件定义网络SDN视频课程

    1 为什么需要SDN及它的定义.争议.落地 分解初涉人群理解数据中心SDN的难点在哪里,先通过举个一典型云计算的交付环境DCaas交付来落地SDN,首先理解DCaas是什么,它是如何发展起来的.物理基 ...

  2. Linux篇 | 多网卡绑定技术 binding 和 网络组nmcli

    多网卡绑定 "Bonding" 和 "nmcli的网络组Network Teaming" 二者实现的功能一样,但从某种角度,网络组要比Bonding的技术要好 ...

  3. 未来互联网技术发展编年史,从阿帕网到完全可编程网络

    目录 文章目录 目录 编者按 从冷战背景说起 APRA 成立 ARPANET 项目启动 ARPANET 的诞生 TCP/IP 协议与 Internet 的诞生 HTTP 协议与 Web 世界的诞生 R ...

  4. 数据中心网络架构的问题与演进 — 传统路由交换技术与三层网络架构

    戳蓝字"CSDN云计算"关注我们哦! 文章目录 目录传统路由交换技术路由和交换交换技术传统的 2 层交换技术具有路由功能的 3 层交换技术具有网络服务功能的 7 层交换技术路由技术 ...

  5. [云数据中心] 《云数据中心网络架构与技术》读书笔记 第七章 构建多数据中心网络(1/3)

    7.1 多数据中心的业务诉求场景 7.1.1 多数据中心的业务场景分析 主流需求:虚拟化和资源池化,形成多活,可就近提供服务 1. 业务跨数据中心部署 2. 两地三中心 是指在同城双活的数据中心基础上 ...

  6. kali Linux Web 渗透测试视频教程— 第六课 网络扫描-nmap与zmap

    Kali Linux Web 渗透测试视频教程- 第六课 网络扫描-nmap与zmap 文/玄魂 目录 Kali Linux Web 渗透测试视频教程- 第六课 网络扫描-nmap与zmap. 1 N ...

  7. Linux内核有加网速功能吗,Linux下使用有线网络和WiFi能不能叠加网速?网友评论不一...

    有人在Linux操作系统下同时使用有线网络和WiFi,都已经连接上两个不同的网络,看能不能将这两个网络的速度叠加起来?形成一股更快速的网络环境.比如假设一条有线宽带50M,一个WiFi 50M,如果是 ...

  8. Linux多网卡绑定(bond)及网络组(team)

    Linux多网卡绑定(bond)及网络组(team)   很多时候,由于生产环境业务的特殊需求,我们需要对服务器的物理网卡实施特殊的配置,从而来满足不同业务场景下对服务器网络的特殊性要求.如高并发的网 ...

  9. 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

    文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...

  10. Linux高并发服务器开发---笔记4(网络编程)

    0705 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.2 Linux系统编程1.4.3 Linux系统编程2 4.4 多进程 1-9 10.进程间通信☆☆☆ 4.5 ...

最新文章

  1. Ember.js 入门指南——查询记录
  2. win7 win10 win8系统文件夹重命名要刷新下文件名才会改变,桌面也不会自动刷新...
  3. 浅谈JDBC与ODBC的区别与应用
  4. English trip M1 - AC6 How to make salad? Teacher:Patrick
  5. 微信小程序 wx.request异步网络请求
  6. IBatis常见错误集锦
  7. redmine备份_Redmine 数据迁移记录
  8. python封装 继承 多态 举例_python面向对象中的封装、继承、多态
  9. java web服务 分层,java web分层之——三层架构
  10. 陈天艺1636050045假设跑步者1小时40分钟35秒跑了24英里。编写一个程序显示每小时以公里为单位的平均速度值...
  11. linux 暴力删除文件,暴力删除文件
  12. 史上最贵黑客事件!中本聪用代码亲手杀死 1844.67 亿枚比特币!
  13. videojs默认显示controls 按钮功能失效_一文看懂Yearning SQL审核平台功能模块设计...
  14. 面试题:String StringBufere StringBuilder 不用看
  15. 荷花用计算机怎么画,怎样画荷花荷叶简笔画
  16. arcgis数据量大显示慢_优化MapGIS地图显示速度我的七个方法
  17. php颜色淡入代码,JavaScript_jquery 淡入淡出效果的简单实现,样式:复制代码 代码如下:nbsp - phpStudy...
  18. win mysql 命令行提示_数据分析进阶——mysql基本语句
  19. 微信数据如何与服务器配置,微信公众平台里的服务器配置设置是干什么用的
  20. html与python_Python和显示HTML

热门文章

  1. android有关的笔记,android学习笔记1——webview相关
  2. 一个子数组最大值的问题
  3. idea基于spring boot的依赖分开打包
  4. “==”和equals()那些事
  5. IT职场人生系列之五:怎样面试
  6. if 判断成绩 ,整百制
  7. 集群、分布式、负载均衡区别与联系
  8. [笔试题目] 美团2015年9月后端开发工程师笔试题
  9. 【数据结构与算法】之深入解析“比特位计数”的求解思路与算法示例
  10. 【数据结构与算法】之连通网络的操作次数的算法