멀티캐스트 · MPLS · LISP

VPP의 멀티캐스트 처리(IGMPv3/MLDv2/BIER), MPLS 및 SR-MPLS 레이블 스위칭, LISP 컨트롤 평면, BFD 빠른 장애 감지 등 L3 제어 평면 확장 기능을 정리합니다.

이 문서의 범위: VPP의 멀티캐스트 처리, MPLS/SR-MPLS 레이블 스위칭, LISP 컨트롤 평면, BIER 비트 인덱스 복제 등 L3 제어 평면 및 확장 라우팅 기능을 한 곳에 정리합니다. 기본 L2/L3 노드와 FIB는 데이터 경로 (L2~L4)에서 먼저 확인해 주시기 바랍니다.

VPP 멀티캐스트 개요

VPP는 IPv4/IPv6 멀티캐스트를 일급 지원합니다. 멀티캐스트 수신자 목록은 MFIB (Multicast FIB)에 저장되며, IGMPv3/MLDv2 프로토콜로 동적으로 갱신됩니다. 패킷 복제는 데이터 평면에서 수행되며, BIER 같은 대안 모델도 플러그인으로 제공됩니다.

vpp# show ip mfib
vpp# show ip6 mfib
vpp# set interface ip mfib <if> forward accept
vpp# show ip igmp snoop
모델: VPP MFIB는 (*, G)(S, G) 두 가지 매칭을 지원하며, 각 엔트리에 대해 "어느 인터페이스로 들어온 트래픽을 어떤 인터페이스 벡터로 복제해 나갈지"를 지시합니다. 유니캐스트 FIB와 별개의 트리로 유지됩니다.

MFIB 내부 구현과 복제 경로

MFIB 엔트리는 내부적으로 mfib_entry_t 구조체로 표현되며, 각 엔트리는 Replication List(복제 대상 인터페이스 집합)를 DPO로 들고 있습니다. 멀티캐스트 패킷이 ip4-mfib-forward-lookup 노드에서 매칭되면 ip4-mfib-forward-rpfReverse Path Forwarding 검증을 수행한 뒤 ip4-replicate 노드가 버퍼를 복제합니다. 복제는 버퍼 헤더만 재사용(zero-copy clone)하고 데이터는 공유하므로, 수신 인터페이스 수가 늘어도 메모리 대역폭 증가는 완만합니다.

# (*,G) 및 (S,G) 엔트리 확인
vpp# show ip mfib 239.1.1.1
vpp# show ip mfib 239.1.1.1 detail
vpp# show ip mfib summary
# 복제 DPO 추적
vpp# show replicate

MFIB 출력 해석 가이드

show ip mfib 239.1.1.1 detail 출력 예시와 각 필드 의미입니다.

vpp# show ip mfib 239.1.1.1 detail
# (*,G) 와일드카드 엔트리 — 소스에 무관하게 그룹 239.1.1.1로 오는 패킷에 적용
(*,239.1.1.1)
  Flags: C              # C = Connected (로컬 인터페이스에 수신자 있음)
  RPF:                  # (*,G)는 RPF 검사를 소스별 유니캐스트 FIB로 수행
  Interfaces:
    GigabitEthernet0/8/0  Flags: A NS   # A=Accept(IIF: 이 인터페이스로 들어온 패킷 수신), NS=Not-Signal
    GigabitEthernet0/9/0  Flags: F NS   # F=Forward(OIF: 이 인터페이스로 복제 전송)
    GigabitEthernet0/10/0 Flags: F NS   # F=Forward(OIF: 두 번째 출력 인터페이스)

# (S,G) 소스-지정 엔트리 — 192.0.2.10에서 오는 239.1.1.1 패킷에 적용
(192.0.2.10,239.1.1.1)
  Flags: C              # C = Connected
  RPF: GigabitEthernet0/8/0 192.0.2.10  # RPF 인터페이스 + 예상 소스 next-hop
  RPF-CHECK: PASS       # 소스 192.0.2.10의 역방향 경로가 GE0/8/0으로 확인됨
  Interfaces:
    GigabitEthernet0/8/0  Flags: A NS   # IIF: 패킷이 들어오는 인터페이스
    GigabitEthernet0/9/0  Flags: F NS   # OIF: 수신자 1로 복제 출력
    GigabitEthernet0/10/0 Flags: F NS   # OIF: 수신자 2로 복제 출력
    GigabitEthernet0/11/0 Flags: F NS   # OIF: 수신자 3로 복제 출력

