MPLS用于IDC数据转移

需求:

1. ZOL的新建办公室,需要访问c25原有的资源,包括一些editor system的后台,vip-private vip-public, 还有ilo等。

2. ZOL的新建机房,需要和当前c25机房建立临时连接,用于数据传输。

硬件:

一根从他们的一个二层交换机连过来的裸光,连到北京办公室,一个another switch, 用于分开对应以上两个需求的vlan。

先说需求1.

这个需求是ZOL搬完办公区之后才告诉我的,当时我就懵了,你不早说,搬完了开始说了,所以当时用了一个比较ugly的解决方法。找了个NAT server(图上右上角),然后NAT到北京办公室的10.19.90.79这个内网地址,然后以某台办公室内网server的名义去往c25的那些资源。这个没什么意思,主要是需求2,嗯,这需求是挺2的。

再说需求2.

解决这个需求用的两个技术还是比较interesting,一个是MPLS tunnel, 一个是static routes redistribute to BGP.

MPLS

下面是一点李桃梅CCNP视频里对MPLS的讲解。

MPLS (multi protocol label switch), 多协议标签交换,多协议指的是在网络层可以支持多种协议,如IP IPv6 Apple talk。

MPLS is a switching mechanism in which packets are forwarded based on labels. Label usually correspond to IP destination networks.

也就是说,不在像基于IP的转发一样,拿来一个IP头部,先进行和路由表的条目的“与”操作和最长匹配了,因为传统的IP转发太慢。但现在由于硬件发展速度很快,IP转发和标签转发速度已经相差不大了,所以现在用处更多的是MPLS VPN和MPLS TE(流量工程)

MPLS的帧是插入到ethernet和IP之间的,所以也被称为是2.5层协议。

MPLS tunnel

MPLS tunnel的原型是下面这张图

摘自

http://blog.ine.com/2010/08/26/mpls-tunnels-explained/

这个老IE的博客,简单讲述了MPLS的工作机制和适用场景。

short version: MPLS的作用就是省去了中间的这个AS100的BGP full-mesh.

当然底层还是要用OSPF或者IS-IS通起来,然后后面的BGP就不一样了,中间的这个R5甚至不需要运行BGP,两边的R4 R6也不需要和R5建立BGP邻居,只需要分别和SW1 SW2建立EBGP邻居。只需要在彼此相连的口上,启用MPLS。

================分割线内是翻译的这位IE的博客的内容=============

之前都是full-mesh的BGP配置,现在开始删去中间R5上的BGP配置,同时删掉的还有R4 R6同R5建邻居的配置,但是千万要注意的是我们在这里并不删去R4 R6之间的BGP邻居。

R4#

mpls label protocol ldp

!

interface FastEthernet0/1

mpls ip

!

router bgp 100

no neighbor 10.1.45.5 remote-as 100

R5#

mpls label protocol ldp

!

interface FastEthernet0/0

mpls ip

!

interface FastEthernet0/1

mpls ip

!

no router bgp 100

R6#

mpls label protocol ldp

!

interface FastEthernet0/0

mpls ip

!

router bgp 100

no neighbor 10.1.56.5 remote-as 100

即便只是这样的配置,也足以使得最左边的AS和最右边的AS相通,原因是中间的AS相当于做了一个tunnel给它。

达到的效果如下,还是很神奇的:中间的R5没有两个AS的10.1.7.0 和 10.1.8.0的路由.

R5#show ip route 10.1.7.0

% Subnet not in table

R5#show ip route 10.1.8.0

% Subnet not in table

SW1#ping 10.1.8.8 source 10.1.7.7

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 10.1.8.8, timeout is 2 seconds:

Packet sent with a source address of 10.1.7.7

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/9 ms

但是SW1可以ping通远端的10.1.8.8

尽管R5不再有10.1.[7-8].0的路由,它依然能传递AS7和AS8之间的流量。关键就在于我们在中间这个AS100的ingress 和 egress 路由器之间,也就是R4和R6之间,架设了一个MPLS隧道。它的路由寻路规则依然和从前一样,只是现在R4, R5和R6增加了一个叫MPLS lable的东西用来查找路由。

