需求:
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,在下面这两个两个文档里有讲,我觉得我也有必要把这两个也翻译一下,有的时候一翻译在看到精彩,不逐字逐句的仔细去看容易落掉一些重要的点。
那么简单的说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也加进去就可以了。
好了,现在该滚去翻译了。。。