트래픽이 도착하지만 MFIB에서 포워딩되지 않는 시나리오 디버깅 단계:

  1. show ip mfib 239.1.1.1 detail — 엔트리 존재 여부와 IIF/OIF 인터페이스 목록, Flags 확인
  2. show ip fib <source-ip> — RPF 역방향 경로 확인: 소스 IP로 향하는 유니캐스트 경로가 IIF와 일치하는지 검증
  3. show ip neighbor — ARP/neighbor 테이블에 OIF의 next-hop 주소가 해석(resolve)되어 있는지 확인; 미해석 시 패킷이 OIF에서 드롭됨
  4. show errors | grep mfib — 드롭 원인 카운터 확인: ip4-mfib-forward-rpf 드롭이면 RPF 실패, ip4-replicate 드롭이면 OIF 문제

정상 MFIB 엔트리 vs RPF 실패 엔트리 비교:

### 정상 엔트리 — RPF PASS, OIF 복제 정상 동작
vpp# show ip mfib 239.1.1.1 detail
(192.0.2.10,239.1.1.1)
  RPF: GigabitEthernet0/8/0 192.0.2.10
  RPF-CHECK: PASS
  Interfaces:
    GigabitEthernet0/8/0  Flags: A NS
    GigabitEthernet0/9/0  Flags: F NS

### RPF 실패 엔트리 — 소스가 예상치 않은 인터페이스로 유입됨
vpp# show ip mfib 239.1.1.1 detail
(192.0.2.10,239.1.1.1)
  RPF: GigabitEthernet0/8/0 192.0.2.10   # 역방향 경로는 GE0/8/0 기대
  RPF-CHECK: FAIL                          # 패킷이 GE0/9/0으로 들어와 RPF 불일치 → 드롭
  Interfaces:
    GigabitEthernet0/8/0  Flags: A NS
    GigabitEthernet0/9/0  Flags: F NS

# RPF 실패 카운터 확인
vpp# show errors | grep mfib
  ip4-mfib-forward-rpf      1234  RPF check failed    # 이 카운터 증가 = RPF 드롭 발생

# 역방향 경로 확인 — RPF 인터페이스와 일치해야 함
vpp# show ip fib 192.0.2.10
ipv4-VRF:0, fib_index:0, flow hash:[src dst sport dport proto ]
192.0.2.10/32
  unicast-ip4-chain
  [@0]: dpo-load-balance: [proto:0 index:6 buckets:1 ]
    [0] [@14]: ipv4 via 192.0.2.1 GigabitEthernet0/8/0: ...  # GE0/8/0 이어야 RPF PASS

멀티캐스트 트러블슈팅

증상별 체크리스트:
  • 수신자는 가입했는데 트래픽이 오지 않음show ip mfib에서 해당 그룹의 Replication List에 downstream 인터페이스가 포함되어 있는지 확인합니다. IGMP 가입은 성공했지만 MFIB에 반영되지 않는 경우가 많습니다.
  • RPF check fail 카운터 증가show errors에서 ip4-mfib-forward-rpf의 drop을 확인합니다. 소스가 도달 가능한 유니캐스트 경로(역방향)와 일치하지 않으면 드롭됩니다. show ip fib <source>로 역방향 경로를 검증합니다.
  • 브릿지 도메인에서 트래픽이 모든 포트로 플러딩 — IGMP Snooping이 꺼져 있거나, Querier가 없어 스누핑 테이블이 비어 있을 가능성이 큽니다. show ip igmp snoop으로 그룹별 포트 멤버십을 확인합니다.

IGMPv3 · MLDv2 그룹 관리

IGMP(IPv4)와 MLD(IPv6)는 호스트가 멀티캐스트 그룹에 가입/탈퇴하겠다고 라우터에 알리는 프로토콜입니다. VPP의 igmp 플러그인은 v1/v2/v3과 source-specific multicast(SSM)를 지원합니다.

IGMP v1 / v2 / v3 기능 비교

기능IGMPv1IGMPv2IGMPv3
그룹 탈퇴없음 (타임아웃)Leave GroupLeave Group + SSM
SSM (Source-Specific Multicast)미지원미지원지원
RFC111222363376
VPP 지원없음있음있음

IGMPv3 CLI 예시

vpp# igmp proxy enable
vpp# set interface ip igmp <upstream-if> enable
vpp# set interface ip igmp <downstream-if> enable host
vpp# show igmp config

IGMP Snooping

