为什么要有VPN
最初为了实现两个地点之间跨越公网通信,保护私网的安全,人们通常采用专线来实现私网之间的连接。专线存在:价格昂贵、使用不充分、带宽浪费严重等问题。
CE(customer edge)设备:客户边缘设备
PE设备(provider edge):运营商设备,连接客户设备
P设备(provider):运营商网络中的骨干设备
MPLS VPN的原因
两个客户的VPN存在相同的地址空间,传统VPN网络结构中的设备无法区分客户重叠的路由信息。
如果要解决地址冲突问题,必须对现有的协议进行大规模的修改,这就要求一个协议具有良好的可扩展性。而具备条件的协议一定是基于TLV(type、length、value)元素的。符合标准的只有EIGRP(思科私有)、BGP、ISIS(基于链路层封装)。
而BGP是最佳选择:
(1) 网络中VPN路由数目可能非常大,BGP是唯一支持大量路由的路由协议;
(2) BGP是基于TCP来建立连接,可以在不直连相连的路由器间交换信息,这使得P路由器中无须包含VPN路由信息;
(3) BGP可以运载附加在路由后的任何信息,作为可选的BGP属性,任何不了解这些属性的BGP路由器都将透明的转发它们,这使在PE路由器间传播路由非常简单。
要想真正解决地址冲突问题,至少需要有三个难题需要攻克:
(1) 本地路由冲突问题,即:在同一台PE上如何区分不同VPN的相同路由
(2) 路由在网络中的传递问题,两条相同的路由,都在网络中传播,对于接收者如何分辨彼此
(3) 报文的转发问题,即使成功的解决了路由表的冲突,但是当PE接收到一个IP报文时,他又如何能够知道该发给哪个VPN,因为IP报文头中唯一可用的信息就是目的地址,而很多VPN中都可能存在这个地址。
解决思路:
(1) 本地路由冲突问题,可以通过在同一台路由器上创建不同的路由表解决,而不同的接口可以分属不同的路由表中,这就相当于将一台共享PE模拟成多台专用PE;
(2) 可以在路由传递的过程中为这条路由再添加一个标识,用以区别不同的VPN
(3) 由于IP报文的格式不可更改,但可以在IP头之外加上一些信息,由始发的VPN打上标记,这样PE在接收报文时可以根据这个标记进行转发。
ip vpn-instance 1 //创建VPN实例1
route-distinguisher 1:1
int g 0/0/0
ip binding vpn-instance 1 //绑定VPN实例1
rip 1 vpn-instance 1
version 2
network 12.0.0.0
VRF:VPN路由转发实例(VPN Routing & Forwarding Instance)
vpn实例的路由表,仅在本地有效
display ip routing-table vpn-instance 1 //查看vpn实例1的路由表
RD:(Route Distinguisher)路由标识
每个VPN实例都有一个唯一的RD
RT:路由标签(target),用于将路由正确引入VPN
import:VPN路由的导入
export:VPN路由的导出
对方发来的export和自己的import相等表示可以接收
ip vpn-instance 1
vpn-target 100:1 import
1. 路由传递
①CE-->PE
CE的路由通过路由引入到PE的BGP的vpn实例中
②PE-->PE
MP_REACH_NLRI属性:多协议可达NLRI
携带路由、RD、私网label(作用是接收方辨别是哪个VRF的包,再从所有属于那个VRF的接口发送出去)
EXTENDED_COMMUNITIES 扩展团体属性
携带RT信息
在路由传递时PE给这个路由条目打上了extended_community即RT的值,同时还会打上mp_reach_nlri,包含路由、RD和私网label,这个label就是mpls vpn的内层标签,通过BGP路由通告给BGP邻居;邻居学到路由后,会用RT的import把路由条目过滤出来,得到vpnv4的路由条目,然后再把RD头去掉,得到普通的IPv4路由条目,并存在本地的VRF表中,同时得到私网label,存放在mpls转发表中。
入口PE---P---出口PE之间建立LDP邻居关系,用来学习PE之间的label,这个就是MPLS VPN的外层标签,其最终的目的是:把客户的包从入口PE转发到出口PE,然后在根据内层标签来分辨是哪个VRF的包,再从所有属于那个VRF的接口发送出去。
③PE-->CE
通过引入将BGP vpnv4学到的路由引入到CE设备的路由协议中
2. 流量传递
两层标签
内层决定查哪个VRF表