동적 라우팅 프로토콜
라우터들이 경로를 스스로 주고받는 동적 라우팅을 자율 시스템 안의 IGP와 자율 시스템 사이의 BGP로 나누어 봅니다. 홉 수를 세는 RIP와 링크 상태로 최단 경로를 계산하는 OSPF를 다익스트라 알고리즘으로 비교하고, BGP가 정책과 경로 속성으로 경로를 고르는 과정과 경로 하이재킹의 위험을 정리합니다.
앞 글의 정적 경로는 관리자가 직접 넣는 것이었습니다. 하지만 라우터가 수십, 수백 대로 늘어나면 모든 경로를 손으로 넣고, 링크가 끊길 때마다 고치는 일은 불가능해집니다. 라우터들이 서로 경로의 정보를 주고받고, 네트워크가 바뀌면 스스로 경로를 고치게 하는 것이 동적 라우팅 프로토콜(dynamic routing protocol)입니다.
자율 시스템 안과 밖
AS BOUNDARY
IGP의 내부 도달성 위에서 eBGP가 AS 경로 정보를 교환한다
IGP는 AS 안의 전달 경로를 만들고, BGP는 그 기반 위에서 AS 경계를 넘어 도달성 정보를 교환합니다.
iBGP는 같은 AS의 BGP speaker 사이에서 외부 경로 정보를 전달할 수 있습니다. 위 연결은 IGP 내부 도달성과 eBGP 정보 교환을 비교한 것이며 iBGP 연결을 별도 선으로 그린 것은 아닙니다.
라우팅 프로토콜은 자율 시스템(autonomous system, AS)을 기준으로 두 종류로 나뉩니다. 1장 2편에서 본 것처럼 AS는 하나의 기관이 하나의 정책으로 운영하는 네트워크로, 통신사, 클라우드 사업자, 큰 기업이 AS 번호를 가지고 다른 AS와 경로를 주고받습니다.
| 구분 | IGP | BGP |
|---|---|---|
| 쓰는 곳 | AS 안 | AS 사이(eBGP)와, AS 안에서 바깥 경로를 나눌 때(iBGP) |
| 주고받는 것 | AS 안의 경로와 프로토콜마다 정한 메트릭 | 프리픽스와 그 경로의 속성 |
| 고르는 기준 | 메트릭이 가장 작은 경로 | AS가 정한 정책과 경로 속성 |
| 예 | RIP, OSPF, IS-IS | BGP-4 |
IGP(interior gateway protocol)는 한 기관의 네트워크 안에서 메트릭이 가장 작은 경로를 찾습니다. BGP는 AS 사이에서 어느 프리픽스에 닿을 수 있는지를 알리며, 서로 다른 AS를 잇는 것을 eBGP, 같은 AS 안의 BGP 라우터끼리 바깥에서 배운 경로를 나누는 것을 iBGP라고 합니다. BGP가 IGP를 대신하는 것은 아닙니다. BGP로 배운 경로의 다음 홉에 닿으려면 AS 안의 경로가 필요하므로, 둘은 함께 동작합니다.
RIP: 홉 수를 센다
RIP(routing information protocol)는 가장 오래된 IGP 가운데 하나로, 거리 벡터(distance vector) 방식입니다. 라우터마다 "어느 목적지까지 홉이 몇 개"라는 표를 이웃에게 주기적으로 알리고, 이웃의 표에 1을 더해 자기 표를 고칩니다. 메트릭은 거쳐 가는 라우터의 수, 곧 홉 수이며, RFC 2453에 따라 15가 최대이고 16은 닿을 수 없다는 뜻입니다.
이 방식은 단순하지만 두 가지 약점이 있습니다. 링크의 속도를 보지 않으므로, 1Gbps 링크 셋을 거치는 길보다 느린 링크 하나를 거치는 길을 고릅니다. 또 경로가 사라졌다는 소식이 이웃의 오래된 정보와 엇갈리면, 서로 상대를 거쳐 가면 된다고 믿으며 거리를 하나씩 키워 가는 무한대 세기(count to infinity)가 일어나 수렴이 늦습니다. 그래서 16을 무한대로 정해 두고, 경로를 배운 이웃에게는 그 경로를 다시 알리지 않는 스플릿 호라이즌(split horizon) 같은 장치를 씁니다.
OSPF: 지도를 그리고 최단 경로를 계산한다
OSPF(open shortest path first)는 링크 상태(link state) 방식입니다. 라우터마다 자기에게 연결된 링크와 그 비용을 담은 LSA(link state advertisement)를 같은 영역(area)의 모든 라우터에 퍼뜨리므로, 모든 라우터가 같은 네트워크의 지도를 갖게 됩니다. 각 라우터는 이 지도에서 자기를 출발점으로 다익스트라(Dijkstra) 알고리즘을 돌려 모든 목적지까지의 최단 경로를 계산합니다(RFC 2328). 링크의 비용은 관리자가 정하며, 보통 빠른 링크일수록 작게 둡니다.
다음 코드는 라우터 A, B, C 사이의 비용이 A–B는 2, B–C는 3, A–C는 8인 네트워크에서 A가 계산하는 최단 경로를, 링크마다 1로 세는 홉 수와 비교합니다. 결과는 목적지마다 (비용, 처음 넘길 이웃)입니다.
import heapq
def shortest_paths(graph, src):
best = {} # 목적지 -> (비용, 처음 넘길 이웃)
queue = [(cost, nbr, nbr) for nbr, cost in graph[src].items()]
heapq.heapify(queue)
while queue:
cost, node, first = heapq.heappop(queue)
if node in best:
continue # 이미 더 싼 길을 찾았다
best[node] = (cost, first)
for nxt, c in graph[node].items():
if nxt not in best and nxt != src:
heapq.heappush(queue, (cost + c, nxt, first))
return best
ospf = {"A": {"B": 2, "C": 8}, "B": {"A": 2, "C": 3}, "C": {"A": 8, "B": 3}}
hops = {n: {m: 1 for m in nbrs} for n, nbrs in ospf.items()} # RIP처럼 링크마다 1로 센다
print("OSPF 비용으로:", shortest_paths(ospf, "A"))
print("홉 수로:", shortest_paths(hops, "A"))OSPF 비용으로: {'B': (2, 'B'), 'C': (5, 'B')}
홉 수로: {'B': (1, 'B'), 'C': (1, 'C')}비용으로 따지면 C로 바로 가는 길은 8, B를 거치는 길은 2 + 3 = 5이므로 A는 C로 가는 패킷을 B에게 넘깁니다. 홉 수로 따지면 바로 가는 길이 1홉으로 가장 짧아 C로 바로 보냅니다. 같은 네트워크라도 무엇을 비용으로 보느냐에 따라 고르는 길이 다릅니다. 서로 다른 프로토콜의 메트릭 5와 1은 단위가 달라 서로 비교할 수 없다는 점도 기억해 둡니다.
OSPF는 링크가 바뀌면 LSA를 퍼뜨리고 바뀐 지도로 곧바로 다시 계산하므로 RIP보다 훨씬 빨리 수렴합니다. 바뀐 것이 없어도 각 라우터는 자기 LSA를 30분마다 다시 퍼뜨리지만, RIP가 30초마다 표 전체를 이웃에게 보내는 것과 비교하면 드문 갱신입니다. 대신 지도를 저장하고 계산하는 데 메모리와 CPU가 들어서, 큰 네트워크는 백본인 영역 0을 중심으로 여러 영역으로 나누어 LSA가 퍼지는 범위를 줄입니다. 통신사의 백본에서 많이 쓰는 IS-IS도 같은 링크 상태 방식입니다.
BGP: 정책으로 고른다
BGP(border gateway protocol)는 인터넷의 AS들이 서로 경로를 주고받는 사실상 유일한 프로토콜입니다. BGP 라우터는 이웃(peer)과 TCP 179번 포트로 세션을 맺고, UPDATE 메시지로 "이 프리픽스에 닿을 수 있다"는 정보와 그 경로의 속성을 알립니다. 가장 중요한 속성인 AS_PATH에는 그 경로가 거쳐 온 AS의 번호들이 차례로 적혀 있어서, 자기 AS 번호가 이미 들어 있는 경로는 루프로 보고 버립니다.
BGP는 OSPF처럼 최단 경로를 찾는 것이 목적이 아닙니다. AS 사이의 경로는 기술보다 사업 관계로 정해지기 때문입니다. "돈을 내는 고객이 알려 준 경로를 먼저 쓴다", "이 통신사는 거치지 않는다", "이 프리픽스는 저 이웃에게 알리지 않는다" 같은 결정이 BGP의 정책으로 설정됩니다. RFC 4271은 BGP가 받은 경로를 고르는 과정을, 정책을 적용하고, 쓸 수 없는 경로를 빼고, 남은 것 가운데 가장 좋은 것을 고른 뒤, 이웃마다 알릴지 정하는 단계로 설명합니다.
BGP 경로 후보를 단계적으로 좁히는 관점
두 후보에 수신 정책을 적용합니다. 로컬 선택과 peer별 광고 정책을 적용합니다. 각 단계의 값과 전환 이유를 비교합니다.
BGP BEST-PATH · CONCEPTUAL ORDER
BGP는 허용되고 사용 가능한 후보에서 선호도와 동률을 평가한다
고정 점수를 모두 더하는 표가 아니라, 사용할 수 없는 후보를 제외하고 선호도가 같은 후보를 순서대로 줄이는 과정으로 읽습니다.
-
수신 경로에 로컬 정책을 적용합니다
Adj-RIBs-In의 각 경로에 import 정책을 적용해 부적격 여부와 선호도를 계산합니다. 외부에서 학습한 경로를 iBGP로 다시 광고할 때는 계산한 선호도를 LOCAL_PREF로 전달합니다.
-
경로를 실제로 사용할 수 있는지 확인합니다
NEXT_HOP을 로컬 라우팅 테이블로 해석할 수 없는 경로를 제외하고, AS_PATH의 AS loop도 확인합니다.
-
최고 선호도를 고르고 동률을 해소합니다
가장 높은 선호도의 후보가 여러 개면 기본 명세는 AS_PATH 길이, ORIGIN, 비교 가능한 MED, eBGP 여부, NEXT_HOP까지의 IGP cost 같은 기준으로 후보를 줄입니다.
-
선택 결과를 반영하고 광고합니다
선택한 경로를 Loc-RIB에 반영하고, peer별 export 정책을 적용해 광고할 경로를 Adj-RIBs-Out에 구성합니다.
장비에서 확인할 때
이 순서는 표준의 공통 개념 경계입니다. 구현별 추가 기준과 정확한 명령 순서는 해당 장비의 공식 문서와 현재 정책 설정을 함께 확인합니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 정책 평가부터 반영과 광고까지 진행합니다.
관계도의 보충 설명
| 구분 | 전체 도표의 내용 |
|---|---|
| 제목 | BGP 경로 후보를 단계적으로 좁히는 관점 |
| 관계 설명 | 후보 경로 집합에 정책을 적용하고 사용 불가 후보를 제외합니다. 남은 후보에서 높은 선호도와 동률 해소로 경로를 선택하여 반영하고 peer별 정책으로 광고합니다. 화살표는 후보 판단 단계이며 사용자의 데이터 패킷이 BGP 세션을 지나는 경로가 아닙니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 정책 평가 두 후보에 수신 정책을 적용합니다. |
|
|
| 사용 가능성 NEXT_HOP과 AS 루프 조건을 확인합니다. |
|
|
| 선호도 선택 더 높은 LOCAL_PREF를 가진 A를 선택합니다. |
|
|
| 반영과 광고 로컬 선택과 peer별 광고 정책을 적용합니다. |
|
|
BGP 경로 후보를 단계적으로 좁히는 관점
두 후보에 수신 정책을 적용합니다. 로컬 선택과 peer별 광고 정책을 적용합니다. 각 단계의 값과 전환 이유를 비교합니다.
BGP BEST-PATH · CONCEPTUAL ORDER
BGP는 허용되고 사용 가능한 후보에서 선호도와 동률을 평가한다
고정 점수를 모두 더하는 표가 아니라, 사용할 수 없는 후보를 제외하고 선호도가 같은 후보를 순서대로 줄이는 과정으로 읽습니다.
-
수신 경로에 로컬 정책을 적용합니다
Adj-RIBs-In의 각 경로에 import 정책을 적용해 부적격 여부와 선호도를 계산합니다. 외부에서 학습한 경로를 iBGP로 다시 광고할 때는 계산한 선호도를 LOCAL_PREF로 전달합니다.
-
경로를 실제로 사용할 수 있는지 확인합니다
NEXT_HOP을 로컬 라우팅 테이블로 해석할 수 없는 경로를 제외하고, AS_PATH의 AS loop도 확인합니다.
-
최고 선호도를 고르고 동률을 해소합니다
가장 높은 선호도의 후보가 여러 개면 기본 명세는 AS_PATH 길이, ORIGIN, 비교 가능한 MED, eBGP 여부, NEXT_HOP까지의 IGP cost 같은 기준으로 후보를 줄입니다.
-
선택 결과를 반영하고 광고합니다
선택한 경로를 Loc-RIB에 반영하고, peer별 export 정책을 적용해 광고할 경로를 Adj-RIBs-Out에 구성합니다.
장비에서 확인할 때
이 순서는 표준의 공통 개념 경계입니다. 구현별 추가 기준과 정확한 명령 순서는 해당 장비의 공식 문서와 현재 정책 설정을 함께 확인합니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 정책 평가부터 반영과 광고까지 진행합니다.
관계도의 보충 설명
| 구분 | 전체 도표의 내용 |
|---|---|
| 제목 | BGP 경로 후보를 단계적으로 좁히는 관점 |
| 관계 설명 | 후보 경로 집합에 정책을 적용하고 사용 불가 후보를 제외합니다. 남은 후보에서 높은 선호도와 동률 해소로 경로를 선택하여 반영하고 peer별 정책으로 광고합니다. 화살표는 후보 판단 단계이며 사용자의 데이터 패킷이 BGP 세션을 지나는 경로가 아닙니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 정책 평가 두 후보에 수신 정책을 적용합니다. |
|
|
| 사용 가능성 NEXT_HOP과 AS 루프 조건을 확인합니다. |
|
|
| 선호도 선택 더 높은 LOCAL_PREF를 가진 A를 선택합니다. |
|
|
| 반영과 광고 로컬 선택과 peer별 광고 정책을 적용합니다. |
|
|
경로를 고를 때 가장 먼저 비교하는 것은 대개 이 AS가 정책으로 매긴 선호도 LOCAL_PREF이고, 그것이 같을 때 AS_PATH가 짧은 쪽을 고르며, 그 뒤로도 ORIGIN, MED, 다음 홉까지의 IGP 비용 같은 기준이 이어집니다. 그 전에 다음 홉에 닿을 수 없는 경로는 아예 후보에서 빠집니다. 다음 코드는 이 가운데 앞의 두 기준만 흉내 냅니다.
candidates = [
{"name": "A", "local_pref": 200, "as_path": [64501, 64502, 64503], "next_hop_ok": True},
{"name": "B", "local_pref": 100, "as_path": [64510], "next_hop_ok": True},
]
def best_path(routes):
usable = [r for r in routes if r["next_hop_ok"]] # 다음 홉에 닿을 수 없는 경로는 뺀다
return max(usable, key=lambda r: (r["local_pref"], -len(r["as_path"])))["name"] # 선호도, 그다음 짧은 AS 경로
print("처음:", best_path(candidates))
candidates[0]["next_hop_ok"] = False
print("A의 다음 홉에 닿을 수 없게 되면:", best_path(candidates))
candidates[0].update(next_hop_ok=True, local_pref=100)
print("선호도가 같아지면:", best_path(candidates))처음: A
A의 다음 홉에 닿을 수 없게 되면: B
선호도가 같아지면: B처음에는 A가 AS를 셋이나 거치는데도 선호도가 200으로 높아 이깁니다. "AS를 적게 거치는 경로가 언제나 이긴다"는 설명은 정책을 빠뜨린 것입니다. A의 다음 홉에 닿을 수 없게 되면 선호도가 아무리 높아도 후보에서 빠지고, 선호도가 같아지면 그제야 AS_PATH가 짧은 B가 이깁니다. 실제 장비는 여기에 여러 기준을 더하고 제조사마다 고유한 기준도 있으므로, 정확한 순서는 장비의 문서로 확인해야 합니다. 이것은 같은 프리픽스의 BGP 후보끼리 비교하는 일로, 길이가 다른 프리픽스를 고르는 최장 접두어 일치와는 다른 단계라는 점도 구별해야 합니다.
BGP를 믿을 수 있을까
BGP는 이웃이 알려 주는 경로를 기본적으로 믿습니다. 그래서 어느 AS가 실수로든 고의로든 남의 프리픽스를 자기 것이라고 알리면, 그 경로를 믿은 AS들의 트래픽이 엉뚱한 곳으로 갑니다. 2008년 파키스탄의 통신사가 유튜브를 국내에서 막으려고 유튜브의 주소 블록보다 더 구체적인 /24를 알렸는데, 이 경로가 이웃 통신사를 거쳐 인터넷으로 퍼지면서 최장 접두어 일치에 따라 세계 곳곳의 유튜브 트래픽이 약 두 시간 동안 파키스탄으로 몰렸습니다.
이런 경로 하이재킹(route hijacking)을 막으려고 지금은 RPKI(resource public key infrastructure)를 씁니다. 주소 블록의 주인이 "이 프리픽스는 이 AS 번호만 알릴 수 있다"는 서명된 기록(ROA)을 남겨 두면, 라우터는 받은 경로의 출발 AS가 그 기록과 맞지 않을 때 경로를 버립니다. 이를 경로 출처 검증(route origin validation)이라고 하며, 많은 대형 통신사와 클라우드 사업자가 적용하고 있습니다.
더 깊이: 경로 출처 검증이 막지 못하는 것
경로 출처 검증은 받은 경로를 세 가지로 나눕니다. RFC 6811에 따르면 그 프리픽스를 덮는 ROA가 하나도 없으면 NotFound, 덮는 ROA 가운데 프리픽스 길이와 출발 AS까지 맞는 것이 있으면 Valid, 덮는 ROA는 있지만 맞는 것이 없으면 Invalid입니다. ROA를 아직 등록하지 않은 주소도 많으므로, NotFound는 경로에 문제가 있다는 뜻이 아닙니다.
더 큰 한계는 이름 그대로 출발 AS만 확인한다는 점입니다. RFC 6811은 공격자가 위조한 경로의 끝에 정당한 출발 AS 번호를 붙이기만 하면 이 검사를 지나칠 수 있고, 경로 중간의 AS는 검증하지 않는다고 스스로 적어 둡니다. AS_PATH 전체를 지키려고 경로를 넘기는 AS마다 서명을 붙이는 BGPsec(RFC 8205)이 표준으로 나왔지만, 경로 위에 BGPsec을 지원하지 않는 AS가 하나라도 있으면 그 뒤로는 서명 없는 보통의 BGP로 돌아갑니다.
그래서 IETF는 더 가벼운 방법으로 ASPA(autonomous system provider authorization)를 다듬고 있습니다. 각 AS가 자기의 상위 사업자 AS 목록을 RPKI에 등록해 두면, 라우터는 받은 AS_PATH가 이 관계에 맞는지 확인해 경로 누출(route leak)과 일부 경로 조작을 찾아냅니다. 2026년 10월 기준으로 이 방식은 아직 RFC가 되지 않은 초안입니다.
정리
- 동적 라우팅 프로토콜은 라우터들이 경로를 주고받아 네트워크의 변화에 스스로 맞추게 하며, AS 안의 IGP와 AS 사이의 BGP로 나뉩니다.
- RIP는 홉 수로 경로를 고르는 거리 벡터 방식으로, 단순하지만 링크의 속도를 보지 않고 수렴이 느립니다.
- OSPF는 링크 상태를 모든 라우터에 퍼뜨려 같은 지도를 만들고, 다익스트라 알고리즘으로 비용이 가장 작은 경로를 계산합니다.
- BGP는 TCP 179번 포트로 프리픽스와 경로 속성을 주고받으며, 최단 경로가 아니라 LOCAL_PREF 같은 정책과 AS_PATH 같은 속성으로 경로를 고릅니다.
- BGP는 이웃의 경로를 믿기 때문에 하이재킹에 약하며, RPKI의 경로 출처 검증으로 이를 막습니다.
연습 문제
1. 비용이 바뀌거나 링크가 끊기면
본문의 OSPF 예에서 B–C의 비용만 9로 바뀌었다면, A는 C로 가는 패킷을 누구에게 넘기고 비용은 얼마인가요? 이번에는 비용은 처음과 같고 B–C 링크가 끊겼다면 어떻게 되나요?
해설 보기
비용이 9로 바뀌면 B를 거치는 길은 2 + 9 = 11, 바로 가는 길은 8이므로 A는 C에게 바로 넘기고 비용은 8입니다. B–C 링크가 끊기면 B를 거쳐 C로 가는 길이 사라지므로 역시 바로 가는 길, 비용 8이 남습니다. 다만 링크가 끊긴 것을 알아채고 LSA가 퍼지고 다시 계산하기까지 시간이 걸리므로, 그동안에는 B로 보낸 패킷이 사라질 수 있습니다. 수렴이 빠르다는 것은 이 시간이 짧다는 뜻이지 없다는 뜻이 아닙니다.
2. 선호도와 다음 홉
본문의 BGP 예에서, 두 후보가 모두 쓸 수 있고 LOCAL_PREF도 둘 다 200으로 같으며 나머지 조건도 같다면 어느 쪽을 고르나요? 그 상태에서 B의 다음 홉에 닿을 수 없게 되면 어떻게 되나요?
해설 보기
선호도가 같으므로 다음 기준인 AS_PATH의 길이를 비교해, AS를 하나만 거치는 B를 고릅니다. 그 상태에서 B의 다음 홉에 닿을 수 없게 되면 B는 후보에서 빠지고 A만 남으므로, AS_PATH가 더 길어도 A를 씁니다. 다음 홉에 닿을 수 있는지는 선호도를 비교하기 전에 따지는 조건이어서, 아무리 좋은 경로라도 그곳으로 패킷을 보낼 수 없다면 쓸 수 없습니다.
3. 더 구체적인 경로의 위험
어떤 기업이 203.0.112.0/22를 알리고 있는데, 다른 AS가 실수로 203.0.113.0/24를 자기 것이라고 알렸습니다. 인터넷의 라우터들이 두 경로를 모두 받았다면, 203.0.113.10으로 가는 트래픽은 어디로 가나요? RPKI로 이를 어떻게 막을 수 있나요?
해설 보기
203.0.113.10은 /22와 /24 모두에 속하므로, 두 경로를 다 받은 라우터는 최장 접두어 일치에 따라 더 구체적인 /24를 따릅니다. 그래서 그 주소로 가는 트래픽은 잘못 알린 AS로 가게 되고, BGP의 경로 선택에서 LOCAL_PREF나 AS_PATH를 아무리 따져도 프리픽스의 길이가 다르면 소용이 없습니다. 기업이 자기 블록에 대해 "최대 /22까지, 우리 AS 번호만 알릴 수 있다"는 ROA를 등록해 두면, 경로 출처 검증을 하는 라우터는 다른 AS가 알린 /24를 무효로 보고 버립니다. 다만 검증을 하지 않는 라우터는 여전히 그 경로를 믿을 수 있으므로, 더 많은 AS가 검증을 적용할수록 효과가 커집니다.
다음 글 라우팅 실습과 진단에서는 traceroute와 mtr로 실제 경로를 따라가 보고, 비대칭 경로처럼 진단을 어렵게 하는 상황을 살펴봅니다.