L2 브릿지 도메인에서 IGMP Snooping은 멀티캐스트 패킷이 그룹 가입자가 있는 포트로만 전달되도록 제어합니다. show ip igmp snoop 명령으로 BD별 스누핑 상태를 확인할 수 있습니다. VPP는 IGMP Query 패킷을 관찰해 Querier를 식별하고, Report를 받은 포트만 그룹 멤버로 등록합니다. Querier가 없으면 스누핑 테이블이 타임아웃으로 비워져 사실상 플러딩으로 동작합니다 — 운영 환경에서는 별도 IGMP Querier 역할을 하는 장비가 반드시 있어야 합니다.

IGMP 호스트 상태 머신

IGMPv3 호스트는 그룹별로 Non-Member → Delaying Member → Idle Member 상태를 가집니다. Query 수신 시 랜덤 지연 후 Report를 보내며, 다른 호스트의 Report를 먼저 관찰하면 자신의 Report를 억제(Report Suppression)합니다. 이는 Query 폭주 시 라우터 CPU 보호에 효과적이지만, 디버깅 시에는 show igmp config로 호스트 상태 전이를 추적해야 합니다.

IGMP 트러블슈팅

자주 발생하는 문제:
  • Report 수신되는데 MFIB 갱신 안 됨show igmp config에서 인터페이스가 router 모드로 활성화되어 있는지 확인합니다. host 모드는 자신이 가입자일 때만 사용합니다.
  • SSM (S,G) join이 (*,G)로 잡힘 — IGMPv3에서만 source filter가 전달됩니다. v2 Report가 섞이면 소스 정보가 사라지므로 모든 라우터/호스트가 v3인지 확인합니다.
  • Fast-leave 설정 후에도 지연 — Last-Member-Query 단계가 필요해 보통 1~2초가 남습니다. 즉시 탈퇴가 필요하면 fast-leave와 함께 LMQI(Last Member Query Interval)를 낮춥니다.

IGMP v2/v3 혼용 및 상태 머신

실제 네트워크에서는 v2와 v3 구현이 혼재하는 경우가 많습니다. IGMPv3 수신자가 있는 세그먼트에 IGMPv2 Querier가 등장하면, v3 멤버는 자동으로 v2 모드로 다운그레이드됩니다. 이는 RFC 3376의 하위 호환 규칙에 따른 것이며, 다운그레이드된 상태는 Older Version Querier Present Timeout(기본 400초) 동안 유지됩니다. 결과적으로 네트워크 전체가 최저 버전에 맞춰 동작하게 됩니다.

IGMP v2 상태 전이 다이어그램 (RFC 2236 기준):

                  그룹에 관심 없음
                        │
          ┌─────────────▼─────────────┐
          │        Non-member         │
          └─────────────┬─────────────┘
                        │ 가입 의사 / Query 수신
                        ▼
          ┌─────────────────────────────┐
          │     Delaying Member         │◄──── Query 수신 시
          │  (랜덤 타이머 대기 중)         │      타이머 재설정
          └──────┬──────────────┬───────┘
                 │              │
    타이머 만료    │              │ 다른 호스트의 Report 수신
    → Report 전송 │              │ (Report Suppression)
                 ▼              ▼
          ┌─────────────────────────────┐
          │       Idle Member           │
          │  (멤버십 유지, 대기 상태)      │
          └─────────────┬───────────────┘
                        │ Leave Group 전송 또는
                        │ 그룹 관심 없어짐
                        ▼
                   Non-member
v2/v3 혼용 시 주요 문제점:
  • 소스 필터링 불가: IGMPv3의 핵심 기능인 INCLUDE/EXCLUDE 소스 필터링은 v3 Report에서만 전달됩니다. v2 Querier가 존재하거나 v2 모드로 다운그레이드된 환경에서는 소스 정보가 사라지며, (S,G) 엔트리가 생성되지 않고 (*,G)로 처리됩니다. SSM(Source-Specific Multicast)을 사용하는 서비스가 있다면 모든 장비가 v3인지 반드시 확인해야 합니다.
  • Report Suppression 비활성화: IGMPv3는 Report Suppression을 하지 않습니다. v2 환경에서는 한 호스트의 Report를 관찰하면 나머지는 억제하지만, v3에서는 모든 호스트가 독립적으로 응답합니다. 혼용 환경에서는 예측하기 어려운 Query 응답 패턴이 발생할 수 있습니다.

IGMP Querier 장애 시나리오 및 해결: 네트워크에 IGMP Querier가 없으면 호스트들이 더 이상 Report를 보내지 않으며, 라우터/스위치의 스누핑 테이블이 순차적으로 타임아웃되어 비워집니다. 결과적으로 모든 멀티캐스트 멤버십이 만료되고 트래픽이 차단됩니다. 진단 및 해결 절차:

