Linux开源网络全栈详解——笔记
Linux虚拟网络TAP/TUP设备TAP/TUN是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层。Linux内核通过TAP/TUP设备向绑定该设备的用户空间应用发送数据;反之,用户空间也可以像操作硬件网络设备那样,通过TAP/TUN设备发送数据。基于TAP驱动,即可以实现虚拟网卡的功能,虚拟机的每个vNIC都与Hypervisor中的一个TAP设备相连。当一个TAP设备
Linux虚拟网络
TAP/TUP设备
TAP/TUN是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层。Linux内核通过TAP/TUP设备向绑定该设备的用户空间应用发送数据;反之,用户空间也可以像操作硬件网络设备那样,通过TAP/TUN设备发送数据。
基于TAP驱动,即可以实现虚拟网卡的功能,虚拟机的每个vNIC都与Hypervisor中的一个TAP设备相连。当一个TAP设备被创建时,Linux设备文件目录下将会生成一个与之对应的字符设备文件,用户空间应用可以像打开普通文件一样打开这个文件进行读写。
当对TAP设备文件执行write()操作时,对于Linux网络子系统来说,相当于位于内核空间的TAP设备收到了数据,Linux内核收到此数据将根据网络配置进行后续处理,处理过程类似于普通的物理网卡从外界收到数据。
当用户空间执行read()请求时,相当于向内核查询TAP设备上是否有数据需要被发送,有的话则取出到用户空间里,从而完成TAP设备发送数据的工能。
Linux Bridge
Linux Bridge(网桥)是工作在二层的虚拟网络设备,功能类似于物理交换机。对于普通的网络设备来说,只有两端,从一端进来的数据会从另一端出去。而Bridge不同,Bridge有多个端口,数据可以从任何端口进来,进来之后要从哪个端口出去要看MAC地址,和物理交换机的原理相似。
Bridge可以绑定其他Linux网络设备作为从设备,并将这些从设备虚拟化为端口,当一个从设备被绑定到Bridge上时,就相当于真实网络中的交换机端口插入了一个连接有终端的网线。
因为Bridge工作在第二层,所以绑定在br0上的从设备eth0、tap0与tap1均不需要再设置IP地址,对上层路由器来说,他们都位于同一子网,因此只需为br0设置IP地址(Bridge设备虽然工作与二层,但它只是Linux网络设备抽象的一种,能够设置IP地址也可以理解)。
因为具有自己的IP地址,br0可以被加入路由表,并利用它发送数据,而最终实际发送的过程则由某个从设备来完成。
Bridge的实现有一个限制:当一个设备被绑定到Bridge上时,该设备的IP地址会变得无效,Linux不再使用该IP地址在三层接收数据。
MACVTAP
传统的Linux网络虚拟化技术采用的是TAP+Bridge方式,将虚拟机连接到虚拟的TAP网卡,然后将TAP网卡绑定到Linux Bridge。这种方法实际上就是使用软件,用服务器的CPU模拟网络。但是这种方法有三个缺点:
-
每台主机都存在在Bridge会使网路拓扑变得复杂,相当于增加了交换机的及联层数。
-
同一宿主机上虚拟机之间的流量直接在Bridge完成交换,使流量监控、监管变得困难。
-
Bridge是软件实现的二层交换技术,会加大服务器的负担。
针对云计算中的复杂网络问题,业界主要提出了两种技术标准进行扩展:802.1Qbg和802.1Qbh。802.1Qbh主要由VNware与Cisco提出,尝试从接入层到汇聚层提供一个完整的虚拟化网络解决方案,尽可能达到通过软件定义一个可控网络的目的。需要新的网络设备支持,成本较高。
802.1Qbg主要由HP等公司提出。尝试较低成本利用现有设备改进软件模拟的网络。为了支持这种新的虚拟化技术,Linux引入了新的网络设备模型——MACVTAP,用来简化虚拟化环境下的桥接网络,代替传统的TAP+Bridge组合,同时支持新的虚拟化网络技术。
MACVTAP和Bridge比较相似,但因为它省去了Bridge,所以配置和调试起来比较简单,而且效率也相对更高。
MACVTAP设备支持的三种操作模式:
-
VEPA模式:VEPA模式是默认模式。两个在同一个物理网卡上的MACVTAP设备(都处于VEPA模式)通信,网络数据会从一个物理网卡上的MACVTAP设备通过底层的物理网卡发往外界的交换机。此时,外界交换机必须支持Hairpin模式,只有这样才可以把网络数据重新送回物理网卡,传给此物理网卡上的另一个MACVTAP设备。
-
桥接模式:在同一物理网卡上的所有桥接模式的MACVTAP设备直接两两互通,它们之间的通信,网络数据不会经过外界交换机。
-
似有模式:类似于VEPA模式时外界交换机不支持Hairpin模式的情况。此时,同一个物理设备上的MACVTAP设备之间不能通信。
Open vSwitch
是一个具有产品级质量的虚拟交换机,C语言编写,可移植性强(不同虚拟化平台),遵循Apache2.0.
vSwitch负责连接vNIC与物理网卡,同时也桥接同一物理Server内的各个vNIC。
传统数据中,网络管理员可以通过对交换机的端口进行一定的配置。可以很好控制物理机网络的接入,完成网络隔离、流量监控、数据包分析、Qos设置、流量优化等。
但在云环境中,仅凭物理交换机的支持,管理员无法区分被桥接的物理网卡上流淌的数据包属于哪个VM、OS、用户。
Open vSwitch引入使云环境中虚拟网络的管理以及对网络状态和流量监控变得容易。
Open vSwitch在云环境中的各种虚拟化平台上(Xen、KVM)实现了分布式的虚拟交换机。一个物理上的vSwitch上的vSwitch可以透明地与另一个Server上的vSwitch连接在一起。
Linux Network Namespace
提供了对系统资源的封装和隔离,处于不同Namespace的进程拥有独立的全局系统资源,改变一个Namespace中的系统资源只会影响当前Namespace里的进程,对其他Name space中的进程没有影响。
Network Namespace提供了对网络资源的隔离,拥有自己独立的网络栈、单独的网络设备、IP地址和端口号、IP路由表、防火墙规则、/proc/net目录。
如果不考虑内存、CPU等其他共享资源,仅从网络角度来看,Network Namespace就和一台虚拟机一样,可以在一台机器上模拟出多个完整的协议栈。
iptables/NAT
网络地址转换(NAT)是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。
这种技术被普遍使用在有多台主机通过一个公有IP地址访问外部网络的私有网络中,NAT也可以被称做IP伪装。
可以分为目的地址转换(DNAT)和源地址转换(SNAT)。
DNAT主要用在从公网访问内部私网的网络数据流中。
SNAT主要用在从内部私网访问公网的网络数据流中。
Linux中的NAT功能一般通过iptables实现。iptables是基于Linux内核的功能强大的防火墙。
iptables/netfilter作为内核底层的实现框架而存在。他提供了一整套对book函数管理的机制,可以在数据包流经的5处关键地方(Hook点),分别是PREROUTING(路由前)、INPUT(数据包入口)、OUTPUT(数据包出口)、FORWARD(数据包转发)、POSTROUTING(路由后),写入一定的规则对经过的数据包进行处理,规则一般定义为“如果数据包头符合这样的条件,就这样处理数据包”。
iptables/netfilter是按照规则来工作的,这些规则分别指定了源地址、目的地址、传输协议(TCP、UDP、CMP)和服务类型(HTP、FP、SMTP)等。
数据包与规则匹配时,iptables就根据规则定义的方法处理这些数据包,比如放行、拒绝、丢弃等。
配置防火墙的主要工作就是添加、修改、和删除这些规则。
iptables/netfilter的工作流程如下:
防火墙为了达到“防火”的目的,就需要在内核中设置关卡,所有进出的报文都要通过这些关卡。
虚拟网络隔离技术
可扩展性、安全性、可管理性等方面对网络隔离提出了新要求。
虚拟局域网
LAN(本地局域网)中的所有成员都会收到任意一个成员发出的广播包。
VLAN(虚拟局域网)表示一个带有VLAN功能的Switch能将自己的端口划分为多个LAN。
VLAN将一个交换机在逻辑上分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的VLAN中。
使用VLAN,能够更好地控制广播风暴,提高网络整体的安全性,也能使网络管理更加简单直观。
不同的VLAN由VLAN tag(VID)标明。
现在的交换机都支持VLAN。交换机的端口通常有两种配置模式:Access和Trunk。
Access端口被打上了VLAN tag,表明该端口属于哪个VLAN,Access端口只能属于一个VLAN。Access端口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入Access端口后就被打上了所在的VLAN tag。
Trunk端口一般用于交换机之间的连接,可以允许多个VLAN通过,可以接收和发送多个VLAN的报文。
如果划分了VLAN,但是没有配置Trunk,那么交换机之间的每个VLAN之间通信都要通过一条线路来实现。
对于Linux来说,可以通过Linux Bridge、物理网卡等模拟交换机的VLAN环境。
虚拟局域网扩展(VxLAN)
VxLAN是基于隧道(Tunnel)的一种网络虚拟化技术。隧道是一个虚拟化的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在通路的两端分别对数据报文进行封装及解封装。
隧道提供了一种某一特定网络技术的PDU穿过不具备该技术转发能力的网络的手段,如组播数据包穿过不支持组播的网络。
VxLAN将二层报文用三层协议进行封装。可以对二层网络在三层范围内进行扩展。
VxLAN应用于数据中心内部,是虚拟机可以在互相连通的三层网络范围内迁移而不需要改变IP地址和MAC地址,保证业务的连续性。
通用路由封装GRE
GRE也是基于隧道的一种网络虚拟化技术。与VxLAN相比,GRE使用的是IP报文而非UDP作为传输协议。
VxLAN只能封装二层以太网数据帧,而GRE可以封装多种不同的协议,包括IP报文、ARP、以太网帧等。
在GRE隧道中,路由器会在封装数据包的IP头部指定要携带的协议,并建立到对端路由的虚拟点对点连接。
相比于VxLAN,GRE更加灵活,可以支持的协议也更多。但是目前物理网卡支持GRE协议的还不是很多,大部分GRE协议的处理还要依靠主机CPU,会增加CPU的负载。
通用网络虚拟化封装(Geneve)
为了应对VLAN只能有4094的上限,利用隧道技术,产生了诸如VxLAN、NVGRE、STT(无状态传输隧道)等多种技术来实现虚拟网络的隔离要求。但是这类技术互不相兼容,所以提出了通用网络虚拟化封装(Geneve)。
Geneve技术的RFG正式标准还没有产生,还处于IETF草案状态。
Geneve的目的是适应虚拟网络技术的发展和隔离要求,定义一种通用的网络虚拟化隧道封装协议,能尽可能兼容目前的VxLAN、NVGRE等RFC标准的功能。
提出可扩展性来应对以后虚拟网络技术的发展。
Geneve综合了VxLAN和NVGRE两者的特点,首先使用了UDP作为传输协议,同时吸收了GRE可以封装不同类型数据包的优点。
Geneve包头中有一个24bit的VNI字段,可以用来指定不同的虚拟忘咯ID。同时,包头中也有type字段,用来指定封装的内部报文协议。
更多推荐
所有评论(0)