~/network/commands/path-tracing

목적지 IP까지 경로 추적하기

Juniper(Junos)와 Cisco(NX-OS)가 섞인 멀티벤더 환경에서 코어 스위치 또는 라우터에서 시작해 특정 목적지 IP(서버/VM)까지 어떤 장비와 인터페이스, VLAN을 거치는지 추적하는 과정을 정리해보았다.

0. 경로는 두 층으로 나뉜다

경로 추적의 핵심은 L3(라우팅)와 L2(스위칭)를 분리해서 보는 것이다.

구분L3 라우팅 경로L2 스위칭 경로
무엇라우터 → 라우터 hop같은 VLAN(브로드캐스트 도메인) 내부
추적 도구라우팅 테이블 (show route / show ip route)MAC 테이블 (show mac address-table)
끝나는 지점목적지 VLAN의 게이트웨이(SVI) 를 가진 장비목적지가 물린 엣지(서버) 포트
키워드next-hop, metric, ECMP, VRF, OSPFVLAN, trunk, switchport, MAC OUI

L3/L2 경계 = 목적지 VLAN의 SVI(게이트웨이)를 가진 장비. 그 장비가 "마지막 라우터"이며, 그 아래부터는 같은 VLAN 안에서의 L2 스위칭이다. "directly attached"는 케이블로 직접 연결됐다는 뜻이 아니라, 같은 서브넷(VLAN) 안에 있다는 L3상의 의미일 뿐임에 주의

📊 다이어그램 렌더링 중…

1. [Phase A] L3 라우팅 경로 추적

라우터에서 시작해 목적지 VLAN의 게이트웨이(SVI) 를 만날 때까지 라우터를 한 대씩 따라간다. 각 라우터에서 목적지 경로를 조회해 출력 인터페이스를 확인하고, 그 인터페이스의 LLDP 이웃 장비로 접속하는 과정을 반복한다.

1) 목적지로 가는 경로 조회 — 출력 인터페이스 확인

# NX-OS
show ip route [목적지 IP] 

# Junos
show route [목적지 IP]

default 테이블만 확인하지 말고 스페이스바로 출력 결과를 끝까지 내려서 확인할 것 — 목적지 대역을 실제로 보유한 경로는 default route가 있는 테이블이 아니라, 해당 네트워크를 수용하는 다른 VRF의 라우팅 테이블에 존재할 수 있다.

IP는 먼저 어느 VRF에 속하는지를 보고 그 VRF의 라우팅 테이블을 참조해 라우팅된다. 이전 홉에서 확인한 next-hop IP가 현재 장비의 어느 VRF로 잡히는지 확인하고, 해당 VRF의 라우팅 테이블에서 목적지 대역이 Direct 또는 Local 경로로 보이면 이 장비가 목적지 대역을 직접 연결(Connected)하고 있는 것이다.

어느 VRF로 라우팅되는지 확인하는 방법

이전 홉에서 확인한 next-hop IP가 현재 장비의 어느 VRF에 속하는지 찾은 뒤, 그 VRF로 목적지를 다시 조회한다.

① 이전 장비에서 next-hop 확인

이전 홉 장비에서 목적지로 show route [목적지 IP]를 실행하면 next-hop 주소가 나온다.

② 현재 장비에서 그 next-hop이 속한 VRF 찾기

현재 장비에서 그 next-hop IP를 vrf all로 조회하면, 어느 VRF에 attached/local로 잡히는지 보인다.

# show ip route 10.13.245.14 vrf all
IP Route Table for VRF "vrf01_To_Uplink"
...
10.13.245.14/32, ubest/mbest: 1/0, attached
    *via 10.13.245.14, Eth1/45, [0/0], local

10.13.245.14vrf01_To_Uplinklocal로 떠 있으므로, 트래픽은 vrf01_To_Uplink VRF에서 라우팅된다.

③ 그 VRF로 목적지 IP 조회

앞서 찾은 VRF를 걸어 목적지 IP를 조회하면, 트래픽이 목적지로 가기 위해 여러 VRF 중 어떤 VRF로 향하는지 알 수 있고, 목적지로 가는 next-hop과 출력 인터페이스를 확인할 수 있다.

# show ip route 10.58.10.20 vrf vrf01_To_Uplink
IP Route Table for VRF "vrf01_To_Uplink"
...
10.58.0.0/18, ubest/mbest: 1/0
    *via 10.13.244.44, Vlan31, [1/0], 2y12w, static

④ 확인 명령어

출구 인터페이스에 목적지 서브넷 대역의 IP가 설정되어 있으면, 이 장비가 해당 서브넷의 L3 경계(게이트웨이) 이다.

# NX-OS
show run interface <vlan 31/ethernet 1/5.3055>

# Junos
show configuration interfaces <irb/xe-0/0/34> unit [unit]

다음부터는 같은 VLAN 안에서 MAC을 따라 포트를 찾는 Phase B로 이어진다.

⑤ 정리