# 1. 현재 Querier 및 스누핑 상태 확인
vpp# show ip igmp snoop
# Querier 항목이 비어 있거나 타이머가 매우 큰 경우 Querier 부재 의심

# 2. IGMP 설정 상태 및 Query 인터벌 확인 (FRR/BIRD 연동 시)
router# show ip igmp
router# show ip igmp interface
# General Query Interval 기본값 125초, 타이머 만료 시 그룹 재질의

# 3. Query interval 단축으로 빠른 재가입 유도
router(config-if)# ip igmp query-interval 30
# 인터벌을 줄이면 Querier 부재 탐지 속도가 빨라지고 멤버십 재구축 시간 단축

# 4. VPP 인터페이스에 Querier 역할 수동 지정
vpp# set interface ip igmp <if> enable
# VPP를 router 모드로 활성화하면 Query 발송 주체 역할 가능

# 5. 멤버십 복구 확인
vpp# show ip igmp snoop
vpp# show ip mfib

BIER — Bit Indexed Explicit Replication

BIER(RFC 8279)는 전통적 멀티캐스트 트리 대신 패킷 헤더의 비트 마스크로 수신 라우터를 지정해 복제하는 방식입니다. 중간 라우터는 그룹 상태(state)를 유지할 필요가 없어 확장성이 뛰어납니다. VPP는 bier 플러그인으로 BIER 인코딩/디코딩, BFR(Bit-Forwarding Router) 역할, BIER over MPLS·SRv6 전송을 지원합니다.

vpp# bier table add bsl 256 sub-domain 0 set 0
vpp# bier route add <prefix> next-hop <ip> bp <bit-position>
vpp# show bier fib
vpp# show bier disp
vpp# show bier imp

BIER 도메인 설계 및 출력 해석

BSL(Bit String Length)은 도메인에 수용할 수 있는 BFER 수를 결정하며, 값이 클수록 BIER 헤더 크기가 증가합니다. 운영 환경에 맞는 BSL을 선택하는 기준은 아래 표를 참고합니다.

BSL헤더 크기최대 노드 수권장 시나리오
648B64노드소규모 랩·PoC 환경. MTU 부담 최소.
12816B128노드중소형 클러스터. 일반 1500B MTU 운용 가능.
25632B256노드데이터센터 중간 규모. Jumbo frame 권장.
51264B512노드대규모 멀티캐스트 망. Jumbo frame 필수.
MTU 영향: BIER 헤더는 고정 프리픽스 외에 BitString으로 BSL/8 바이트가 추가됩니다. BSL 256이면 32B, BSL 512면 64B가 패킷에 붙어 기존 1500B MTU 경로에서 단편화가 발생할 수 있습니다. 전송 경로 전체에서 Jumbo frame(9000B 이상)을 설정하는 것을 권장합니다.

show bier fib, show bier disp, show bier imp 세 명령의 출력 예시와 각 필드 의미입니다.

vpp# show bier fib
# BIER FIB: 각 bit-position(bp)에 대한 underlay next-hop 매핑
BIER-FIB: sub-domain:0 set:0 bsl:256
 bp:1  via: 192.0.2.1 GigabitEthernet0/8/0 weight:1   # bp 1번 BFER → GE0/8/0 통해 192.0.2.1로 전달
 bp:2  via: 192.0.2.2 GigabitEthernet0/9/0 weight:1   # bp 2번 BFER → GE0/9/0 통해 192.0.2.2로 전달
 bp:3  via: 192.0.2.3 GigabitEthernet0/10/0 weight:1  # bp 3번 BFER → GE0/10/0 통해 192.0.2.3으로 전달

vpp# show bier disp
# BIER Disposition: 이 노드가 BFER일 때 페이로드를 어디로 넘길지 지정
BIER-DISP: sub-domain:0 set:0 bsl:256
 etype:ipv4  dpo:[ip4-lookup:0]   # IPv4 페이로드 → 일반 ip4-lookup으로 전달
 etype:ipv6  dpo:[ip6-lookup:0]   # IPv6 페이로드 → ip6-lookup으로 전달

