안동민 개발노트

본문 시작

라우팅의 기본 개념

라우팅과 포워딩을 구분하고 라우팅 테이블의 접두어·다음 홉·메트릭을 읽어 최장 접두어 경로를 선택합니다.

IP 주소는 목적지를 식별하지만, 패킷이 그 목적지까지 어떤 이웃에게 넘어가야 하는지는 별도 문제입니다.

이때 구분해야 할 말이 두 가지 있습니다.

라우팅(Routing)은 경로 정보를 만들고 고르는 제어 평면의 일이고, 포워딩(Forwarding)은 실제 패킷마다 다음 홉으로 내보내는 데이터 평면의 일입니다.

서울의 PC가 미국 리전에 있는 서버로 패킷을 보낼 때, 한 라우터가 전체 여정을 처음부터 끝까지 정해 주는 것이 아닙니다.

각 라우터는 자기 테이블을 보고 “이번 홉에서는 어느 인터페이스, 어느 다음 홉으로 보낼지”를 고릅니다.

이 작은 결정이 여러 번 이어져 목적지 네트워크에 도달합니다.


라우터의 역할

라우터(Router)는 서로 다른 IP 네트워크를 연결하고, 목적지 IP 주소를 기준으로 다음 홉과 출력 인터페이스를 결정하는 장치입니다.

스위치가 주로 같은 L2 네트워크 안에서 MAC 주소 기반 프레임 전달을 담당한다면, 라우터는 L3 경계를 넘어 패킷을 전달합니다.

라우터가 이더넷 프레임 안의 IPv4 패킷을 전달할 때는 보통 다음 일을 합니다.

단계IPv4 포워딩에서 하는 일
1 · L2 수신프레임 목적지 MAC이 자신 또는 수신 가능한 주소인지 확인
2 · IP 검사목적지 IP·TTL·헤더 오류·정책 필터 등 확인
3 · FIB 조회가장 구체적으로 일치하는 프리픽스의 다음 홉 선택
4 · TTL 처리통상 1 감소, 만료 시 폐기하고 정책에 따라 ICMP 오류 생성
5 · L2 재작성필요하면 ARP로 다음 홉 MAC 확인 후 새 프레임 작성
6 · 출력MTU·큐잉·ACL·QoS 등 장치 정책에 따라 전송

핵심은 L2와 L3의 역할 분리입니다.

NAT나 터널 같은 예외를 빼면 IP 출발지와 목적지는 end-to-end로 유지됩니다.

반면 이더넷 MAC 주소는 링크마다 새로 붙습니다.

같은 IP 패킷이더라도 매 홉에서 프레임은 다시 만들어집니다.


라우팅 테이블 구조

라우터 안에는 경로를 학습하고 저장하는 RIB(Routing Information Base)와, 실제 포워딩에 쓰기 좋게 정리된 FIB(Forwarding Information Base)가 있습니다.

Linux의 ip route는 커널의 포워딩용 경로 테이블을 조회합니다. 라우팅 데몬의 RIB와는 구분해야 합니다. Cisco의 show ip route처럼 제어 평면 경로를 보여 주는 명령과 ASIC의 FIB 조회 명령도 장비별로 구분합니다.

라우팅 테이블 항목은 보통 다음 정보를 담습니다.

  • 목적지 prefix: 10.0.0.0/8, 192.168.1.0/24처럼 목적지 주소 범위를 CIDR로 표현합니다.
  • 다음 홉: 직접 연결이 아니면 패킷을 넘길 이웃 라우터의 IP 주소입니다.
  • 출력 인터페이스: 패킷이 나갈 물리적 또는 논리적 인터페이스입니다.
  • 경로 출처: connected, static, OSPF, BGP처럼 경로를 어디서 배웠는지 나타냅니다.
  • 선호도와 메트릭: 같은 prefix 후보가 여러 개일 때, 라우터는 벤더별 preference/AD, 프로토콜 내부 메트릭, 정책, ECMP 가능 여부 등을 함께 봅니다.

최장 접두어 매칭

포워딩 조회의 기본 원칙은 최장 접두어 매칭(Longest Prefix Match)입니다.

목적지 IP와 일치하는 prefix가 여러 개라면, 더 많은 비트가 일치하는 더 구체적인 경로를 고릅니다.