패킷이 어느 VRF 테이블에서 조회되는지는 들어온(inbound) 인터페이스의 VRF 소속으로 결정된다.

  1. 이 패킷이 어느 인터페이스로 들어왔나 → Eth1/45
  2. Eth1/45는 어느 VRF 소속인가 → vrf01_To_Uplink
  3. 목적지 IP를 vrf01_To_Uplink의 라우팅 테이블에서만 조회한다

참고: 인터페이스 이름과 VRF 이름을 보고 유사성을 파악하여 어떤 VRF로 갈지 유추할 수도 있다.
예를 들어 방화벽의 GW Interface가 TC_DB(Vlan9)로 설정되어 있다면, 해당 트래픽은 DB망과 연관된 네트워크일 가능성이 높다. 이 경우 트래픽이 DB 관련 VRF를 통해 처리될 것임을 유추할 수 있다.

2) 그 인터페이스의 이웃 장비 식별 → 접속

# NX-OS
show lldp neighbors interface ethernet 1/5 detail 

# Junos
show lldp neighbors interface xe-0/0/34:3

LLDP 출력에서 이웃 장비의 hostname를 확인하고, 해당 장비의 OOB IP로 SSH 접속해 1번부터 반복한다.

종료 조건 - 게이트웨이 도달

라우팅 출력에서 목적지 경로가 attached/am(NX-OS) 으로 잡히거나 next-hop이 목적지 자신을 가리키면, 목적지 서브넷이 이 장비에 directly attached된 것이다. 즉 이 장비가 목적지 VLAN의 게이트웨이이며 여기서 L3가 끝난다.

# 라우터 hop (계속 진행)
*via [next-hop IP], Ethernet1/5.3055    ← 라우티드 IF, next-hop = 다른 라우터

# 게이트웨이 (L3 끝)
*via [목적지 IP], Vlan505, [250/0], am   ← SVI(VlanXXX/irb), attached → 여기가 경계

출구 인터페이스가 SVI(Cisco VlanXXX / Juniper irb.XX)라면

route lookup 출구가 물리 인터페이스(Eth1/x, xe-0/0/x)면 그 포트가 곧 egress라서, LLDP로 이웃 장비를 확인하면 된다. 하지만 SVI(VlanXXX / irb.XX)가 출구로 찍히면 라우팅만으로는 실제 나가는 포트를 알 수 없다. SVI는 여러 물리 포트가 묶인 브로드캐스트 도메인이라, egress 포트는 라우팅이 아니라 L2(ARP → MAC 테이블 → 포트 → LLDP) 로 내려가야 드러난다. 이 L2 추적 절차는 Phase B에서 다룬다.


2. [Phase B] L2 스위칭 경로 추적

게이트웨이(또는 출구가 SVI로 찍힌 장비)부터는 라우팅이 아니라 같은 VLAN 안에서 MAC을 따라 포트를 찾아 엣지까지 내려간다.

[1] ARP              → 추적 대상 IP의 MAC + 어느 VLAN인지   (incomplete면 STOP)
[2] MAC table        → 그 MAC이 학습된 인터페이스 (물리 포트 또는 port-channel/ae)
[3] interface desc   → 그 인터페이스의 description 확인하면 ⇒ 다음 홉 장비 호스트명 알 수 있음
        ↓  (desc가 없거나 현행화가 안 됐으면)
[4] po/ae 멤버 → LLDP → 물리 멤버 포트의 LLDP 이웃으로 확인

조회한 IP가 ARP 테이블에 엔트리로 직접 잡혀 있다면, 그 IP가 같은 서브넷(브로드캐스트 도메인)에 있다는 뜻이다 — 즉 이 장비와 목적지 사이에 L3 홉이 없다. 남은 경로는 전부 같은 VLAN 안에서의 L2 스위칭이므로, MAC이 학습된 인터페이스가 곧 목적지(또는 목적지로 향하는 다음 스위치)로 이어지는 egress 포트다.

# NX-OS
show ip arp [추적 대상 IP | vlan <num>] [vrf <all | VRF이름>]     ! ① MAC + VLAN ID 확인 
show mac address-table [address <MAC>] [vlan <id>]         ! ② 그 MAC이 학습된 인터페이스(물리 포트/po)
show running-config interface <port>                     ! ③ 그 인터페이스 description 확인
show lldp neighbors interface <port>                     ! ④ desc가 없거나 현행화 안 됐을 때

