Linux虚拟网络
Linux 虚拟网络
传统的物理网络,每一个物理Server都会有一个或多个物理网卡(NIC),这些NIC被连接在物理交换设备上。而虚拟化技术引入,虚拟机的网络功能可以由虚拟网卡(vNIC)提供,Hypervisor为每个虚拟机创建一个或多个(vNIC),同时Switch也被虚拟化为虚拟交换机(vSwitch)。
一个虚拟的二层网络主要完成NIC和交换设备的虚拟。
常用网络设备的虚拟化如下
TAP/TUN设备
TAP/TUN是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层。数据包的发送和接受都是通过TAP/TUN。
基于TAP驱动,可以实现虚拟网卡功能,每个vNIC和Hypervisor中的一个TAP设备相连,每当一个TAP设备创建,Linux设备目录就会生成一个与之对应的字符设备文件,用户空间可以像打开普通文件一样对这个文件进行读写。可以直接使用read/write系统调用。
Linux Bridge
网桥是工作在二层的虚拟网络设备,类似于物理的交换机,Bridge有多个端口,数据可以从多个端口进入,也可以根据不同的MAC地址,转发到不同的端口。
Bridge 工作在第二层,所以绑定在br0上的从设备不需要再设置IP地址,对于上层路由器来说,他们都位于同一子网。br0可以被加入路由表,并利用其发数据,当符合Bridge的IP地址到达,内核协议栈可以认为是本机的数据,应用程序通过Socket接受。限制就是Linux本机的IP会失效。
MACVTAP
传统的网络虚拟化技术是TAP+Bridge,将虚拟机连接到虚拟的TAP网卡,然后将TAP网卡绑定到LInux Bridge,本质上是用CPU模拟网路。存在以下缺点
- Bridge使网络拓扑复杂,增加交换机的级联层数
- 直接在Bridge上完成流量交换,流量监控,监管空难
- 增加服务器负担
MACVTAP,是Linux引入的新网络设备模型,代替TAP+Bridge组合。同一物理网卡上的各个MACVTAP设备,都拥有属于直接的MAC地址和IP地址。只需要直接在物理网卡eth0上建立MACVTAP设备。
Open vSwitch
Open vSwitch 是一个具有产品级质量的虚拟交换机,使云环境中的虚拟网络的管理和对网络状态和流量的监控变容易,提供对Open Flow的支持,接受Open Flow Controller的管理。
Linux Network Namespace
Linux Namespae对系统资源进行封装和隔离,处于不同的Namesapce进程拥有独立的全局系统资源,相互不影响。每个Network Namespace都拥有独立的网络栈,单独的网络设备,IP地址和端口号,IP路由表,防火墙规则,proc/net目录。
创建Network Namespace
1 | ip netns add NAME |
查看所有network namespace
1 | sudo ip netns list |
在对于的Network Namespace中穿件
1 | ip netns exec NAME ip add |
隔离的Network Namespace 通信,通过私用VETH pair,可以简单理解为管道
1 | ip link add type veth |
iptables/NAT
网络地址转换(NAT,Network Address Translation)普遍用在多个主机共用一个IP。Linux中NAT功能一般通过iptables实现,netfilter是iptables底层实现框架。
iptables/netfilter的规则格式如下
1 | 源地址 目的地址 传输协议(TCP,UDP,CMP) 服务类型 |
iptables主要包括FILTER,NAT和MANGLE三张表,分布负责数据包的过滤,网络地址转换和数据包内容修改。
虚拟网络隔离技术
虚拟局域网(VLAN)
LAN一般通过hub和switch连接。VLAN是将带有VLAN功能的Switch将直接的端口划分出多个LAN,将交换机在逻辑上分成了多个交换机,限制了广播的范围。VLAN实现二层的隔离,比如二层广播包(arp)无法跨域VLAN的边界,但是在三层(IP)可以通过路由器是机器互通,使用VLAN可以控制广播风暴,现在的交换机基本都支持VLAN。
虚拟局域网拓展
基于隧道技术,建立点对点的链接。将二层报文用三层协议封装,封装在UDP报文中,但实际目的是为了发送二层报文。
通用路由封装GRE
GRE也是基于隧道技术,可以封装多种协议包括IP,ARP,以太网帧。