MPLS_VPN

MPLS

诞生

随着早期互联网的快速发展,人们担心简单的IP协议无法承载

进而开始了更复杂的网络层协议的研究,其中一个协议是ATM协议,但由于过于复杂,这个协议没有大范围取代IP

虽然ATM寄了,但它的几点思想启发了后来的MPLS:

摈弃了繁琐的路由查找,改为了简单快速的标签交换

将具有全局意义的路由表改为只有本地意义的标签表

这些都可以大大提高一台录取的转发功能

包头结构

相关概念

标签通过绑定过程和FEC相映射

FEC是转发等价类,是在转发过程中以等价方式处理的一组数据分组。就是不同的报文对于沿途的路由器都采用相同的动作,比如从A中同样的接口进来,再到B上同样的接口出去……就视为一组转发等价类

通常在一台设备上,对于一个FEC分配相同的标签

对于这个包走过的通道叫LSP,也叫标签交换通道

LSR,标签交换路由器,运行MPLS协议进行标签分发和交换的路由器

LER,MPLS网络的边界路由器,自身运行MPLS,有邻居不运行MPLS,因此会进行一些去标签和加标签的操作

MPLS转发依赖于IP转发

标签转发和IP转发的对比

IP转发时,每一条都要进行最长匹配原则的查找,为确定最长,要查路由表多次

先与mask进行与运算,再比较,并且要多次比较

标签转发只需要一次比较,没有与运算并且只查一次

评价FEC

不同目的地址却属于相同网段的报文在入口Ingress处被划分为同一个FEC,如果路由器启动了cache功能,那么标签可以做到少数几个标签匹配大量的报文,但IP地址却只能匹配主机路由

缺陷对于一个FEC,要求沿途所有设备都有完全相同的路由才能建成同一个LSP,换句话说,对于要使用标签转发的路由是不能做路由聚合的

比如一个FEC是从A的1口进,2口出,到B的3口进,4口出;另一个是从A的1口进,2口出,到B的3口进,1口出,那么在A上就必须有两个不同的标签对应相同的策略

让链路层知道自己是MPLS报文

以太网中使用0x8847和0x8848表示自己是MPLS报文

PPP中,增加了一种NCP,即MLPSCP来表示上层是MPLS

LDP标签分发协议

LDP的消息种类有四种

发现,通告和维护LSP

会话,建立维护和结束LDP对等体的会话连接

通告,创建改变和删除邻居关系

通知,提供消息通告和差错通知

LDP会话建立和维护

邻居发现:互发hello,UDP,port 646,目的IP地址224.0.0.2

建立TCP连接,通过hello里的IP地址,由地址较大的一方(Master)发起

由Master发送初始化消息,携带协商参数

slave检查参数能否接受,能则发送初始化消息并带协商参数,随后发送keepalive消息

master检查参数是否能接受,能则发送keepalive

互相收到keepalive,建立会话

期间接收到任何差错,关闭会话,断开TCP

状态转移图

标签的分发和管理

在一条LSP上,沿着数据包传送的方向,相邻的LSR分别叫做上游,下游

发路由信息则从下游到上游

一般LDP标签分配方式采用DU方式,即下游主动向上游发出标记映射信息

下游C发现自己的直连路由,主动分配一个标签,然后发给上游B;上游B收到之后,再随机生成一个,再给再上游A

A有到C的报文,会赋值B给定的标签,然后发给B,B接到相应标签的报文,赋值C给定的标签,给了C

该转发有水平分割,即“你告诉我的事情,我会告诉所有人,但不会再告诉你,因为这是你说的,你肯定比我更清楚”

保守方式和自由方式的区别:自由方式来着不拒,对于路由通知都收下;保守方式只保留路由下一跳邻居的标签(近的),丢弃非下一跳邻居发来的标签

谁是路由下一跳?近的是

标签向邻居的发送方式:有序和独立

有序指的是我只发自己家的直连路由,只有接收到别人的标签时,我才发自己学到的

独立指的是我连自己学到的也发出去

如果对于某条报文,没有它对应的标签,此时会按IP转发

入标签自己分给别人,出标签别人分给自己,同一台设备分的标签一定不同,不同设备分的标签可能相同

PHP倒数第二跳弹出

Egress LSR收到MPLS报文之后,会送给MPLS模块处理,但由于它是出口,实际上就不需要MPLS模块处理了

所以把取出IP报文的工作交给倒数第二跳

因此倒数第一跳会分给倒数第二条特殊的标记,3

路由环路预防

LSP建立依赖IP路由,因此不建立路由环路机制,交给IP来做

MPLS也有TTL,还是会减一

IP头的TTL就不会减一了