下面以SW1寻找10.1.8.0/24的路由为例,依然是递归的去查找下一跳

SW1#show ip route 10.1.8.0

Routing entry for 10.1.8.0/24

Known via "bgp 7", distance 20, metric 0

Tag 100, type external

Last update from 10.1.47.4 01:02:56 ago

Routing Descriptor Blocks:

* 10.1.47.4, from 10.1.47.4, 01:02:56 ago

Route metric is 0, traffic share count is 1

AS Hops 2

Route tag 100

SW1#show ip route 10.1.47.4

Routing entry for 10.1.47.0/24

Known via "connected", distance 0, metric 0 (connected, via interface)

Routing Descriptor Blocks:

* directly connected, via Vlan47

Route metric is 0, traffic share count is 1

接着是R4收到去往10.1.8.0/24的包,然后自己也开始查

R4#show ip route 10.1.8.0

Routing entry for 10.1.8.0/24

Known via "bgp 100", distance 200, metric 0

Tag 8, type internal

Last update from 10.1.6.6 01:05:15 ago

Routing Descriptor Blocks:

* 10.1.6.6, from 10.1.6.6, 01:05:15 ago

Route metric is 0, traffic share count is 1

AS Hops 1

Route tag 8

上面显示R4从从R6学来BGP路由里学到的10.1.8.0/24, 下一跳是10.1.6.6,R4现在要再次递归的去查找10.1.6.6的路由,找到去往R6的出口。

R4#show ip route 10.1.6.6

Routing entry for 10.1.6.6/32

Known via "ospf 1", distance 110, metric 3, type intra area

Last update from 10.1.45.5 on FastEthernet0/1, 01:06:22 ago

Routing Descriptor Blocks:

* 10.1.45.5, from 10.1.6.6, 01:06:22 ago, via FastEthernet0/1

Route metric is 3, traffic share count is 1

R4经过递归查找,发现出口是Fa0/1 下一跳是10.1.45.5,在常规的基于IP转发的机制里,现在这个包会被发往 interface driver (端口驱动)来进行二层封装,然而在这个实验里,R4优先去看F0/1口是不是有MPLS被enabled!R4会优先去看Fa0/1下面有没有MPLS被enabled!R4会优先去看Fa0/1下面有没有MPLS被enabled!重要的事情,说三遍。如下:

R4#show mpls interfaces

Interface              IP            Tunnel   BGP Static Operational

FastEthernet0/1  Yes (ldp)     No       No  No     Yes

因为,Fa0/1正在以LDP协议(label distribution protocol)运行MPLS, R4现在去参照 MPLS LFIB(Label Forwarding Information Base) 去看下一跳也就是10.1.6.6是不是被分配了一个标签。

R4#show mpls forwarding-table

Local  Outgoing      Prefix            Bytes Label   Outgoing   Next Hop

Label  Label or VC   or Tunnel Id      Switched      interface

16     Pop Label     10.1.56.0/24      0             Fa0/1      10.1.45.5

17     17                 10.1.6.6/32        0             Fa0/1      10.1.45.5

18     18                 10.1.68.0/24      0             Fa0/1      10.1.45.5

如上图,R4会发现10.1.6.6/32 被分配了17号标签,这意味着,当包去往10.1.8.0/24的时候,17号标签将被加入到包头里去,在实际环境中,这个查找就只有一步,也就是去查CEF表。下面就是查找CEF表中的10.1.8.0/24的路由的时候的输出。

R4#show ip cef 10.1.8.0 detail

10.1.8.0/24, epoch 0

recursive via 10.1.6.6

nexthop 10.1.45.5 FastEthernet0/1 label 17

