안동민 개발노트 아이콘

안동민 개발노트

5장 : 라우팅

라우팅의 기본 개념

IP 주소는 목적지를 식별하지만, 패킷이 그 목적지까지 어떤 이웃에게 넘어가야 하는지는 별도 문제입니다. 이때 구분해야 할 말이 두 가지 있습니다. 라우팅(Routing)은 경로 정보를 만들고 고르는 제어 평면의 일이고, 포워딩(Forwarding)은 실제 패킷마다 다음 홉으로 내보내는 데이터 평면의 일입니다.

서울의 PC가 미국 리전에 있는 서버로 패킷을 보낼 때, 한 라우터가 전체 여정을 처음부터 끝까지 정해 주는 것이 아닙니다. 각 라우터는 자기 테이블을 보고 “이번 홉에서는 어느 인터페이스, 어느 다음 홉으로 보낼지”를 고릅니다. 이 작은 결정이 여러 번 이어져 목적지 네트워크에 도달합니다.


라우터의 역할

라우터(Router)는 서로 다른 IP 네트워크를 연결하고, 목적지 IP 주소를 기준으로 다음 홉과 출력 인터페이스를 결정하는 장치입니다. 스위치가 주로 같은 L2 네트워크 안에서 MAC 주소 기반 프레임 전달을 담당한다면, 라우터는 L3 경계를 넘어 패킷을 전달합니다.

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

단계동작의미
1L2 프레임 수신목적지 MAC이 자신 또는 수신 가능한 주소이면 처리
2IP 패킷 검사목적지 IP, TTL, 헤더 오류, 정책 필터 등을 확인
3FIB 조회목적지 IP에 가장 잘 맞는 prefix의 다음 홉을 찾음
4TTL 감소IPv4 TTL을 1 줄이고 0이면 폐기, 보통 ICMP 오류 생성
5새 L2 헤더 작성다음 홉의 MAC 주소를 ARP로 확인하고 새 프레임을 만듦
6출력 인터페이스 전송MTU, 큐잉, ACL, QoS 같은 장치 정책을 거쳐 내보냄

핵심은 L2와 L3의 역할 분리입니다. NAT나 터널 같은 예외를 빼면 IP 출발지와 목적지는 end-to-end로 유지됩니다. 반면 이더넷 MAC 주소는 링크마다 새로 붙습니다. 같은 IP 패킷이더라도 매 홉에서 프레임은 다시 만들어집니다.


라우팅 테이블 구조

라우터 안에는 경로를 학습하고 저장하는 RIB(Routing Information Base)와, 실제 포워딩에 쓰기 좋게 정리된 FIB(Forwarding Information Base)가 있습니다. 운영자가 보는 ip routeshow ip route는 보통 RIB에 가까운 관점이고, 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.100172.16.0.0/16, 172.16.5.0/24, 0.0.0.0/0에 모두 포함됩니다. 이때 /24가 가장 구체적이므로 먼저 선택됩니다. 디폴트 라우트인 /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))

실제 장비는 이 예제처럼 매 패킷마다 선형 검색을 하지 않습니다. 소프트웨어 라우터는 radix tree, LC-trie 같은 prefix 자료구조를 쓰고, 하드웨어 라우터는 TCAM이나 ASIC FIB를 사용합니다. 중요한 것은 구현 방법보다 “더 구체적인 prefix가 더 넓은 prefix보다 우선한다”는 규칙입니다.


정적 라우팅과 동적 라우팅

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

비교 항목정적 라우팅동적 라우팅
경로 생성관리자가 prefix, next hop을 직접 입력라우팅 프로토콜이 토폴로지와 정책을 반영
장애 대응기본은 수동, 추적 기능을 붙이면 보완 가능수렴 시간이 지나면 다른 후보 경로로 전환
운영 부담작고 고정된 네트워크에서 단순규모가 커질수록 변경 관리가 쉬움
오버헤드프로토콜 교환 없음CPU, 메모리, 링크 대역폭을 일부 사용
대표 사례기본 게이트웨이, 지사, 백업 경로OSPF/IS-IS 내부망, BGP 인터넷/AS 간 라우팅
보안 관점외부 경로 수신이 적어 예측 가능인증, 필터링, 정책 없이는 잘못된 경로 수신 위험

정적 라우팅은 경로가 적고 토폴로지가 잘 바뀌지 않을 때 강합니다. 동적 라우팅은 여러 회선과 여러 라우터가 있는 환경에서 경로 교환과 장애 대응을 자동화합니다. 실무에서는 둘 중 하나만 쓰기보다, 동적 라우팅 위에 특정 목적지의 정적 경로나 백업용 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이 아니라 기본 게이트웨이의 MAC을 찾아 라우터로 보냅니다. 이후 각 라우터는 목적지 IP를 기준으로 다음 홉을 고르고, 새 링크 계층 헤더를 붙여 다음 장비로 넘깁니다.


Administrative Distance와 경로 선호도

Administrative Distance(AD)는 Cisco 계열 문서에서 자주 보는 경로 출처 신뢰도 값입니다. 낮을수록 선호도가 높으며, 같은 prefix에 대해 static, OSPF, RIP 같은 여러 출처가 동시에 후보가 될 때 어떤 경로를 RIB에 올릴지 결정하는 데 쓰입니다.

경로 소스흔한 Cisco AD 값설명
Connected0직접 연결된 prefix
Static1관리자가 명시한 경로
eBGP20다른 AS에서 배운 BGP 경로
OSPF110링크 상태 기반 IGP
RIP120거리 벡터 기반 IGP
iBGP200같은 AS 안에서 배운 BGP 경로
Unknown255사용하지 않는 경로

다만 AD 값은 인터넷 표준 전체의 공통 숫자가 아니라 벤더별 경로 선호도 구현의 한 예입니다. 또한 포워딩 시에는 먼저 FIB에 설치된 경로 중 목적지와 가장 구체적으로 맞는 prefix가 선택됩니다. 같은 prefix 안에서 어떤 후보가 설치될지는 선호도, 프로토콜 메트릭, 정책이 함께 결정합니다.

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