VPN

虚拟专用网络(VPN)的功能是:在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。

专用网络是指遵守RFC 1918和RFC 4193规范,使用私有IP地址空间的网络。私有IP无法直接连接互联网,需要公网IP转发。实现专用网络要铺设专线,就是专门修线连接想要连接的两个节点。类似于专门给你修一条马路,只准你家的车开。

专线太贵了,用不起,用加密过后的数据在公网上来回发,别人不知道是啥,也能达到虚拟的专用网络的效果。

这就是VPN技术,VPN协议有第二层隧道协议(L2TP、L2F、PPTP等),和第三层隧道协议(IPsec、GRE等)

所谓隧道,就是把一种报文打包,整个装到另一种报文里,是网络中常用的技术

常说的VPN是指把设备和专门的VPN服务器建立安全连接(利用的是VPN技术),之后上网时吧加密的数据发送到VPN服务器,VPN服务器

Overlay和Peer-to-peer两种VPN

CE、PE和P的定义

Overlay

1.在CE之间建立隧道,并直接传递路由信息,协议有GRE,IPSec

保密性、安全性很好,不同VPN用户可以使用相同的地址空间

但是需要客户自己创建并维护VPN,成本高

2.在CE和PE之间创建隧道,VPN的创建和维护完全交给运营商

安全性交给运营商,不同用户不能使用冲突的地址空间

无论哪种,Overlay VPN本质都是一种静态VPN,需要手动配置,并且无法反映网络的实时变化

Peer-to-Peer

指的是CE-to-PE,要在CE和PE之间交换私网路由信息。PE直接把私网路由传播

私网路由要泄露到公网上,出口端要做好过滤,通过路由控制确保同一个VPN的CE上只有本VPN的路由

1.共享PE方式

许多CE连接到相同PE,PE和不同的CE之间运行不同的路由协议,或者是相同协议的不同进程

防止同一PE连的CE互通,要配大量ACL,同样有地址冲突的问题

2.专用PE

可以用BGP,这样可以用BGP的community标记,方便过滤(发布时,community设为特定值,进入时,丢弃非该值的)

顾名思义,缺点是贵

Peer-to-Peer,本为了解决静态的问题,但问题是没有隧道技术,私网泄露,导致安全性差

同时,屏蔽了公网的访问,就上不了Internet

而且设备无法共享相同的地址空间

MPLS/BGP VPN

隧道技术有静态性,动态性的又没有隧道

需要动态建立的隧道技术,解决VPN共享相同地址空间的问题

MPLS就是动态建立的隧道技术

解决地址冲突需要BGP,基于TLV的设计的报文有良好的拓展性

解决方法:

1.不同接口创建不同路由表

2.在路由传递过程中加一个标识,区别不同的VPN

3.始发VPN在IP头之外打上标记,PE接收后根据这个标记转发

VRF——VPN路由转发实例

每个VRF可以看作虚拟的路由器,包括:

独立的路由表

一组属于这个VRF的接口集合

一组只用于本VRF的路由协议

扩展的community叫RT,表示自己的路由取舍和喜好的方式

发布RT是用来解决本地冲突的,他表示IP的归属,通过声明自己接受哪些RT,发布哪些RT来确定互访规则

RD来解决网络传输中的冲突,其实是BGP发相同地址的路由撤销报文才有用,用于区分不同的路由。在IP地址前加RD,变成VPN-IPv4地址族,用于区分相同的地址来自哪个VPN

以上解决了控制平面路由学习的问题,数据层面路由转发时也有冲突。同一台PE接收到远端PE发给本地的同一地址的不同VRF怎么办?再加一个由MP-BGP分配的标签,发送时带上,根据这个来区分

具体实现

1.PE维护多个路由表,一张公网的,若干张私网的即VRF的

PE和CE之间通过EBGP、OSPF、RIP或静态路由交换路由信息

静态路由和RIP需要每个VRF运行一套

EBGP也是普通的EBGP,只交换PE过滤后的本VPN路由

OSPF做了很多修改,可以将本site中的LSA放在bgp的扩展community属性中携带,与远端VPN中的ospf之间交换LSA。每个site中的ospf都可以存在area 0,骨干网可以看作super area 0

2.PE需要对一条路由进行如下操作:

加上RD,变为一条VPN-IPV4路由

更改下一跳属性为自己

加上私网标签

加上RT,export属性

发给所有的PE邻居

3.远端PE接收倒路由

还原为IP路由,根据本地VRF的import RT属性,加入到相应的VRF中

私网标签保留,留作转发时使用

再由本VRF的路由协议引入并转发给相应的CE

4.公网标签分发

只需要为BGP路由下一跳分标签