既然MPLS标签查找成功了,那么这个包现在被带着标签扔给了R5,R5将执行在这个实验中最关键的一步,当R5收到包之后,它看到有MPLS标签在包头里,这一位置R5会先在MPLS LFIB里查找而不是去IP route路由表里查找,不是在ip route里找不到之后才去LFIB找,而是压根儿就不会去ip route表里找,也就是解释了R5上 show ip route 10.1.8.0/24找不到的现象。show mpls forwarding-table的输出如下

R5#show mpls forwarding-table

Local  Outgoing      Prefix            Bytes Label   Outgoing   Next Hop

Label  Label or VC   or Tunnel Id      Switched      interface

16     Pop Label     10.1.4.4/32       15447         Fa0/0      10.1.45.4

17     Pop Label     10.1.6.6/32       15393         Fa0/1      10.1.56.6

18     Pop Label     10.1.68.0/24      0             Fa0/1      10.1.56.6

本地的17号标签的destination是10.1.6.6/32,尽管我们的包是去往10.1.8.0/24的,但是对于R5来说,它知道如何去往下一跳,也就是如何去往10.1.56.6就足够了,因为我们也知道R6就是MPLS最后一跳了,他一定知道去往AS8的路由。所以,R5在这个时候的动作很明确,就是移除标签,也就是pop。这也就是次末跳 penultimate hop 弹出标签。

当返程的时候,包从10.1.8.0/24来,回10.1.7.0/24去,R6为了去往10.1.4.4/32而增加标签16,扔向R5,R5移除16号标签,把包转给R4。这点从R6的LFIB 和 CEF可以看出来,如下:

R6#show mpls forwarding-table

Local  Outgoing      Prefix            Bytes Label   Outgoing   Next Hop

Label  Label or VC   or Tunnel Id      Switched      interface

16     16                 10.1.4.4/32        0             Fa0/0      10.1.56.5

17     Pop Label     10.1.45.0/24      0             Fa0/0      10.1.56.5

R6#show ip cef 10.1.7.0 detail

10.1.7.0/24, epoch 0

recursive via 10.1.4.4

nexthop 10.1.56.5 FastEthernet0/0 label 16

R5#show mpls forwarding-table

Local  Outgoing      Prefix            Bytes Label   Outgoing   Next Hop

Label  Label or VC   or Tunnel Id      Switched      interface

16     No Label      10.1.4.4/32       17606         Fa0/0      10.1.45.4

17     No Label      10.1.6.6/32       17552         Fa0/1      10.1.56.6

18     Pop Label     10.1.68.0/24      0               Fa0/1      10.1.56.6

为了看到实际中R5的操作,我们从10.1.7.0/24往10.1.8.0/24发流量,同时在R5上开启 debug mpls packet 如下

R5#debug mpls packet

Packet debugging is on

SW1#ping 10.1.8.8 source 10.1.7.7

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 10.1.8.8, timeout is 2 seconds:

Packet sent with a source address of 10.1.7.7

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/9 ms

R5#

MPLS les: Fa0/0: rx: Len 118 Stack {17 0 254} - ipv4 data

MPLS les: Fa0/1: rx: Len 118 Stack {16 0 254} - ipv4 data

MPLS les: Fa0/0: rx: Len 118 Stack {17 0 254} - ipv4 data

MPLS les: Fa0/1: rx: Len 118 Stack {16 0 254} - ipv4 data

MPLS les: Fa0/0: rx: Len 118 Stack {17 0 254} - ipv4 data

MPLS les: Fa0/1: rx: Len 118 Stack {16 0 254} - ipv4 data

MPLS les: Fa0/0: rx: Len 118 Stack {17 0 254} - ipv4 data

MPLS les: Fa0/1: rx: Len 118 Stack {16 0 254} - ipv4 data

MPLS les: Fa0/0: rx: Len 118 Stack {17 0 254} - ipv4 data

MPLS les: Fa0/1: rx: Len 118 Stack {16 0 254} - ipv4 data

MPLS设计的美就在于,无论AS7 AS8里增加了多少的路由条目,对于AS100来说,AS100都不需要给这些路由分配新的标签,只要边界路由器(R4 R6)建立了MPLS的传输,去往任何目的地的路由都可以在不增加R5内的转发信息的情况下实现转发。主要的路由负载都在R4 R6身上,中间的路由器只要知道如何去R4 R6就可以了。(这句是我自己翻译的时候加的)