vpp# show bier imp
# BIER Imposition: 송신 시 패킷에 설정될 BitString과 next-hop 집합
BIER-IMP: sub-domain:0 set:0 bsl:256
 bitstring: 0x0000000000000000000000000000000000000000000000000000000000000007
 # bitstring의 하위 비트 3개(bit 0~2)가 1 → bp 1·2·3 세 BFER에 복제
 via: GigabitEthernet0/8/0 192.0.2.1 (bp:1)   # 첫 번째 복제 경로
 via: GigabitEthernet0/9/0 192.0.2.2 (bp:2)   # 두 번째 복제 경로
 via: GigabitEthernet0/10/0 192.0.2.3 (bp:3)  # 세 번째 복제 경로
필드위치설명
sub-domainFIB / DISP / IMP 공통BIER 도메인 내 하위 집합 식별자. 여러 sub-domain을 분리 운용할 때 사용합니다.
setFIB / DISP / IMP 공통동일 sub-domain 안에서 BSL별로 나뉜 Set Identifier. BSL이 크면 여러 Set으로 분할됩니다.
bslFIB / DISP / IMP 공통Bit String Length. 64·128·256·512 중 하나. 클수록 더 많은 BFER를 한 도메인에 수용합니다.
bpBIER FIBBit Position. 해당 BFER에 할당된 고유 번호. BitString의 bp번째 비트가 1이면 이 BFER로 전달합니다.
viaBIER FIB해당 bp에 도달하기 위한 underlay next-hop IP와 출력 인터페이스.
etypeBIER DISPBIER 페이로드 유형 (ipv4 / ipv6 / mpls 등). Disposition 시 이 타입에 맞는 DPO로 넘깁니다.
dpoBIER DISP페이로드를 전달할 DPO(Data-Path Object). 보통 ip4-lookup 또는 ip6-lookup.
bitstringBIER IMP현재 패킷에 담긴 BitString 값. 각 비트가 1인 위치가 수신 대상 BFER를 나타냅니다.

언리졸브된 next-hop 에러 증상 및 해결: show bier fib에서 특정 bp의 via 항목이 표시되지 않거나 next-hop이 unresolved로 나타나면, BIER underlay(unicast FIB)에 해당 경로가 없는 것입니다.

# 1. BIER FIB에서 미해석 next-hop 확인
vpp# show bier fib
BIER-FIB: sub-domain:0 set:0 bsl:256
 bp:4  via: 192.0.2.4  # 인터페이스 없음 → unresolved 상태

# 2. underlay unicast FIB에서 해당 주소 경로 확인
vpp# show ip fib 192.0.2.4
ipv4-VRF:0, fib_index:0
192.0.2.4/32
  unicast-ip4-chain
  [@0]: dpo-load-balance: [proto:0 index:9 buckets:1 ]
    [0] [@14]: ipv4 via 192.0.2.254 GigabitEthernet0/11/0: ...
# 위와 같이 해석된 경로가 있어야 BIER FIB next-hop이 정상 등록됨

# 3. 경로가 없으면 정적 경로 또는 라우팅 프로토콜로 추가
vpp# ip route add 192.0.2.4/32 via 192.0.2.254 GigabitEthernet0/11/0
디버깅 팁: show bier disp에 etype 엔트리가 없으면 Disposition이 설정되지 않은 것이므로 이 노드는 BFER 역할을 수행할 수 없습니다. bier route add가 올바른 sub-domain·set·bsl 조합으로 입력됐는지, 그리고 underlay FIB에 next-hop 경로가 해석되어 있는지를 함께 확인합니다.

BIER 헤더와 복제 동작

BIER 헤더는 BSL(BitString Length), Sub-domain, Set Identifier, BitString 네 필드로 구성됩니다. BSL 256 기준으로 32바이트 비트 스트링이 붙으며, 각 비트는 특정 Egress BFER(Bit-Forwarding Egress Router)를 지시합니다. 중간 BFR은 자신의 BIFT(Bit Index Forwarding Table)를 참조해 비트가 가리키는 next-hop 집합별로 패킷을 분할하고, 각 복사본에서는 해당 next-hop 경로의 비트만 남기고 나머지는 0으로 마스킹합니다. 이로써 동일 next-hop으로 가는 여러 BFER들이 한 번의 복제로 도달합니다.

BIER 트러블슈팅

  • BFER가 패킷을 수신하지 못함show bier fib로 해당 bit-position의 next-hop이 올바른지, 그리고 show bier disp로 disposition 엔트리가 etype별로 등록되어 있는지 확인합니다.
  • 중간 BFR에서 드롭 — BSL 값이 다른 BIFT끼리 만나면 호환되지 않습니다. 도메인 전체가 동일한 BSL·sub-domain을 쓰는지 확인합니다.
  • MPLS/SRv6 전송 시 파싱 실패 — BIER는 보통 MPLS 레이블 또는 SRv6 함수 뒤에 실립니다. 캡슐화 순서가 송수신 양단에서 일치해야 합니다.

