[VRF] Leaking

크크몽·5일 전

VRF

목록 보기
2/2

VRF는 보통 망을 나누려고 쓰기 때문에, 서로 다른 VRF는 상대방의 대역을 모르는 게 정상입니다. 그런데 VRF 사이에 일부 경로를 열어줘야 할 때가 있고, 이게 Route Leaking입니다. 이 글에서는 EVPN 환경에서 Route Target(RT) import로 BLUE와 RED 두 VRF 사이에 Leaking을 설정하고, 그 과정에서 겪은 "ping이 안 되는" 문제 두 가지를 하나씩 풀어간 기록을 정리했습니다.

Leaking이란

Leaking은 서로 다른 VRF가 일부 경로를 공유하도록 열어주는 기능입니다. 서로 다른 VRF가 같은 대역(예: default route)을 알아야 한다면, 보통은 Leaking 대신 VRF별로 BGP를 맺어서 경로를 광고받는 방식을 쓴다고 합니다. Leaking은 관리가 까다롭고 대규모 망에서는 장애가 나기 쉬워서 특수한 경우에만 쓴다고 들었어요. 직접 운영에서 본 적은 없고, 들은 이야기입니다.

EOS는 Leaking을 세 가지 방식으로 지원합니다.

  • BGP VPN/EVPN의 route-target import: 이 글에서 쓰는 방식입니다.
  • Static inter-VRF route: 정적 경로의 next-hop에 다른 VRF(egress VRF)를 지정합니다.
  • VRF-leak agent: router general에서 leak routes와 route-map으로 경로를 옮깁니다.

실습 환경

  • AS 100: LEAF101, LEAF102(MLAG 쌍), AS 200: LEAF201, LEAF202. 두 AS는 EVPN으로 연결되고, 그림의 "Type 2 확장"으로 L2도 이어져 있습니다.
  • VRF BLUE: VLAN 10, 10.10.10.0/24, RT 100:100(VNI 100)
  • VRF RED: VLAN 20, 20.20.20.0/24, RT 200:200(VNI 200)
  • HOST101(BLUE, 10.10.10.100), HOST102(RED, 20.20.20.100), HOST201(BLUE, 10.10.10.200), HOST202(RED, 20.20.20.200). HOST102는 LEAF101과 LEAF102에 LACP로 연결되어 있습니다.

목표는 BLUE에서 RED 대역(20.20.20.0/24)으로 통신하는 것입니다.

RT가 맞는 경로만 import된다

LEAF101의 BGP 설정과 VRF별 라우팅 테이블입니다.

LEAF101(config)#sh run section bgp
   vrf BLUE
      rd 1.1.1.101:100
      route-target import evpn 100:100
      route-target export evpn 100:100
      redistribute connected
   !
   vrf RED
      rd 1.1.1.101:200
      route-target import evpn 200:200
      route-target export evpn 200:200
      redistribute connected

LEAF101(config)#sh ip route vrf BLUE
 B E  8.8.8.8/32 [200/0]
       via VTEP 5.5.5.5 VNI 100 local-interface Vxlan1
 C    10.10.10.0/24
       directly connected, Vlan10

LEAF101(config)#sh ip route vrf RED
 B E  8.8.8.8/32 [200/0]
       via VTEP 5.5.5.5 VNI 200 local-interface Vxlan1
 C    20.20.20.0/24
       directly connected, Vlan20

VRF별로 export하는 RT와 import하는 RT가 자기 것 하나씩뿐이라서, 각 VRF의 라우팅 테이블에는 자기 RT를 가진 경로만 있습니다. BLUE에는 RED 대역(20.20.20.0/24)이 없어요. 그렇다면 BLUE에서 RED의 RT(200:200)를 추가로 import하면 될 거라고 예상했습니다.

한쪽 import만으로는 ping이 안 된다

LEAF101의 vrf BLUE에서 RED의 RT(200:200)를 추가로 import했습니다.

LEAF101(config-router-bgp-vrf-BLUE)#sh run section bgp
   vrf BLUE
      rd 1.1.1.101:100
      route-target import evpn 100:100
      route-target import evpn 200:200      ← 추가
      route-target export evpn 100:100
      redistribute connected