예를 들어 목적지 172.16.5.100은 172.16.0.0/16, 172.16.5.0/24, 0.0.0.0/0에 모두 포함됩니다.

다음 표는 아래 Python의 입력 데이터에 최장 접두어 규칙을 적용한 결과이며 실제 네트워크 관측은 아닙니다.

원문 경로 목록에서 세 목적지의 최장 접두어 선택

원문 Python 입력 목록에 최장 접두어 규칙을 적용한 계산입니다. 다음 홉·인터페이스의 실제 도달성은 이 함수가 검증하지 않습니다.

원문 경로 목록에서 세 목적지의 최장 접두어 선택
목적지일치하는 후보선택 경로 · 다음 홉
172.16.5.100/24 · /16 · /0172.16.5.0/24 · 192.168.1.4
172.16.10.1/16 · /0172.16.0.0/16 · 192.168.1.3
8.8.8.8/00.0.0.0/0 · 192.168.1.1
172.16.5.100
일치하는 후보: /24 · /16 · /0
선택 경로 · 다음 홉: 172.16.5.0/24 · 192.168.1.4
172.16.10.1
일치하는 후보: /16 · /0
선택 경로 · 다음 홉: 172.16.0.0/16 · 192.168.1.3
8.8.8.8
일치하는 후보: /0
선택 경로 · 다음 홉: 0.0.0.0/0 · 192.168.1.1

디폴트 라우트인 /0은 모든 IPv4 주소와 일치하지만, 다른 구체적인 경로가 없을 때만 마지막 후보가 됩니다.

longest_prefix_match.py
import ipaddress

def longest_prefix_match(dest_ip, routes):
    dest = ipaddress.ip_address(dest_ip)
    matches = []

    for network_str, next_hop, interface in routes:
        network = ipaddress.ip_network(network_str)
        if dest in network:
            matches.append((network.prefixlen, network_str, next_hop, interface))

    if not matches:
        return None

    return max(matches, key=lambda route: route[0])

routes = [
    ("192.168.1.0/24", "direct", "eth0"),
    ("172.16.0.0/16", "192.168.1.3", "eth0"),
    ("172.16.5.0/24", "192.168.1.4", "eth1"),
    ("0.0.0.0/0", "192.168.1.1", "eth0"),
]

for ip in ["172.16.5.100", "172.16.10.1", "8.8.8.8"]:
    print(ip, "=>", longest_prefix_match(ip, routes))

이 예제는 프리픽스 선택만 계산하며 다음 홉 도달성은 검사하지 않습니다. 특히 /24 항목의 eth1 연결 정보는 주어지지 않았으므로 이 목록을 그대로 설치할 수 있는 실제 장비 설정으로 해석하면 안 됩니다.

실제 장비는 이 예제처럼 매 패킷마다 선형 검색을 하지 않습니다.

소프트웨어 라우터는 radix tree, LC-trie 같은 prefix 자료구조를 쓰고, 하드웨어 라우터는 TCAM이나 ASIC FIB를 사용합니다.

중요한 것은 구현 방법보다 “더 구체적인 prefix가 더 넓은 prefix보다 우선한다”는 규칙입니다.


정적 라우팅과 동적 라우팅

라우팅 테이블은 관리자가 직접 넣을 수도 있고, 라우팅 프로토콜이 이웃 라우터와 정보를 교환해 만들 수도 있습니다.

방식경로 관리와 비용
정적 라우팅관리자가 프리픽스·다음 홉 입력; 기본은 수동 장애 대응이며 추적 기능으로 보완. 작고 고정된 망·기본 경로·백업에 적합; 프로토콜 교환 없음
동적 라우팅OSPF·IS-IS·BGP 등이 토폴로지·정책에 따라 경로 교환; 수렴 후 대체 경로 사용. CPU·메모리·대역폭 비용과 인증·필터링 관리 필요

정적 라우팅은 경로가 적고 토폴로지가 잘 바뀌지 않을 때 강합니다.

동적 라우팅은 여러 회선과 여러 라우터가 있는 환경에서 경로 교환과 장애 대응을 자동화합니다.