================翻译内容结束========================

下面是Juniper对MPLS的一些讲解,来自http://www.juniper.net/techpubs/en_US/junos13.1/information-products/topic-collections/nog-mpls-model/ 这个链接,是Juniper的官方文档,通过这个文档中的思路,来实现ZOL机房迁移的要求。

下面着重看这段链路

在这段MPLS Tunnel上,cn-pek1-mx104-1 和 cnc-pek2-mx104-1之间还隔着一台设备,在逻辑上,这中间其实可以间隔多个设备。物理连接如下图:

前期准备工作:

裸纤:从中关村机房连到cn-pek1-mx104-1。

机房内光纤:从cnc-pek2-mx104-1和6506-1之间加一条额外的光纤,也就是插在cnc-pek2-mx104-1的ge-0/1/8口上的那一根,我们把它称为extension fiber。

起路由:

这个早就已经起好了。

1. 起MPLS:在各个节点上enable MPLS的协议和RSVP协议。RSVP协议我也是第一次接触,全称Resource Reservation Protocol,卧槽看了下文档,觉得这东西略叼。

在cnc-pek2-mx104-1上:

[email protected]> show configuration protocols

rsvp {

interface ae0.0;

}

mpls {

no-cspf;

preference 200;

interface ae0.0;

}

在cnc-pek2-mx104-2上:

[email protected]> show configuration protocols

rsvp {

interface ae0.0;

interface xe-1/1/0.0;

}

mpls {

no-cspf;

preference 200;

interface ae0.0;

interface xe-1/1/0.0;

}

在cn-pek1-mx104-1上:

[email protected]> show configuration protocols

rsvp {

interface xe-1/1/0.0;

}

mpls {

no-cspf;

preference 200;

interface xe-1/1/0.0;

}

2. 决定让RSVP工作在哪种模式

主要参照这两个文档:

https://www.juniper.net/techpubs/software/junos-security/junos-security10.2/junos-security-swconfig-mpls/topic-47253.html 这个讲的是“手动定义LSP”的方式,也是后来我们用到的方式

https://www.juniper.net/techpubs/software/junos-security/junos-security10.2/junos-security-swconfig-mpls/topic-47252.html 这个讲的就是“自动选路&ERO控制路由”

后面翻译一下这两篇好啦

现在我们决定手动定义LSP,也就是参照上面第一个文档,所以就有了下面这一步

3. LSP

LSP全称是 Label Switch Protocol

在cnc-pek2-mx104-1上:

在protocol mpls下添加如下配置

label-switched-path c25-to-zol {

to 10.25.253.11;

}

这个to xxxx的这个IP 地址,就是另外一端的ingress路由器的loopback地址。

在transit路由器上,也就是cnc-pek2-mx104-2上,没有必要做更多的操作,因为它是transit

在另一端的ingress上,也就是cn-pek1-mx104-1上,做对称的操作如下:

添加这些配置

label-switched-path zol-to-c25 {

to 10.25.253.21;

}

到这一步,两个ingress路由器之间的路由就通了,verify的方法如下:

右端的ingress路由器:

[email protected]> show route table inet.3

inet.3: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)

+ = Active Route, - = Last Active, * = Both

10.25.253.21/32    *[RSVP/200/1] 7w0d 19:08:01, metric 2

> to 118.67.127.19 via xe-1/1/0.0, label-switched-path zol-to-c25

[email protected]>

左端的ingress路由器:

[email protected]# run show route table inet.3

inet.3: 1 destinations, 1 routes (1 active, 0 holddown, 0 hidden)

+ = Active Route, - = Last Active, * = Both

10.25.253.11/32    *[RSVP/200/1] 7w0d 19:09:57, metric 2

> to 118.67.127.7 via ae0.0, label-switched-path c25-to-zol

[edit protocols mpls]