BLUE의 라우팅 테이블에 RED 대역이 올라왔습니다.

LEAF101#sh ip route vrf BLUE
 B E  8.8.8.8/32 [200/0]
       via VTEP 5.5.5.5 VNI 200 local-interface Vxlan1
 B E  10.10.10.200/32 [200/0]
       via VTEP 2.2.2.2 VNI 100 local-interface Vxlan1
 C    10.10.10.0/24
       directly connected, Vlan10
 B L  20.20.20.0/24
       directly connected, Vlan20 (source VRF RED) (egress VRF RED)

B L의 L이 VRF Leaked를 뜻합니다. 20.20.20.0/24가 RED에서 넘어온 경로라는 표시예요. 그런데 ping은 모두 실패했습니다.

LEAF101#ping vrf BLUE 20.20.20.200
5 packets transmitted, 0 received, 100% packet loss

경로는 올라왔는데 왜 안 될까요? 이유는 통신이 양방향이라는 데 있었습니다. 위 설정은 BLUE가 RED의 경로를 아는 것(단방향)일 뿐이고, 돌아오는 길(reply)을 위해서는 RED도 BLUE를 알아야 합니다.

양방향 import로 해결

LEAF201의 vrf RED에서도 BLUE의 RT(100:100)를 import했습니다.

LEAF201(config-router-bgp-vrf-RED)#sh run section bgp
   vrf RED
      rd 1.1.1.201:200
      route-target import evpn 100:100      ← 추가
      route-target import evpn 200:200
      route-target export evpn 200:200
      redistribute connected

그러자 LEAF201의 RED 라우팅 테이블에 BLUE 대역이 leaked 경로로 올라오고, ping이 정상적으로 갑니다.

LEAF201#sh ip route vrf RED
 B E  10.10.10.100/32 [200/0]
       via VTEP 1.1.1.1 VNI 100 local-interface Vxlan1
 B L  10.10.10.0/24
       directly connected, Vlan10 (source VRF BLUE) (egress VRF BLUE)
 C    20.20.20.0/24
       directly connected, Vlan20

LEAF101#ping vrf BLUE 20.20.20.200
5 packets transmitted, 5 received, 0% packet loss

처음 ping이 안 됐던 이유는, ICMP echo 요청은 20.20.20.200까지 도달했는데 reply가 돌아오는 길에서 RED가 BLUE 대역(10.10.10.x)을 몰라서 되돌아오지 못했기 때문입니다. Leaking은 항상 양방향으로 생각해야 해요.

MLAG 쌍에서 한쪽만 설정하면 생기는 문제

그런데 문제가 하나 더 있었습니다. LEAF101의 vrf BLUE에서 HOST202(20.20.20.200)로는 ping이 잘 가는데, 로컬에 붙은 HOST102(20.20.20.100)로는 ping이 실패했어요.

원인은 이렇습니다. HOST102 입장에서 ping의 출발지(10.10.10.21)는 다른 네트워크 대역이라서 reply를 게이트웨이로 보냅니다. HOST102는 LEAF101과 LEAF102에 LACP로 연결되어 있어서 어느 LEAF로 보낼지는 LACP 해시 값으로 정해집니다.

  • reply가 ping을 보낸 LEAF101로 가면 통신이 됩니다.
  • reply가 LEAF102로 가면 패킷이 드롭됩니다.

링크를 하나 shutdown하면 HOST102의 reply가 갈 곳이 LEAF101 하나뿐이라 ping이 정상으로 동작합니다. 하지만 이건 현상만 해결하는 임시방편이에요. 근본 원인은 LEAF102에 Leaking 설정이 없었던 것입니다. MLAG 쌍에서는 어느 쪽이 reply를 받을지 모르니, 두 장비에 같은 Leaking 설정이 있어야 합니다.

LEAF102에도 Leaking이 있다면: 패킷 흐름과 VLAN Tag