# Junos (EX/QFX 스위치)
show arp [no-resolve] [hostname <추적 대상 IP>] [interface irb.XX] [vpn <VRF이름>]     ! ① MAC + 출력 IF(xe-/ae#) 확인 
show ethernet-switching table [vlan-id <id>] | match <MAC>     ! ② 그 MAC이 학습된 물리 포트/ae 
show interfaces <port> descriptions       ! ③ 그 인터페이스 description 확인
show lldp neighbors interface <port>      ! ④ desc가 없거나 현행화 안 됐을 때

# Junos (MX 라우터 — bridge-domain 기반)
show arp [no-resolve] [hostname <추적 대상 IP>] [interface irb.XX] [vpn <VRF이름>]     ! ① ARP는 플랫폼 공통 — MAC + 출력 IF(xe-/ae#) 확인
show bridge mac-table [vlan-id <id>] | match <MAC>      ! ② 그 MAC이 학습된 물리 포트/ae
show interfaces <port> descriptions       ! ③ 그 인터페이스 description 확인
show lldp neighbors interface <port>      ! ④ desc가 없거나 현행화 안 됐을 때

[학습 인터페이스의 description 확인하여 다음 장비명 알아내기]

L2 구간에서 다음 장비는 next-hop의 MAC이 어느 인터페이스에서 학습됐는지 멕테이블을 통해 확인하고, 그 인터페이스의 description으로 상대 장비 호스트명을 읽어 식별 한다.

  • MAC 테이블이 알려주는 학습 인터페이스는 대개 논리 번들(po/ae)인데, description은 이 논리 인터페이스 수준에서 상대 장비를 바로 가리킨다.
  • LLDP는 물리 포트 단위라 번들이면 멤버 포트부터 알아야 하고, 장비에 따라 꺼져 있기도 하다.

[description이 없거나 현행화 안 됐을 때 — LLDP 활용]

description이 비어 있거나 장비 교체 후 현행화되지 않아 호스트명이 실제와 다를 수 있다. 이때 LLDP로 물리 포트의 실제 이웃을 확인하면 다음 장비를 알 수 있다.

학습 인터페이스가 논리 번들(po/ae)이면 LLDP는 물리 포트 단위로 동작하므로 멤버 물리 포트부터 찾는다.

description은 작성자가 오기입할 수도 있으니 되도록 설정 정보(arp table)를 기반으로 확인한다.

💡 L3, L2 구분 TIP:
인터페이스 config에서 family inet가 보이면 L3 인터페이스, family bridge가 보이면 L2 인터페이스라는 의미이다.

# NX-OS — port-channel(Po) 멤버 확인
show port-channel summary interface port-channel <num>     ! Po#의 멤버 물리 포트 (예: Eth1/xx, Eth1/yy)
show lldp neighbors interface ethernet 1/xx

# Junos — LAG(ae) 멤버 확인
show lacp interfaces ae<num>                               ! ae#의 멤버 물리 포트 (또는 show interfaces ae<num>)
show lldp neighbors interface <port>

다음 홉이 또 다른 스위치면 그 스위치로 접속해 MAC 조회부터 반복하고, 호스트면 거기가 종단 — Phase C로 넘어간다.


3. [Phase C] 종단(서버/VM) 식별

엣지 포트 너머가 무엇인지 확정한다.

1) 인터페이스 description으로 서버 확인

show run interface ethernet 1/10                  # description에 서버 호스트명

2) MAC OUI로 판별

ARP에서 얻은 목적지 MAC의 앞 3바이트(OUI) 를 본다.

OUI / 비트의미
fa:16:3eOpenStack(Neutron) 가상 NIC → VM
52:54:00QEMU/KVM 기본 가상 NIC → VM
00:50:56VMware 가상 NIC → VM
00:09:0f / 90:6c:acFortinet(FortiGate) → 방화벽(fw)
첫 옥텟 U/L 비트=1 (예: fa,52)로컬 관리 = 소프트웨어 할당(가상)
첫 옥텟 U/L 비트=0 (예: d4,00)벤더가 구운 진짜 하드웨어 MAC

한 물리 포트에 MAC이 여러 개 잡히고, 그중 하나는 하드웨어 MAC(벤더 burn-in, U/L=0) 나머지는 가상 MAC(소프트웨어 할당, U/L=1)이라면 → 그 서버는 하이퍼바이저이고, 가상 MAC들은 그 위에서 도는 게스트 VM이다.


4. Junos ↔ NX-OS 명령어 비교표

목적Junos (EX/QFX)Junos (MX)NX-OS
라우팅show route 10.0.0.1-show ip route 10.0.0.1
VRF (특정)show route 10.0.0.1 table <vrf>.inet.0-show ip route 10.0.0.1 vrf <NAME>
VRF (전체)show route 10.0.0.1-show ip route 10.0.0.1 vrf all
VRF 목록show route instance [summary]-show vrf
VLANshow vlans <name> [detail]show bridge domain <bd-name> [detail]show vlan id <vlan-id>
인터페이스 상세show interfaces ae21.0 detail-show interface Eth1/5
인터페이스 설정show configuration interfaces | display set-show running-config interface Eth1/5 [all]
IP 요약show interfaces terse-show ip interface brief
이웃show lldp neighbors [interface X]-show cdp neighbors / show lldp neighbors interface X detail
MAC 테이블show ethernet-switching tableshow bridge mac-tableshow mac address-table
ARP 테이블show arp no-resolve [interface X | vpn NAME]-show ip arp [IP] [vrf all | vrf NAME | interface X | detail]
LAG 멤버show lacp interfaces ae21-show port-channel summary
출력 필터| match, | count-| include, | grep -i -A N, | egrep "a|b", | begin
FIBshow route forwarding-table destination X-show forwarding route X