MPLS · SR-MPLS

VPP는 Multi-Protocol Label Switching을 mpls 네임스페이스에서 별도 FIB로 관리합니다. Label Edge Router(LER)와 Label Switching Router(LSR) 역할을 모두 지원하며, PHP(Penultimate Hop Popping), ECMP, Fast Reroute(FRR) 같은 운영 기능도 제공합니다. Segment Routing for MPLS(SR-MPLS)는 상위에서 SID 리스트를 통해 경로를 지정합니다.

MPLS FIB 구성

vpp# mpls table add 0
vpp# set interface mpls <if> enable
vpp# mpls local-label add 100 eos ip4-lookup-in-table 0
vpp# ip route add 10.0.0.0/24 via 192.168.1.1 <if> out-labels 200
vpp# show mpls fib
vpp# show mpls tunnel

MPLS 포워딩 경로 내부

수신 패킷이 MPLS로 식별되면 mpls-input 노드가 top-of-stack 레이블을 읽어 mpls_lookup으로 진입합니다. 매칭된 MPLS 엔트리는 DPO로 다음 중 하나를 가집니다:

ECMP는 레이블 스택 해시로 분산하고, FRR은 backup path DPO를 미리 설치해 링크 장애 시 즉시 전환합니다.

MPLS 트러블슈팅

  • 레이블 드롭 (mpls-input error)show mpls fib에 해당 local-label이 없거나, 인바운드 인터페이스에서 set interface mpls <if> enable이 빠진 경우입니다.
  • PHP 후 IP 라우팅 실패 — Pop 이후 ip4-lookup-in-table이 지정한 테이블에 경로가 있어야 합니다. MPLS와 IP VRF 테이블 매핑을 재확인합니다.
  • TTL copy-mode 혼선 — MPLS 진입 시 IP TTL을 MPLS TTL로 복사할지, 고정값으로 할지에 따라 traceroute 결과가 달라집니다. uniform vs pipe 모드를 명확히 합니다.

SR-MPLS 정책

SR-MPLS는 IPv6가 아닌 환경에서 segment routing을 실현합니다. 정책은 binding SID로 식별되며, 트래픽을 특정 SID 리스트로 라우팅합니다.

vpp# sr mpls policy add bsid 1000 next 2001 next 2002 next 2003
vpp# sr mpls steer l3 10.0.0.0/24 via sr policy bsid 1000
SRv6와의 관계: SRv6(오버레이 — SRv6)는 IPv6 패킷 헤더 자체에 세그먼트 리스트를 넣고, SR-MPLS는 MPLS 레이블 스택으로 같은 개념을 표현합니다. 둘은 상호 배타적이지 않으며, 데이터센터는 SRv6를, 기존 MPLS 백본은 SR-MPLS를 선호하는 경향이 있습니다.

LISP — Locator/ID Separation Protocol

LISP(RFC 6830)는 IP 주소를 EID(Endpoint Identifier)RLOC(Routing Locator)로 분리합니다. 모바일성·멀티호밍·세그먼트 간 연결에 유리합니다. VPP는 lisp 플러그인으로 ITR/ETR/MR/MS 역할과 Map-Request/Map-Reply 컨트롤 평면, LISP-GPE 캡슐화를 지원합니다.

vpp# lisp enable
vpp# lisp eid-table add vni 0 eid 10.1.0.0/16
vpp# lisp locator-set add-del name ls1 iface <if> p 1 w 1
vpp# lisp map-register enable
vpp# lisp map-server add 192.0.2.1

LISP-GPE (Generic Protocol Extension)

LISP-GPE는 LISP 헤더에 next-protocol 필드를 추가해 이더넷 프레임, MPLS 패킷, NSH 서비스 헤더 등을 실을 수 있게 확장합니다. VPP는 lisp-gpe 노드로 이를 인코딩·디코딩합니다.

LISP 컨트롤 평면 흐름

ITR(Ingress Tunnel Router)이 EID → RLOC 매핑이 없는 패킷을 받으면, 패킷을 임시로 큐에 넣고 Map-Request를 Map-Resolver에 보냅니다. Map-Resolver는 ETR 쪽으로 요청을 포워딩하고, ETR(또는 Map-Server)은 Map-Reply를 ITR에게 직접 전달합니다. 수신된 매핑은 VPP의 Map-Cache에 저장되어 TTL 동안 재사용됩니다. 매핑이 없으면 lisp-input에서 drop 카운터가 증가합니다.