실무에서는 둘 중 하나만 쓰기보다, 동적 라우팅 위에 특정 목적지의 정적 경로나 백업용 floating static route를 함께 두는 구성이 흔합니다.


디폴트 라우트

디폴트 라우트는 더 구체적인 경로가 없을 때 쓰는 마지막 후보입니다.

IPv4에서는 0.0.0.0/0, IPv6에서는 ::/0으로 표기합니다.

가정용 PC는 인터넷의 모든 prefix를 알 필요가 없습니다.

로컬 네트워크 경로와 디폴트 게이트웨이만 있으면, 모르는 목적지는 일단 공유기나 상위 라우터로 넘길 수 있습니다.

상위 라우터도 같은 방식으로 자기 테이블을 조회하고, 이 과정이 반복됩니다.

디폴트 라우트가 없고 일치하는 prefix도 없으면 패킷은 전달할 수 없습니다.

여러 디폴트 라우트가 있으면 운영체제나 라우터는 메트릭, 정책, 인터페이스 상태, ECMP 설정 등을 기준으로 하나 또는 여러 경로를 선택할 수 있습니다.


라우팅 테이블 확인 실습

직접 자신의 시스템에서 라우팅 테이블과 실제 선택 경로를 확인해 봅시다.

routing_check.sh
# Linux: 전체 경로와 기본 경로
ip route show
ip route show default

# Linux: 특정 목적지로 갈 때 선택되는 source, gateway, interface
ip route get 8.8.8.8

# Linux: 특정 인터페이스와 연결된 경로
ip route show dev eth0

# 정적 경로 예시
# sudo ip route add 10.10.0.0/16 via 192.168.1.2 dev eth0
# sudo ip route del 10.10.0.0/16
# sudo ip route replace default via 192.168.1.254 dev eth0
Windows 확인 예시
route print
netstat -rn

Windows의 On-link는 해당 prefix가 인터페이스에 직접 연결되어 있어 게이트웨이를 거치지 않는다는 뜻입니다.

Linux의 scope link 또는 directly connected와 같은 계열로 이해하면 됩니다.


라우팅 과정 전체 흐름

패킷이 출발지에서 목적지까지 전달될 때는 “IP는 목적지 식별”, “L2 프레임은 다음 홉 전달”이라는 원칙이 반복됩니다.

PC도 먼저 라우팅 테이블을 조회합니다. 연결된 로컬 서브넷 경로가 선택되면 목적지 MAC으로 직접 보내고, 게이트웨이 경로가 선택되면 다음 홉의 MAC으로 보냅니다.

로컬 연결 경로와 기본 경로만 있는 단순한 구성에서는 다른 서브넷을 기본 게이트웨이로 보냅니다. VPN·정적 경로처럼 더 구체적인 항목이 있다면 그 경로가 먼저 선택됩니다.

이후 각 라우터는 목적지 IP를 기준으로 다음 홉을 고르고, 새 링크 계층 헤더를 붙여 다음 장비로 넘깁니다.


Administrative Distance와 경로 선호도

Administrative Distance(AD)는 Cisco 계열 문서에서 자주 보는 경로 출처 신뢰도 값입니다.

낮을수록 선호도가 높으며, 같은 prefix에 대해 static, OSPF, RIP 같은 여러 출처가 동시에 후보가 될 때 어떤 경로를 RIB에 올릴지 결정하는 데 쓰입니다.

경로 출처흔한 Cisco AD와 의미
Connected0 · 직접 연결
Static1 · 관리자 설정
eBGP20 · 다른 AS에서 학습
OSPF110 · 링크 상태 IGP
RIP120 · 거리 벡터 IGP
iBGP200 · 같은 AS 안에서 학습
Unknown255 · 사용하지 않음

다만 AD 값은 인터넷 표준 전체의 공통 숫자가 아니라 벤더별 경로 선호도 구현의 한 예입니다.

또한 포워딩 시에는 먼저 FIB에 설치된 경로 중 목적지와 가장 구체적으로 맞는 prefix가 선택됩니다.

같은 prefix 안에서 어떤 후보가 설치될지는 선호도, 프로토콜 메트릭, 정책이 함께 결정합니다.

다음 절에서는 동적 라우팅의 핵심인 라우팅 프로토콜, 특히 RIP, OSPF, BGP를 살펴보겠습니다.