在之前的文章《 [ Juniper ] 使用 MPLS L2-Circuit 提供虚拟网线服务 》中我们讲了如何用 L2Circuit (也叫 PW 或者 EoMPLS )来提供点对点的二层连接环境。但是这篇文章中的默认环境下,A 端和 Z 端都是服务于外界的服务器或者路由器,如果我们路由器本身想作为链路的其中一端与另一端做互联,则需借助 Logical-Tunnel 来完成需求。
实验拓扑如下:
CoreRouter 作为核心路由想和 Upstream 路由器建立 BGP 连接,但是 Upstream 只能将物理线拉到 Edge-Extend 所在的机房,且 Edge-Extend 作为一个边缘路由器,不具有接受路由全表的能力。于是我们决定使用 L2Circuit 来实现该需求,将 Extend 路由器的 ge-0/0/0 接口封装 ethernet-ccc 后送往 Core,然后 Core 内部借助这条 PW 来实现和 Upstream 直接启动 BGP session 并传递路由。
Upstream 已经预配置好了 BGP session,我们来着重配置 Edge 以及 Core路由器。
两台路由器已经预配置好了 SR-MPLS 作为传输层,使用的是 L-ISIS(当然,LDP + 纯 ISIS/OSPF 也是可以的),该处配置已省略,我们来配置 L2Circuit 并实现 Core 路由器的内部连接。
Extend:
protocols { mpls { interface ge-0/0/1.0; } ldp { transport-address router-id; interface ge-0/0/1.0; interface lo0.0; } l2circuit { neighbor 192.168.0.2 { interface ge-0/0/0.0 { virtual-circuit-id 100; no-control-word; } } } }
配置完 Extend 后,我们来配置 Core 路由器的协议:
root> show configuration chassis fpc 0 { pic 0 { tunnel-services { bandwidth 100g; } inline-services { bandwidth 100g; } } } // 打开 tunnel-service 支持,以支持 logical-tunnel,lt 是基于 tunnel-service 的。 ldp { transport-address router-id; interface ge-0/0/1.0; interface lo0.0; } mpls { interface ge-0/0/1.0; }
然后,再配置 logical-tunnel,将其与 L2Circuit 对接起来:
root> show configuration interfaces lt-0/0/0 unit 0 { encapsulation ethernet-ccc; // lt 的 unit 0 需要封装 ethernet-ccc 模式,以便与 L2Circuit VC 对接( L2Cicuit 的链路就是 ccc 模式) peer-unit 1; // 0 与 1 组成 lt 的两端 family ccc; // 激活 ccc family,以便与 L2Circuit 对接 } unit 1 { encapsulation ethernet; // 封装普通以太网模式,让 lt 的 unit 1 作为虚拟接口的 Z 端,默认放在 Global 路由表里面 peer-unit 0; // 0 与 1 组成 lt 的两端 family inet { address 100.64.0.3/31; // 激活 inet family,作为虚拟的 Z 端(路由器的虚拟接口) } } //( Z 端作为虚拟接口放在了 Core 路由器的 GRT 里面,A端则是在 Extend 的 ge-0/0/0 ) root> show configuration protocols l2circuit neighbor 192.168.0.1 { interface lt-0/0/0.0 { // 将 lt 的 unit 0 与该 L2circuit VC 做无缝对接 virtual-circuit-id 100; no-control-word; } }
配置完成后,我们查看 L2Circuit connection 状况:
root> show l2circuit connections Layer-2 Circuit Connections: {..snip..} Legend for interface status Up -- operational Dn -- down Neighbor: 192.168.0.1 Interface Type St Time last up # Up trans lt-0/0/0.0(vc 100) rmt Up May 30 10:58:31 2021 1 Remote PE: 192.168.0.1, Negotiated control-word: No Incoming label: 299776, Outgoing label: 299776 Negotiated PW status TLV: No Local interface: lt-0/0/0.0, Status: Up, Encapsulation: ETHERNET Flow Label Transmit: No, Flow Label Receive: No
可以看到 L2Circuit 已经 UP 了,我们再配置 BGP 协议:
root> show configuration protocols bgp group external { type external; import accept-all; // 接受来自于 Upstream 的路由 export export-direct; // 发送本地的 Client 服务器路由,注意,按生产环境具体情况配置。 peer-as 65000; local-as 65001; neighbor 100.64.0.2; }
配置完成后,查看 BGP 协议:
root> show bgp summary Threading mode: BGP I/O Groups: 1 Peers: 1 Down peers: 0 Table Tot Paths Act Paths Suppressed History Damp State Pending inet.0 1 1 0 0 0 0 Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped... 100.64.0.2 65000 37 37 0 0 15:38 Established inet.0: 1/1/1/0
在 Client 端 ping 并且 trace 目的地服务器:
root@localhost:~# ping 8.8.8.8 -c 3 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=62 time=11.9 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=62 time=9.22 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=62 time=12.0 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 5ms rtt min/avg/max/mdev = 9.221/11.039/11.989/1.289 ms root@localhost:~# mtr 8.8.8.8 --report Start: 2021-05-30T13:02:25+0000 HOST: localhost Loss% Snt Last Avg Best Wrst StDev 1.|-- 10.0.0.1 0.0% 10 11.9 67.7 1.6 373.7 119.6 2.|-- 100.64.0.2 0.0% 10 5.8 6.6 2.9 12.7 3.0 3.|-- 8.8.8.8 0.0% 10 6.5 11.6 6.5 25.3 6.0
Core 路由器成功实现了与 L2Circuit 内部对接,实验完成。