LEAF102에도 Leaking이 설정되어 있다면 ping은 문제없이 통신되어야 하고, 이때 패킷은 이렇게 흐릅니다.

  1. LEAF101에서 ping vrf BLUE 20.20.20.100을 칩니다. 출발지 IP는 VLAN 10의 SVI(10.10.10.21)가 선택돼요. vrf BLUE에 RED의 경로가 leaked 되어 있어서 Network Unreachable이 나지 않고, ARP와 MAC table을 참조해 20.100이 port-channel 20에서 학습된 것을 확인한 뒤 2번 포트로 보냅니다.
  2. HOST102가 20.100이 자기라는 것을 확인하고 reply를 만듭니다. 그런데 출발지 IP(10.10.10.21)가 모르는 대역이라 자신의 게이트웨이로 reply를 보내고, LACP 해시에 따라 1번 포트나 2번 포트 중 한 곳으로 갑니다.
  3. LEAF102가 이 패킷을 받으면 vrf RED로 들어온 목적지(10.10.10.21)가 vrf BLUE의 Leaking으로 받은 대역임을 확인합니다. vrf BLUE의 라우팅 테이블에서 10.10.10.0/24가 Connected인 것을 확인하고, 10.21의 MAC을 MAC table에서 찾으면 3번 포트, 즉 MLAG peer-link로 학습되어 있으니 3번 포트로 icmp reply를 보냅니다.

여기서 재미있는 점을 발견했습니다. 1번에서 나가는 icmp 패킷을 캡처해보면 출발지 IP는 10.10.10.21(BLUE의 SVI)인데 VLAN Tag는 VLAN 20을 달고 나갑니다. 그 패킷이 계속 VLAN 20 Tag를 달고 있다가, 3번에서 LEAF102가 peer-link로 LEAF101에 reply를 던질 때는 VLAN Tag를 10으로 바꿔서 전달해요.

라우팅 테이블에 보이는 Vlan20 (egress VRF RED), Vlan10 (egress VRF BLUE)가 VRF를 넘나들 때 VLAN Tag를 결정하는 요소로 보입니다.

  • egress VRF가 어느 물리 인터페이스(SVI)를 쓸지 결정하고,
  • 그 인터페이스가 원래 자기 VLAN 번호를 가지고 있으니 자동으로 그 태그가 붙습니다.

Arista 문서(Static Inter-VRF Route)도 비슷하게 설명합니다. 다른 egress VRF는 next-hop에 "어느 VRF에서 이 next-hop을 해석할지"라는 egress VRF 참조를 붙이는(tagging) 방식으로 구현된다는 내용이에요.

알아두면 좋은 점

  • Leaking은 항상 양쪽을 설정해야 합니다. 한쪽이 import하면 경로를 아는 것(단방향)뿐이고, 돌아오는 길까지 열려면 반대쪽 VRF도 상대의 RT를 import해야 합니다.
  • MLAG 쌍에는 같은 설정을 넣어야 합니다. LACP 해시에 따라 어느 장비가 패킷을 받을지 달라져서, 한쪽에만 설정이 없으면 "되는 flow와 안 되는 flow"가 섞인 증상으로 나타납니다.
  • 확인은 라우팅 테이블에서 합니다. show ip route vrf <이름>에서 L(VRF Leaked) 코드와 (source VRF …), (egress VRF …)가 보이면 Leaking으로 들어온 경로입니다.
  • import 범위는 route-map으로 줄일 수 있습니다. route-target import evpn route-map <이름>을 쓰면 RT가 맞는 경로 중 필요한 것만 가져올 수 있어요. RT 전체를 import하면 의도하지 않은 경로까지 열릴 수 있습니다.

정리

Leaking은 VRF 사이로 경로를 열어주는 기능이고, EVPN 환경에서는 RT를 import해서 구현할 수 있습니다. BLUE가 RED의 RT를 import하면 경로는 올라오지만 ping은 되지 않는데, reply가 돌아오려면 RED도 BLUE의 RT를 import해야 하기 때문입니다. MLAG 쌍에서는 어느 장비가 reply를 받을지 LACP 해시에 달려 있으니 양쪽 장비에 같은 Leaking 설정을 넣어야 하고, 이때 VRF를 넘나드는 패킷의 VLAN Tag는 라우팅 테이블의 egress VRF와 그 SVI가 결정합니다.

profile
주니어 엔지니어

0개의 댓글