1. 개요
BGP(Border Gateway Protocol)는 AS(독립된 망) 끼리 “이 대역은 나를 거쳐 갈 수 있다” 를 알려 주는 라우팅 프로토콜이다. 통신사·클라우드·큰 서비스의 라우터가 이웃 라우터에게 자기 대역을 광고하고, 받은 광고를 다시 다른 이웃에게 전하면서 인터넷 전체의 경로 표가 채워진다.
BGP 는 경로 표를 미리 채워 두는 대화일 뿐, 사용자 패킷 안에 들어 있지 않다. 패킷은 채워진 표만 보고 지나간다.
2. AS
BGP 가 이야기하는 단위는 라우터가 아니라 AS 다. AS 는 한 회사가 하나의 정책으로 운영하는 망, 쉽게 말해 “인터넷 위의 회사 하나” 다. KT 는 AS4766, 구글은 AS15169 이고, 집은 AS 가 아니라 통신사 AS 의 일부다.
3. 전송 방식
BGP 는 TCP 위에서 돈다. 이웃 라우터의 TCP 179 번 포트로 연결을 맺고, 그 연결 안에서 BGP 메시지를 주고받는다. 웹 브라우저가 서버의 443 번에 TCP 로 붙는 것과 같은 구조다.
TCP 를 쓰기 때문에 BGP 자체에는 재전송이나 순서 맞추기가 없다. 메시지가 사라지거나 뒤섞이는 문제는 TCP 가 처리하고, BGP 는 “어느 대역이 어디로 가는지” 만 이야기한다.
3.1. 메시지 순서
BGP 는 일방적으로 던지고 끝나는 방식도, 메시지마다 답장을 받는 방식도 아니다. 연결과 인사는 서로 주고받고, 경로(UPDATE)는 보내기만 한다.
- 연결 — TCP 3-way handshake. 양쪽 다 연결을 걸 수 있고, 동시에 걸면 라우터 ID 가 큰 쪽의 연결만 남긴다
- 인사 — 양쪽이 OPEN 을 하나씩 보낸다. AS 번호가 설정과 다르면 받아들이지 않는다
- 수락 — 상대의 OPEN 이 괜찮으면 KEEPALIVE 로 답한다. 이때부터 세션이 성립한다
- 경로 — UPDATE 는 BGP 답장이 없다. 도착은 TCP ACK 이 보장하고, 받은 경로를 쓸지 말지는 받는 쪽이 조용히 정한다
- 생존 — 할 말이 없어도 KEEPALIVE 를 주기적으로 보낸다(Hold Time 의 1/3, 보통 30초)
- 오류 — 형식이 틀리거나 Hold Time 이 지나면 NOTIFICATION 을 보내고 연결을 끊는다
4. UPDATE 메시지
경로를 실어 나르는 메시지는 UPDATE 다. UPDATE 한 통은 “이 대역들은 이제 못 간다” 와 “이 설명서대로 이 대역들은 간다” 두 부분으로 이뤄진다.
경로 속성 중 AS_PATH 와 NEXT_HOP 은 다른 AS 로 넘길 때마다 바뀐다. 광고를 받은 AS 는 자기 AS 번호를 AS_PATH 맨 앞에 붙이고, NEXT_HOP 을 자기 경계 라우터 주소로 바꿔 다음 이웃에게 전한다. 그래서 AS_PATH 는 광고가 지나온 AS 의 목록이 되고, NEXT_HOP 은 언제나 “바로 옆 이웃의 어느 라우터로 보내면 되는지” 를 가리킨다.
광고와 철회는 같은 UPDATE 메시지에서 채우는 칸만 다르다.
5. 경로 선택
같은 대역에 대한 광고가 여러 이웃에게서 오면 하나를 골라 경로 표에 적는다.
AS_PATH 가 짧다고 꼭 빠른 길은 아니다. AS 하나가 대륙을 가로지를 수도 있다. 그래서 실무에서는 정책(LOCAL_PREF)으로 비용이 싼 이웃을 먼저 고르게 하고, AS_PATH 길이는 그다음 기준으로 쓴다.
6. 이웃 관계
BGP 는 자동으로 이웃을 찾지 않는다. 운영자가 상대 라우터의 IP 와 AS 번호를 직접 설정하면, 둘이 TCP 179 번으로 연결을 맺고 대화를 시작한다. 이 연결을 BGP 세션이라고 부른다.
회사 사이의 이웃 관계는 돈이 오가는 방식에 따라 둘로 나뉜다.
IX(Internet Exchange)는 여러 회사가 라우터를 한 건물에 모아 두고 케이블로 서로 잇는 곳이다. 이웃이 “이어져 있다” 는 건 실제로 라우터 포트끼리 광케이블이 꽂혀 있다는 뜻이다.
7. 경로 표와의 관계
BGP 가 하는 일은 결국 라우팅 테이블 채우기다. 이웃들에게 받은 광고 중 대역마다 하나를 골라 라우터의 경로 표에 한 줄씩 넣고, 광고가 바뀌면 그 줄을 고친다. 패킷이 오면 라우터는 그 표에서 목적지와 가장 길게 맞는 줄(Subnet 의 접두 길이 기준)을 찾아 보낸다. 그 순간 BGP 는 아무것도 하지 않는다.
표에는 주소 하나하나가 아니라 대역이 들어간다. 그래서 IPv4 주소 43억 개가 약 100만 줄로 접힌다.
100만 줄 전체를 가진 라우터는 소수다. 대부분의 기기는 “모르면 위로” 라는 기본 경로 한 줄로 지낸다. 노트북과 공유기는 이 한 줄을 DHCP 로 받고, 전체 지도는 바깥으로 가는 길이 여럿이라 골라야 하는 경계 라우터만 BGP 로 채운다. DHCP 와 BGP 는 같은 표를 채우는 서로 다른 도구인 셈이다.
100만 줄이어도 한 줄이 수십 바이트라 전체는 수십 MB 수준이다. 대형 라우터는 이 표를 TCAM 같은 전용 칩에 올려 패킷마다 나노초 단위로 찾는다. 다만 칩 크기에는 한계가 있다. 2014년 8월 12일 표가 51만 2천 줄을 넘자, 칩 용량이 딱 그만큼이던 오래된 라우터들이 새 줄을 넣지 못해 곳곳에서 장애가 났다(“512k day”). 표는 지금도 해마다 커지고 있다.
8. 잘못된 광고
BGP 는 기본적으로 이웃의 광고를 믿는다. 그래서 광고가 틀리면 인터넷 전체가 그 틀린 길을 따른다.
이를 막으려고 RPKI 가 쓰인다. 대역의 주인이 “이 대역은 이 AS 만 광고할 수 있다” 는 서명을 등록해 두면, 라우터가 서명과 맞지 않는 광고를 버린다.
9. 쿠버네티스의 BGP
Calico 는 기본적으로 BGP 로 노드 사이를 잇는다. 각 노드가 하나의 BGP 화자처럼 행동하며 자기 Pod 대역을 광고하고, 랙 스위치나 다른 노드가 이를 받아 경로 표에 적는다. 패킷을 감쌀 필요가 없어 VXLAN 보다 단순하지만, 망 장비가 BGP 를 받아 줘야 한다.
MetalLB 의 BGP 모드도 같은 원리다. type: LoadBalancer 서비스의 외부 IP 를 노드가 라우터에게 광고해, 바깥 패킷이 그 노드로 들어오게 한다.
10. 확인 명령
노트북은 BGP 를 쓰지 않지만, 공개된 BGP 정보는 조회할 수 있다.
whois -h whois.cymru.com " -v 142.250.1.1" # 이 IP 를 광고하는 AS 와 대역
# AS | IP | BGP Prefix | CC | Registry | Allocated | AS Name
# 15169 | 142.250.1.1 | 142.250.1.0/24 | US | arin | 2012-05-24 | GOOGLE - Google LLC, US
whois -h whois.cymru.com " -v AS4766" # AS 번호의 주인
traceroute -a 142.250.1.1 # macOS: 각 홉의 AS 번호도 함께 표시
# BGP 를 쓰는 라우터·노드에서 실제 메시지 보기
tcpdump -i eth0 -n -v tcp port 179 # OPEN, KEEPALIVE, UPDATE 가 BGP 로 해석되어 보인다
# Calico 를 쓰는 클러스터에서
calicoctl node status # 노드의 BGP 이웃과 세션 상태 (Established)
ip route | grep bird # BGP 로 받은 다른 노드의 Pod 대역 (proto bird)
웹에서는 bgp.tools 나 bgp.he.net 에서 AS 번호나 IP 로 광고 현황을 볼 수 있다.
11. 관련 문서
- AS — BGP 로 이야기하는 주체. 인터넷 위의 회사 하나
- Subnet — BGP 가 광고하는 단위. 가장 길게 맞는 줄이 이긴다
- DHCP — 집이 BGP 대신 기본 경로 한 줄을 받는 방법
- VXLAN — 노드 사이를 감싸서 잇는 방법. BGP 는 감싸지 않고 알린다
- CNI — Calico 같은 구현체가 BGP 를 쓴다
- Network & K8s.01-2 Across the Network — 통신사 라우터의 경로 표가 채워지는 과정
12. 출처
BGP-4 는 RFC 4271 이 정의한다. 하는 일과 TCP 179 번이 여기 있다.
“The primary function of a BGP speaking system is to exchange network reachability information with other BGP systems.”
“BGP uses TCP [RFC793] as its transport protocol. … BGP listens on TCP port 179.”
처음에 전부, 그 뒤로는 바뀐 것만 보낸다는 것(3.1)도 같은 절에 있다.
“Incremental updates are sent as the routing tables change. BGP does not require a periodic refresh of the routing table.”