[转发]网络虚拟化技术(一): Linux网络虚拟化
来源:互联网 发布:网络黑侠哪本作品好 编辑:程序博客网 时间:2024/05/29 15:20
来源:点击打开链接 http://www.cnblogs.com/yudar/p/4630952.html
创建虚拟网络环境
使用命令
$ 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: <LOOPBACK> 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: <LOOPBACK> mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0081: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff82: veth1: <BROADCAST,MULTICAST> 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: <LOOPBACK> 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: <LOOPBACK> mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0081: veth0: <BROADCAST,MULTICAST> 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: <LOOPBACK> mtu 65536 qdisc noop state DOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0082: veth1: <BROADCAST,MULTICAST> 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
[ Link Layer Discovery Protocol ]
协议,我们可以清楚看到每个网卡连接到了哪些环境中的哪个网卡。
github 上有一个 lldp 在 linux 下的开源实现
[ implementation of IEEE 802.1ab (LLDP) ]
,通过在每个环境中起一个 lldp daemon,我们就可以实时查看每个网卡的连接情况
Bridge 上 lldp 的数据
$ lldpcli show neighborsLLDP neighbors:Interface: bridge-net0, via: LLDP, RID: 2, Time: 0 day, 00:06:53 Chassis: ChassisID: mac 82:be:2a:ec:70:69 SysName: localhost SysDescr: net0 Capability: Bridge, off Capability: Router, off Capability: Wlan, off Port: PortID: mac 82:be:2a:ec:70:69 PortDescr: net0-bridgeInterface: bridge-net1, via: LLDP, RID: 1, Time: 0 day, 00:06:53 Chassis: ChassisID: mac b2:34:28:b1:be:49 SysName: localhost SysDescr: net1 Capability: Bridge, off Capability: Router, off Capability: Wlan, off Port: PortID: mac b2:34:28:b1:be:49 PortDescr: net1-bridge
- [转发]网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术(一): Linux网络虚拟化
- 网络虚拟化技术
- 网络虚拟化技术
- 网络虚拟化技术
- [转发]网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
- KVM网络虚拟化(一)
- linux 网络虚拟化: macvlan
- Linux虚拟网络之tun(二)Raw包转发
- 网络虚拟化技术相关文章链接
- 网络虚拟化技术要点及实践
- 云计算数据中心网络虚拟化技术
- DP--Longest Ordered Subsequence
- dp--最长公共子序列
- dp--Bone Collector
- 双重背包-- Jin Ge Jin Qu hao
- 位运算笔记
- [转发]网络虚拟化技术(一): Linux网络虚拟化
- Android Studio混淆与发布
- Leetcode 399. Evaluate Division
- Spring源码学习之简单朴素的理解spring
- JS:求某个日期是当年的第几天
- JDK8的集合流式操作
- Linux Centos 下vim安装与配置
- Android正则表达式匹配字符串
- JSP之c:foreach