使用Linux作为MPLS路由器

2017年发生了两件大事: FRRouting项目启动,把原来需要打patch才能在Quagga上使用的ldpd合并进了主线 Cumulus公司把自己的VRF实现贡献给了Linux内核 Linux终于获得了能用的原生的MPLS(L3VPN)和VRF支持。不过三年以后,MPLS配置的完整文档尚付阙如。近日我经过研究和阅读各种零散的资料,成功在测试环境中配置了一个标准的MPLS核心网络架构,因此写一篇文章来分享配置过程以及路上遇到的各种坑。 MPLS? 只玩IP路由,不怎么接触大型运营商网络的同学们可能会对MPLS这个技术有些陌生。如果要打一个简单的比方,MPLS(L3VPN)就像是三层意义上的VLAN Trunking:路由器上把三层接口加入VRF(对应交换机上的VLAN),每个路由器上可以有多个虚拟的路由表(对应交换机上的ARP表),核心路由器之间传送的数据报文前面会被加上MPLS标签(对应交换机上的VLAN标签)保证多个路由表内的数据互不干扰。MPLS的好处有很多: 用同一组路由器为不同的客户提供不同种类的服务 允许不同的客户网使用相同的IP地址段 核心节点不需要查找路由表,只需要做简单的MPLS标签替换工作,增加了包转发性能 核心节点不需要保存客户的全量路由表,只需要负责转发,节约内存 可以实现在客户无感知的情况下把多地的同一客户设备连接起来,不同客户互相隔离 简化复杂的三层配置 可以设置特定流量走特定路径,方便负载均衡和冗余 这么好的协议,当然会有一些前提要求。MPLS是一个2.5层协议,也就是说它需要运行在二层之上。所以如果要启用MPLS,首先整个核心网路由器之间需要用支持二层的方式(例如Ethernet)连接,或者使用对MPLS做了特殊支持的非二层隧道(RFC2547bis,例如GRE或L2TP)。MPLS的数据报文有8字节的头部,因此你可能需要适当增大核心网的MTU。 MPLS核心网的路由器一般分为两类:P(Provider),即不连接任何客户设备的路由器,以及PE(Provider Edge),即连接客户设备的路由器。直接连接到PE的客户设备称为CE(Customer Edge)。其它理论知识在此就不细讲了,简单来说,MPLS的配置需要以下几步: 给每台P和PE设置loopback端口的固定IP 通过IGP让所有P和PE之间loopback IP都可以互相ping通 在每台P和PE上启动MPLS处理功能和LDP服务 在PE上配置iBGP,启动MP-BGP功能 在PE上配置VRF,并且将连接客户的端口加入相应的VRF 把客户的路由重分发到核心网的VRF路由表 接下来,我用一个简化版的实验室环境来演示一下Linux上MPLS的实际配置过程。 MPLS! 要解决的问题 假设我们是一个跨城市的小ISP,提供一种把客户在两个城市之间的站点连接起来的业务。业务的实现方式很简单,客户在两个城市分别拉一根网线到我们在同一城市的路由器,配置好IP,然后客户在两个城市的站点就魔法般互相接通了。有一天突然来了两个客户——暂且称之为customer1和customer2好了——都要购买我们的服务,巧的是,他们内网用的IP段是一模一样的。如果我们的核心网络使用传统IP技术互联的话,两个客户的内网可能就互通了,并且还会互相打架。但是如果我们的核心网络使用了MPLS技术,这个配置不费吹灰之力就可以完成。 说明: 所有连线均为以太网连接 核心网之间设备互联使用192.168.1.0/24段(点对点配置) 核心网每个设备有一个10.0.0.x/32的IP用于loopback 图片上的e0/e1/e2分别对应下面配置里的ens3/ens4/ens5 暂时不解决的问题 为了限制篇幅,以下问题本文不深入讨论: MTU不匹配问题(建议PE上MSS全部clamp到1410) CE和PE之间的动态路由协议 Linux网络栈的开机自动配置(动态创建的interface,sysctl配置之类的重启以后都会丢,如何使用网络管理软件在开机的时候把它们都正确配置起来就留给读者作为练习了。) VPLS(Linux目前还不支持pseudowire接口) LittleWolf的《[ Linux ] 使用 Debian Linux 构架 MPLS L3 网络》一文中演示了核心网络使用IS-IS以及CE和PE之间使用BGP实现动态路由的配置,推荐和本文一起阅读。 参考软件 图中所有设备使用以下软件: Debian 10(Linux 4.19.0) iproute2 4.20.0 FRRouting 7.

Continue reading

This entry was posted in Networking and tagged Linux on .

世界,您好!

欢迎来到Drown in Codes。这是您的第一篇文章。编辑或删除它,然后开始写作吧!