vpp# show lisp map-cache
vpp# show lisp eid-table
vpp# show lisp pitr
vpp# show lisp status

LISP 트러블슈팅

  • Map-Reply가 오지 않음 — ETR 쪽 lisp map-register가 enable이어도 Map-Server가 해당 EID를 수락했는지, 그리고 양쪽이 같은 인증 키(HMAC)를 쓰는지 확인합니다.
  • EID 간 통신 비대칭 — 한쪽 맵 캐시는 채워져 있고 다른 쪽은 비어 있을 수 있습니다. 양단 모두에서 show lisp map-cache를 확인합니다.
  • RLOC 이동 후 수렴 지연 — VPP는 SMR(Solicit-Map-Request)을 발송해 이전 ITR의 캐시를 무효화합니다. 방화벽이 SMR을 차단하면 TTL 만료까지 수렴이 지연됩니다.

BFD — Bidirectional Forwarding Detection

BFD(RFC 5880)는 밀리초 단위로 인접 장비의 장애를 감지하는 경량 프로토콜입니다. BGP·OSPF 같은 라우팅 프로토콜이 수 초~수십 초가 걸려 감지하는 장애를 수십 밀리초 내에 포착해 빠른 경로 전환을 가능하게 합니다.

vpp# bfd udp session add interface <if> local-addr 10.0.0.1 peer-addr 10.0.0.2      desired-min-tx 100000 required-min-rx 100000 detect-mult 3
vpp# show bfd sessions

위 설정은 100ms × 3배 = 300ms 안에 장애를 감지합니다. 실제 운영에서는 라우팅 프로토콜(FRR/BIRD)과 연동해 경로 fail-over를 자동화합니다.

Echo mode

BFD에는 asynchronous와 echo 두 모드가 있습니다. Echo 모드는 로컬이 보낸 패킷을 상대가 되돌려 주기만 하므로 상대 CPU를 덜 쓰고 더 공격적인 타이머(수십 ms)가 가능합니다. 단, 상대도 echo를 지원해야 합니다.

BFD 세션 상태 머신

BFD 세션은 AdminDown → Down → Init → Up 4개 상태로 전이합니다. 각 패킷 헤더의 My Discriminator, Your Discriminator, 상태 필드를 통해 쌍방 상태를 교환하며, detect-mult × required-min-rx 동안 패킷이 수신되지 않으면 Down으로 전환됩니다. VPP는 밀리초 정밀 타이머를 위해 별도 워커 스레드에서 BFD 이벤트를 처리하여 벡터 포워딩 지연에 영향받지 않게 합니다.

BFD 트러블슈팅

  • 세션이 Init에서 Up으로 올라가지 않음 — 한 방향만 패킷이 도달하는 경우입니다. 방화벽/ACL이 UDP 3784(control)·3785(echo)·4784(multihop)를 양방향으로 허용하는지 확인합니다.
  • 간헐적 flappingdetect-mult가 너무 낮거나, CPU 오버커밋으로 워커가 주기적으로 지연되는 경우입니다. show runtime에서 BFD 노드 벡터 크기와 지터를 확인합니다.
  • Echo 모드 활성화 실패 — 양단 모두 echo 지원 확인 후, 패킷이 송신자에게 그대로 되돌아오는 L3 경로가 존재하는지(즉, 상대가 loopback 포워딩을 허용하는지) 검증합니다.

BFD 패킷 TOS/DSCP 설정 (VPP 25.10 신기능)

VPP 25.10부터 BFD UDP 패킷의 IP TOS 바이트(IPv4) 또는 트래픽 클래스(IPv6)를 전역으로 설정할 수 있습니다. BFD 제어 패킷이 네트워크 장비에서 DSCP 기반 우선 처리를 받도록 마킹할 때 유용합니다.

BFD + BGP 페일오버 연동

BFD 세션을 BGP 이웃과 연동하면 BGP keepalive 타이머(기본 180초)를 기다리지 않고 수십 밀리초 내에 이웃 장애를 감지해 경로를 전환할 수 있습니다. VPP에서 BFD 세션을 생성하고, FRR/BIRD 같은 라우팅 데몬에서 해당 BGP 이웃에 BFD 연동을 선언합니다.

# 1. VPP에서 BFD UDP 세션 생성 (bfd-key-id로 인증 키 연결)
vpp# bfd udp session add interface GigabitEthernet0/8/0 \
        local-addr 10.0.0.1 peer-addr 10.0.0.2 \
        desired-min-tx 100000 required-min-rx 100000 detect-mult 3 \
        bfd-key-id 1