[email protected]#

4. 自己这条线路通了之后还不够,还要把它开放给“客户”,自己既是provider也是customer也是够累

还是看这个图

参照cnc-pek2-mx104-1向上连接cnc-pek2-6506-1的这根线,它的ether-type需要改成ccc如下:

[edit protocols mpls]

[email protected]# run show configuration interfaces ge-0/1/8

description cnc-pek2-6506-1_gi3/8;

encapsulation ethernet-ccc;

unit 0;

所谓ccc是指,circuit cross-connect,在下面这两个两个文档里有讲,我觉得我也有必要把这两个也翻译一下,有的时候一翻译在看到精彩,不逐字逐句的仔细去看容易落掉一些重要的点。

http://www.juniper.net/techpubs/en_US/junos13.3/topics/usage-guidelines/mpls-configuring-mpls-lsp-tunnel-cross-connects-using-ccc.html

https://www.juniper.net/documentation/en_US/junos13.2/topics/usage-guidelines/interfaces-configuring-interface-encapsulation-on-physical-interfaces.html

那么简单的说ethernet-ccc是什么呢,首先它是一种封装,它是要用在什么地方的封装呢?是用于“MPLS隧道终结在二层链路上”这种情况的封装。这个终结在二层上有很多种情况,因为二层的种类有非常多,比如ethernet啊 hdlc啊 fream-relay啊 ATM啊很多种。这个ethernet-ccc就是用于ethernet的这一种。

它的对端,也就是到客户那里,也就是MPLS里俗称的CE端,是配三层(IP)地址的,对于客户所要营造的效果就是,“买了一条点对点专线”。

5. 下面看一下客户端CE的配置

先说三层地址,ZOL新机房是118.67.127.25,CBSi老机房是118.67.127.24,给它们的机房分配的IP block是如下几个段,因此首先有静态路由

ip route 10.19.36.0 255.255.252.0 118.67.127.25 tag 201

ip route 10.19.40.0 255.255.252.0 118.67.127.25 tag 201

ip route 10.19.44.0 255.255.252.0 118.67.127.25 tag 201

另外还有到它们的公网地址的静态路由

ip route 123.103.57.0 255.255.255.0 118.67.127.25 tag 201

ip route 123.103.72.0 255.255.255.128 118.67.127.25 tag 201

ip route 123.103.72.128 255.255.255.240 118.67.127.25 tag 201

为了方便向BGP重分布,这里先加一个tag,然后用一个route-map实现

route-map static-zol-to-bgp permit 10

match tag 201

set community 38361:9201

调用到 router bgp 38361下

redistribute static route-map static-zol-to-bgp

由于设置了community值,且默认状态下community不发送,我们这里没有往其他几个数据中心传递这组路由的需求,所以在这里就没往其他几个e-BGP neighbor send-community, 所以只有38361里有这组路由。

当然由于我们加了到ZOL新公网的静态路由,所以NAT的策略要有所调整。这里NAT是通过ASA做的,写了一个route-map把需要被NAT的路由下一跳设为ASA

route-map cnc-pek2-asa permit 10

match ip address nat-filter

set ip next-hop 172.22.23.181

原本nat-filter这条ACL里只有deny了其他几个数据中心的公网IP block,因此自家的公网IP block不经由NAT转换,这下想让去ZOL的新公网IP也不经由NAT转换的话,把那几个block也加进去就可以了。

好了,现在该滚去翻译了。。。

时间: 2024-10-06 13:17:20

MPLS用于IDC数据转移的相关文章

某IDC数据中心智能布线系统案例简析

前言 2014年,全球IDC市场增长速度略有上升,整体市场规模达到327.9亿美元,增速为15.3%.其增长速度的主要拉动力来自于亚太,IT企业.互联网企业和电信企业在数据中心方面的投资加大推动了整体市场的发展.2014年中国IDC市场增长迅速,市场规模达到372.2亿元人民币,增速达41.8%,互联网市场的刚性需求拉动IDC快速增长.在过去六年,中国IDC市场复合增长率达到38.6%.IDC市场快速增长对管理维护提出了更高的要求,本文结合某IDC托管数据中心布线系统介绍下罗森伯格Pyxis智能

