我们技术经常会遇到一些很奇怪的需求,比如说,客户想将 A 区域和 B 区域的机器连起来,两台机器连接成一个大的二层域内。或者是客户想在 A 区域使用 B 区域 ISP 提供的宽带服务(不要笑,经常有!)。总之需求千奇百怪无所不有,你需要有很灵活的方式来提供服务。
今天我们来针对一下第二种需求来说一下 Juniper 的 Pseudo-Wire ( ethernet-ccc / VLAN-ccc )功能。在介绍并配置这个功能之前,我们需要先整理一下现在的解决方案,看看哪些方案可以满足我们的需求。
- 传统 IP 路由 – 可以,但是非常麻烦,你需要在 B 区连接 PPPoE 后,再让客户建立一个二层隧道( 如 GRETAP ),并让客户自行将自己的子网桥接起来。桥接完毕后你还需要在 B 区的服务器上配置桥接,让客户的隧道接口处于二层域内,配置和维护及其麻烦。
- MPLS L3VPN – 不可行,因为 VRF 分割了广播域,而 PPPoE 需要在同一二层域下才能拨号
- VPLS & VxLAN – 可行,但是 VPLS 以及 VxLAN 的配置方法很麻烦,如果你需要配置十几个或者几十个 Broadband 接入,配置以及维护起来比较烦。
所以有没有什么办法可以非常简单的配置( 配置不超过 20 行 )又能实现以上需求的方法呢?当然有,我们现在就来使用 Juniper 的 Pseudo-Wire 来实现该需求。
配置整图如下:
这里我们来模拟 Branch 需要使用 Headquarter 提供的 PPPoE 服务的场景。
Branch 需要连接 Headquarter PPPoE BRAS 服务器获得 Internet 访问权限,我们需要使用最少的配置来实现该需求。
ISP 区域已经预配置好 MPLS + OSPF ( 无需配置 BGP )且 LDP 和 OSPF adjacency 已成立,我们只需要针对 Pseudo-Wire 功能进行配置即可。
VCP1:
protocols { mpls { label-switched-path R1-R3 { to 10.0.0.3; //定义 MPLS PATH ,到对端的 PE 设备,可以通过同一 LSP 提供多个 L2-Circuit 服务 } interface ge-0/0/1.0; } l2circuit { neighbor 10.0.0.3 { interface ge-0/0/2.0 { virtual-circuit-id 100; // 为需要传输的接口定义邻居关系以及虚拟电缆 ID ( ID 的值随便写,不可以冲突,与对端 ID 需相同 ) } } } } interfaces { ge-0/0/2 { encapsulation ethernet-ccc; // 将接口封装成 ethernet-ccc 模式,开启伪线功能 unit 0 { family ccc; // 激活 ccc SAFI,提供伪线服务 } } }
VCP3:
protocols { mpls { label-switched-path R3-R1 { to 10.0.0.1; //定义 MPLS PATH ,到对端的 PE 设备,可以通过同一 LSP 提供多个 L2-Circuit 服务 } interface ge-0/0/1.0; } l2circuit { neighbor 10.0.0.1 { interface ge-0/0/2.0 { virtual-circuit-id 100; // 为需要传输的接口定义邻居关系以及虚拟电缆 ID ( ID 的值随便写,不可以冲突,与对端 ID 需相同 ) } } } } interfaces { ge-0/0/2 { encapsulation ethernet-ccc; // 将接口封装成 ethernet-ccc 模式,开启伪线功能 unit 0 { family ccc; // 激活 ccc SAFI,提供伪线服务 } } }
配置完成后,我们来检查 VCP1 的 MPLS Table:
root@R1> show route table mpls.0 mpls.0: 11 destinations, 11 routes (11 active, 0 holddown, 0 hidden) + = Active Route, - = Last Active, * = Both 0 *[MPLS/0] 22:13:11, metric 1 to table inet.0 0(S=0) *[MPLS/0] 22:13:11, metric 1 to table mpls.0 1 *[MPLS/0] 22:13:11, metric 1 Receive 2 *[MPLS/0] 22:13:11, metric 1 to table inet6.0 2(S=0) *[MPLS/0] 22:13:11, metric 1 to table mpls.0 13 *[MPLS/0] 22:13:11, metric 1 Receive 299776 *[L2CKT/7] 21:57:36 > via ge-0/0/2.0, Pop Offset: 4 299792 *[LDP/9] 22:11:04, metric 1 > to 100.64.10.2 via ge-0/0/0.0, Pop 299792(S=0) *[LDP/9] 22:11:04, metric 1 > to 100.64.10.2 via ge-0/0/0.0, Pop 299808 *[LDP/9] 22:10:57, metric 1 > to 100.64.10.2 via ge-0/0/0.0, Swap 299840 ge-0/0/2.0 *[L2CKT/7] 21:57:36, metric2 1 > to 100.64.10.2 via ge-0/0/0.0, Push 299776, Push 299840(top) Offset: 252
再检查 L2Circuit 邻居建立情况:
root@R1> show l2circuit connections Layer-2 Circuit Connections: Legend for connection status (St) EI -- encapsulation invalid NP -- interface h/w not present MM -- mtu mismatch Dn -- down EM -- encapsulation mismatch VC-Dn -- Virtual circuit Down CM -- control-word mismatch Up -- operational VM -- vlan id mismatch CF -- Call admission control failure OL -- no outgoing label IB -- TDM incompatible bitrate NC -- intf encaps not CCC/TCC TM -- TDM misconfiguration BK -- Backup Connection ST -- Standby Connection CB -- rcvd cell-bundle size bad SP -- Static Pseudowire LD -- local site signaled down RS -- remote site standby RD -- remote site signaled down HS -- Hot-standby Connection XX -- unknown Legend for interface status Up -- operational Dn -- down Neighbor: 10.0.0.3 Interface Type St Time last up # Up trans ge-0/0/2.0(vc 100) rmt Up Jun 10 10:16:22 2020 1 Remote PE: 10.0.0.3, Negotiated control-word: Yes (Null) Incoming label: 299776, Outgoing label: 299776 Negotiated PW status TLV: No Local interface: ge-0/0/2.0, Status: Up, Encapsulation: ETHERNET Flow Label Transmit: No, Flow Label Receive: No
可以得知 Pseudo-Wire 服务已经激活了,邻居状态为 UP,那么我们就开始在 Branch 上直接拨号来测试下是否成功吧!
( BRAS 配置已省略,系统为 Mikrotik RouterOS,账号为 ori,密码为 ori )
Ori-Branch@Area0 – Ori-Client:
Branch Client 已连接上 Headquarter BRAS,成功获得互联网访问权限,客户需求已完成。