# 2. FRR BGP 데몬에서 해당 이웃에 BFD fall-over 선언
router(config-router)# neighbor 10.0.0.2 fall-over bfd
# BGP 이웃 10.0.0.2가 BFD Down을 수신하면 즉시 BGP 세션 해제 → 경로 철회

# 3. 멀티홉 BGP 이웃 (eBGP over multiple hops)
vpp# bfd udp session add interface GigabitEthernet0/8/0 \
        local-addr 10.0.0.1 peer-addr 203.0.113.1 \
        desired-min-tx 300000 required-min-rx 300000 detect-mult 3 \
        multihop
# 멀티홉 세션은 UDP 4784 포트를 사용

# 4. 세션 상태 확인
vpp# show bfd sessions

BFD 에코 모드 활성화/비활성화 결정: 에코 모드는 로컬이 보낸 패킷을 상대가 그대로 되돌려 주기 때문에 더 낮은 타이머(수십 ms)로 빠른 감지가 가능합니다. 그러나 방화벽이나 ACL이 에코 패킷(UDP 3785, 소스 = 목적지 = 로컬 주소)을 차단하거나 대칭 경로가 보장되지 않는 환경에서는 에코 모드가 동작하지 않으므로 비활성화해야 합니다.

# 에코 모드 비활성화 (방화벽이 에코 패킷 차단 시)
vpp# bfd udp session mod interface GigabitEthernet0/8/0 \
        local-addr 10.0.0.1 peer-addr 10.0.0.2 \
        desired-min-echo-tx 0
# desired-min-echo-tx 0 = 에코 모드 사용 안 함

show bfd sessions 출력 해석:

vpp# show bfd sessions
# 각 필드 의미
Index  State   If             Local            Remote          Tx(us)  Rx(us)  DMult  Demand
  0    Up      GigE0/8/0      10.0.0.1         10.0.0.2        100000  100000    3     No
#       ↑       ↑              ↑                ↑               ↑       ↑        ↑      ↑
#  세션 ID  현재 상태  인터페이스  로컬 주소         피어 주소      Tx간격  Rx간격  감지배수  Demand모드

# State 값과 의미:
#   AdminDown : 관리자가 세션을 비활성화함
#   Down      : 연결 없음 또는 초기 협상 전
#   Init      : 로컬이 Down 상태에서 상대의 BFD 패킷을 수신한 상태 (단방향 수신)
#   Up        : 양방향 BFD 패킷 수신 확인, 세션 정상

# Tx(us) / Rx(us): 협상된 송신/수신 간격 (마이크로초)
# DMult: detect-mult — 이 배수만큼 Rx 간격 동안 패킷이 없으면 Down
# Demand: Demand 모드 활성화 여부 — Yes이면 주기 전송 없이 Poll 방식으로 동작
BFD Init 상태에서 Up으로 올라가지 않을 때 — 방화벽 ACL 체크리스트:

Init 상태는 로컬이 상대의 BFD 패킷을 수신했으나 상대가 로컬 패킷을 아직 수신하지 못한 단방향 상태입니다. 양방향 수신이 확인되어야 Up으로 전이합니다. 다음 순서로 방화벽/ACL을 확인합니다:

  1. UDP 3784 양방향 허용 여부 확인 — BFD 제어 패킷(Control)은 UDP 3784를 사용합니다. 로컬 → 피어, 피어 → 로컬 양방향이 모두 열려 있어야 합니다.
  2. UDP 3785 에코 패킷 허용 여부 — 에코 모드 사용 시 UDP 3785도 개방되어야 합니다. 에코 패킷은 소스 IP = 목적지 IP(로컬 주소)로 전송되므로 방화벽의 anti-spoofing 규칙에 의해 차단될 수 있습니다.
  3. 멀티홉 세션: UDP 4784 허용 여부 — 멀티홉 BFD는 UDP 4784를 사용합니다. 단일 홉 세션과 별도로 ACL을 확인합니다.
  4. TTL/Hop Limit 확인 — 단일 홉 BFD는 TTL=255로 전송하며 수신측도 TTL=255를 기대합니다. NAT나 프록시가 TTL을 변경하면 패킷이 거부됩니다.
  5. 패킷 캡처로 실제 도달 여부 검증tcpdump -i <if> udp port 3784로 양단에서 패킷 유입/유출을 직접 확인합니다.

BFD 포트 참조: 제어 패킷 UDP 3784, 에코 패킷 UDP 3785, 멀티홉 제어 UDP 4784