数据库端数据转移

工作中遇到需要实现不同版本的数据库间,数据同步.当然了前提数据表接口相同.有了2个多小时时间写了一个支持批量多张数据表进行有条件的数据转移.不受标识列的限制.如有不周之处还请大家积极批评指正. ----------*************************************************************************************** if exists (select * from dbo.sysobjects where id = obje

云服务器 ECS Linux 系统盘数据转移方法

转自:https://help.aliyun.com/knowledge_detail/41400.html 问题描述 购买云服务器 ECS Linux 服务器时,未购买数据盘,使用一段时间后,随着业务增加,现有系统盘已无法满足业务需求.执行 df -h 查询空间使用率接近 100%,需要将数据转移至新购买的数据盘. 处理办法 针对此类情况,可参考以下思路进行解决. 注:涉及数据操作,操作前请注意通过快照等手段进行备份. 1. 购买数据盘,创建好分区后,在系统内挂载数据盘到 /mnt/shuju

两个GridView之间数据转移,交互,实现拖拽,网易新闻列表效果实现

两个GridView之间数据转移,交互,实现拖拽,网易新闻列表效果实现 摘要 :android 高仿频道管理网易新闻. 新闻频道增删,排序,以及一些动画的实现 可拖动的GridView 地址  :  http://www.itnose.net/detail/6035345.html

为数据挖掘小组写的一个用于造数据的小程序

最近有个数据挖掘的项目,要求在文本里面写入随机字母并且要1000W个 于是就写了个程序用来造数据并记录一下 程序写的时候遇到的问题 1 未考虑内存溢出的情况,大批量的把数据写入导致内存溢出 以后需要谨慎对待 目前完整版 package test; import java.io.File; import java.io.FileWriter; import java.io.IOException; import org.apache.commons.io.FileUtils; import org

Memblaze 联手PMC推出用于超大规模数据中心的高性能PCIe SSD

Memblaze 联手PMC 推出用于超大规模数据中心的高性能PCIe SSD Memblaze 产品在容量.灵活度及延迟等方面均领先业界       引领大数据连接.传送以及存储,提供创新半导体及软件解决方案的PMC?公司(纳斯达克代码:PMCS)今日宣布,忆恒创源科技有限公司( Memblaze Technology Co. Ltd)在其下一代PCIe产品中采用了PMC的Flashtec? NVM Express (NVMe) NVMe控制器. 基于Flashtec的Memblaze的PBl

Druid:一个用于大数据实时处理的开源分布式系统

Druid是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行.创建Druid的最初意图主要是为了解决查询延迟问题,当时试图使用Hadoop来实现交互式查询分析,但是很难满足实时分析的需要.而Druid提供了以交互方式访问数据的能力,并权衡了查询的灵活性和性能而采取了特殊的存储格式. Druid功能介于PowerDrill和Dremel

CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第七节

第七节:使用下一代CUDA硬件,快乐加速度 原文链接 Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的实验室进行大型并行运算的研究,并且是几个新创企业的合伙人.大家可以发邮件到[email protected]与他沟通和交流. 在关于CUDA(Compute Unified Device Architecture,即计算统一设备架构的简称)的系列文章的第六节,我探讨了使用CUDA PROFI

Oracle数据转移Mysql中遇到的问题以及解决办法

前几天因工作需要我得将Oracle数据库中几十张表转移到Mysql中,由于之前没有相关经验,上网简单百度后选用Navcat Premium软件工作. Navcat Premium进行数据转移有三种办法:1.复制表  2.导出.导入数据  3.导出成sql脚本,执行. 一开始使用复制表的方法,打开菜单栏"工具"的数据传输功能,左边选择要复制的表,右边选择连接然后选中目标数据库,接下在就是next by next的一键式操作.这个方法真的很方便,但是bug也很多,最大的bug是数值类型不匹