사전 BGP
프로토콜

BGP

gabury1고친 사람 github-actions[bot]

BGP 는 인터넷을 이루는 수많은 네트워크가 서로에게 경로를 알려 주게 합니다. 통신사와 클라우드 회사는 저마다 자기 네트워크로 들어오는 경로를 이웃에게 알립니다. 이웃은 그 소식을 다시 옆으로 전합니다. 그렇게 퍼진 경로 덕분에 서울의 서버가 보낸 패킷이 지구 반대편 네트워크까지 찾아갑니다.

쉽고 빠른 이해

BGP 는 네트워크와 네트워크 사이에서 경로를 주고받게 합니다. 경로는 "이 주소로 오려면 우리를 거쳐 오라"는 소식입니다. 어떤 통신사가 고객의 주소 묶음을 이웃 통신사에 알리면, 그 소식이 옆으로 퍼져 세계 어디서든 그 주소로 가는 경로가 생깁니다.

한 회사 네트워크 안쪽의 경로는 다른 프로토콜이 맡습니다. BGP 는 회사와 회사 사이만 맡습니다.

인터넷에는 전체 지도를 쥔 중앙 관리자가 없습니다. 회사마다 자기 네트워크만 알기 때문에, 이웃끼리 아는 경로를 전해 주지 않으면 남의 네트워크로 가는 경로를 알 수 없습니다.

어떻게 도나:

  1. 이웃한 두 라우터가 연결을 맺고 서로 인사를 나눕니다
  2. 각자 아는 주소 묶음과, 거기까지 거쳐 가는 네트워크 번호 목록을 보냅니다
  3. 받은 쪽은 목록 앞에 자기 번호를 붙여 다른 이웃에게 전합니다. 목록에 자기 번호가 이미 있으면 버립니다
  4. 같은 곳으로 가는 경로가 여럿이면 회사의 방침을 먼저 봅니다. 그다음 거쳐 가는 네트워크 수를 봅니다

대가도 있습니다. 받은 소식이 참인지 따지지 않고 믿기 때문에, 누가 남의 주소를 자기 것이라고 알리면 트래픽이 엉뚱한 곳으로 빨려 갑니다. 경로가 바뀐 뒤 모두가 새 경로에 합의하기까지 시간도 걸립니다.

상세

BGP(Border Gateway Protocol, 경계 게이트웨이 프로토콜)는 인터넷을 이루는 네트워크끼리 경로를 주고받는 규칙입니다. 경로는 어느 주소로 가는 패킷을 어느 쪽으로 넘겨야 하는지 알려 주는 정보입니다.

패킷을 받아 경로가 가리키는 쪽으로 넘겨주는 장비가 라우터입니다. 라우터끼리 경로를 주고받는 규칙이 라우팅 프로토콜입니다. BGP 도 라우팅 프로토콜 가운데 하나입니다.

이 절은 BGP 가 이어 주는 네트워크 단위가 무엇인지에서 출발합니다. 이어서 경로 알림이 어떤 모양으로 퍼지는지, 두 라우터가 대화를 어떻게 여는지, 여러 경로 가운데 하나를 어떻게 고르는지를 차례로 봅니다. 끝에서는 이 설계가 치르는 대가와, 백엔드 개발자가 BGP 를 만나는 곳을 짚습니다.

자율 시스템과 AS 번호

인터넷은 네트워크 하나가 아닙니다. 통신사, 클라우드 회사, 대학, 큰 기업이 저마다 자기 라우터와 회선을 갖고 자기 방침대로 운영하는 네트워크를 이어 붙인 것입니다.

한 조직이 하나의 방침으로 운영하는 네트워크 묶음이 자율 시스템입니다. 줄여서 AS(Autonomous System)라고 씁니다. 한 통신사의 전국 망이 AS 하나가 되는 식입니다. AS 마다 겹치지 않는 번호가 붙습니다. 이 번호가 AS 번호입니다. BGP 메시지 안에서 네트워크를 가리키는 이름이 이 번호입니다.

AS 안쪽에서는 OSPF(Open Shortest Path First, 최단 경로 우선) 같은 프로토콜이 라우터끼리 경로를 맞춥니다. 한 AS 안에서 쓰는 이런 프로토콜을 묶어 IGP(Interior Gateway Protocol, 내부 게이트웨이 프로토콜)라고 합니다.

AS 와 AS 사이는 사정이 다릅니다. 서로 다른 회사라 내부 사정을 다 보여 줄 수 없습니다. 어느 회선으로 트래픽을 받을지도 계약에 따라 정해야 합니다. 그 사이를 맡는 프로토콜이 BGP 입니다.

AS 가장자리에서 이웃 AS 와 맞닿은 라우터를 경계 라우터라고 부릅니다. BGP 이름에 든 「경계 게이트웨이」가 이 라우터를 가리킵니다. 게이트웨이는 초기 인터넷에서 라우터를 부르던 말입니다.

flowchart TD
    subgraph A["AS 64501 · 통신사"]
        A1["라우터"] ---|IGP| A2["경계 라우터"]
    end
    subgraph B["AS 64502 · 클라우드 회사"]
        B1["경계 라우터"] ---|IGP| B2["라우터"]
    end
    A2 ---|BGP| B1

그림의 AS 번호는 예로 든 값입니다. 각 AS 안에서는 IGP 가 돕니다. 이웃 AS 와는 두 AS 가 맞닿은 경계 라우터 사이에서 BGP 가 돕니다. 같은 AS 안에서 도는 BGP 는 뒤에서 봅니다.

경로를 알리는 단위, 프리픽스

BGP 가 주고받는 경로 한 건은 "이 주소 묶음으로 가려면 나를 거쳐 오라"는 알림입니다. IP 주소(Internet Protocol address, 인터넷 프로토콜 주소) 묶음은 203.0.113.0/24 처럼 적습니다. 이렇게 적은 묶음이 프리픽스입니다.

/24 는 앞의 24비트가 같은 주소를 전부 한 묶음으로 친다는 뜻입니다. 이 예에서는 203.0.113.0 부터 203.0.113.255 까지 주소 256개가 한 프리픽스에 들어갑니다. 이렇게 슬래시 뒤 숫자로 묶음 크기를 적는 방식을 CIDR(Classless Inter-Domain Routing, 클래스 없는 도메인 간 라우팅)라고 합니다.

주소를 하나씩 알리지 않고 묶음으로 알리는 데는 까닭이 있습니다. 인터넷의 주소는 수십억 개라서, 하나하나 경로를 알리면 어느 라우터도 그 목록을 담지 못합니다.

AS_PATH 로 고리를 막는 방식

경로 알림에는 프리픽스만 실리지 않습니다. 그 알림이 지금까지 거쳐 온 AS 번호의 목록도 함께 실립니다. 이 목록을 AS_PATH 라고 부릅니다.

AS 는 이웃에게서 받은 경로를 다른 이웃에게 넘길 때 목록 맨 앞에 자기 번호를 붙입니다. 그래서 목록을 읽으면 그 프리픽스까지 어느 AS 들을 차례로 거쳐 가는지가 보입니다. 경로를 거리 숫자 하나가 아니라 거쳐 가는 목록으로 들고 다니는 이 방식을 경로 벡터 라우팅이라고 합니다.

flowchart TD
    A["AS 64501 · 203.0.113.0/24 를 알린다<br/>AS_PATH: 64501"]
    B["AS 64502 · 앞에 자기 번호를 붙여 넘긴다<br/>AS_PATH: 64502 64501"]
    C["AS 64503 · 또 붙여 넘긴다<br/>AS_PATH: 64503 64502 64501"]
    D["AS 64501 · 목록에 자기 번호가 있다<br/>받지 않고 버린다"]
    A --> B --> C --> D

목록이 있으면 라우팅 루프를 쉽게 막습니다. 라우팅 루프는 패킷이 몇몇 라우터 사이를 빙빙 돌며 목적지에 닿지 못하는 상태입니다. 받은 경로의 목록에 자기 번호가 이미 있으면, 그 경로는 자기를 한 번 지나 돌아온 것입니다. 그래서 버리면 됩니다.

이웃과 세션을 맺는 순서

BGP 로 대화하는 두 라우터를 서로의 피어라고 부릅니다. 피어는 저절로 찾아지지 않습니다. 운영자가 양쪽 라우터에 상대의 주소와 AS 번호를 적어 두어야 대화가 시작됩니다.

대화는 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 연결 위에서 오갑니다. BGP 는 179번 포트로 연결을 받습니다. 메시지가 빠지거나 순서가 뒤집히는 일은 TCP 가 막아 주므로, BGP 는 재전송 장치를 따로 두지 않습니다.

연결이 열리면 두 라우터는 아래 그림의 순서로 세션을 엽니다. OPEN 에는 자기 AS 번호와, 상대를 몇 초까지 기다릴지 같은 설정값이 실립니다.

sequenceDiagram
    participant A as 라우터 A
    participant B as 라우터 B
    Note over A,B: TCP 연결을 먼저 맺는다 · 179번 포트
    A->>B: OPEN · AS 번호 · 설정값
    B->>A: OPEN · AS 번호 · 설정값
    A->>B: KEEPALIVE
    B->>A: KEEPALIVE
    Note over A,B: 세션이 열렸다
    A->>B: UPDATE · 아는 경로를 보낸다
    B->>A: UPDATE · 아는 경로를 보낸다

BGP 의 기본 메시지는 그림에 나온 셋에 하나를 더한 넷입니다. 각 메시지가 맡는 일은 아래와 같습니다.

메시지 하는 일
OPEN 세션을 열며 자기 AS 번호와 설정값을 알린다
UPDATE 새 경로를 알리거나, 쓸 수 없게 된 경로를 거둬들인다
KEEPALIVE 보낼 경로가 없어도 살아 있다고 알린다
NOTIFICATION 오류를 알리고 세션을 닫는다

상대가 살아 있는지 확인하는 홀드 타임

세션이 열린 뒤 경로가 바뀌지 않으면 한동안 보낼 UPDATE 가 없습니다. 그 사이 상대가 죽었는지 알려고 KEEPALIVE 를 주기적으로 보냅니다.

정해 둔 시간 안에 아무 메시지도 오지 않으면 상대가 죽었다고 보고 세션을 닫습니다. 이 시간을 홀드 타임(hold time)이라고 부릅니다. 세션을 열 때 OPEN 에 실어 알리던 설정값 가운데 하나가 이것입니다. 홀드 타임은 90초를 기본값으로 권합니다. KEEPALIVE 는 그 3분의 1 간격으로 보내기를 권합니다.

세션이 닫히면 그 피어에게서 받은 경로를 모두 지웁니다. 그 경로로 가던 트래픽은 다른 피어가 알려 준 경로로 옮겨 갑니다.

UPDATE 에 실리는 것

UPDATE 한 통에는 세 가지가 실립니다. 새로 알리는 프리픽스, 더는 갈 수 없어 거둬들이는 프리픽스, 그리고 새 경로에 붙는 설명입니다. 이 설명을 경로 속성이라고 부릅니다.

UPDATE
  거둬들임  198.51.100.0/24   // 이제 못 감
  새 경로   203.0.113.0/24    // 새로 알림
  AS_PATH   64502 64501       // 거쳐 온 AS
  NEXT_HOP  192.0.2.1         // 넘길 곳

위는 UPDATE 한 통에 담긴 내용을 줄마다 풀어 적은 것입니다. 거둬들이는 프리픽스는 받은 쪽이 받아 둔 경로 가운데서 지웁니다. 새 경로에는 경로 속성 둘이 붙어 있습니다.

AS_PATH 는 앞 절에서 본 거쳐 온 AS 목록입니다. NEXT_HOP 은 이 프리픽스로 가는 패킷을 다음에 넘겨줄 라우터의 주소입니다. 받은 라우터는 이 주소를 다음 홉으로 삼아 패킷을 보냅니다.

BGP 는 세션이 처음 열렸을 때 아는 경로를 한 번 다 보냅니다. 그 뒤로는 바뀐 것만 보냅니다. 인터넷 전체의 경로는 많아서, 전부를 주기적으로 다시 보내면 회선과 라우터가 그 일만 하다 끝납니다.

같은 AS 안에서 도는 iBGP

BGP 세션은 AS 와 AS 사이에만 열리지 않습니다. 서로 다른 AS 의 라우터끼리 여는 세션을 eBGP(external BGP, 외부 BGP)라고 합니다. 같은 AS 안의 라우터끼리 여는 세션은 iBGP(internal BGP, 내부 BGP)라고 합니다.

iBGP 가 필요한 까닭은 큰 AS 에 경계 라우터가 여럿이기 때문입니다. 서울 경계 라우터가 이웃 AS 에게서 받은 경로를 부산 경계 라우터도 알아야 합니다. IGP 는 AS 안쪽 경로만 다루므로 이 바깥 경로를 나르지 못합니다. 그래서 같은 AS 의 경계 라우터끼리도 BGP 세션을 맺습니다.

flowchart TD
    X["AS 64501 · 경계 라우터"]
    subgraph B["AS 64502"]
        B1["서울 경계 라우터"] ---|iBGP| B2["부산 경계 라우터"]
    end
    Y["AS 64503 · 경계 라우터"]
    X ---|eBGP| B1
    B2 ---|eBGP| Y

iBGP 로 받은 경로는 다른 iBGP 피어에게 다시 넘기지 않습니다. AS_PATH 는 AS 를 넘어갈 때만 길어지므로, AS 안에서 경로가 돌면 목록으로는 알아챌 수 없기 때문입니다.

다시 넘기지 않으니, 서울 경계 라우터가 받은 경로는 서울이 직접 AS 안의 나머지 BGP 라우터 모두에게 알려야 합니다. 그래서 AS 안의 BGP 라우터는 서로 빠짐없이 세션을 맺어야 합니다. 라우터가 많아지면 세션 수가 감당하기 어려워집니다.

이 부담을 덜려고 경로 반사기를 둡니다. 경로 반사기는 받은 경로를 나머지 iBGP 피어에게 대신 전해 주는 라우터입니다.

여러 경로 가운데 하나를 고르는 기준

같은 프리픽스로 가는 경로를 여러 피어에게서 받는 일이 흔합니다. 라우터는 그중 하나만 골라 라우팅 테이블에 넣습니다. 다른 피어에게도 고른 것만 전합니다. 라우팅 테이블은 목적지마다 패킷을 어디로 넘길지 적어 둔 표입니다.

고를 때는 가까움보다 방침을 먼저 봅니다. AS 는 돈을 받고 트래픽을 실어 주는 고객 쪽 경로를, 자기가 돈을 내는 상위 통신사 쪽 경로보다 먼저 쓰려 합니다. 운영자는 이 방침을 경로마다 LOCAL_PREF 라는 점수로 매겨 둡니다. 점수가 큰 경로가 이깁니다.

점수가 같으면 AS_PATH 목록이 짧은 경로를 고릅니다. 그래도 같으면 몇 가지 동점 규칙을 차례로 거쳐 끝내 하나만 남깁니다.

AS_PATH 가 짧다고 지연이 적은 경로는 아닙니다. AS 하나가 대륙을 가로지르는 망일 수도 있습니다. 목록에는 AS 안에서 거치는 라우터 수도 드러나지 않습니다. BGP 는 속도를 재지 않고 방침과 거치는 AS 수로 고릅니다.

받은 경로를 믿는 설계와 그 대가

BGP 는 피어가 보낸 경로가 참인지 따지지 않습니다. 어떤 AS 가 남의 프리픽스를 자기 것이라고 알려도, 이웃은 그 알림을 받아 옆으로 퍼뜨립니다.

그러면 그 프리픽스로 가던 트래픽 일부가 거짓 경로를 따라 엉뚱한 AS 로 빨려 갑니다. 이런 일이 BGP 하이재킹입니다. 설정 실수로 일어나기도 합니다. 남의 트래픽을 엿보거나 가로채는 중간자 공격에 쓰이기도 합니다.

더 좁은 프리픽스를 알리면 피해가 더 커집니다. 라우터는 목적지에 맞는 프리픽스가 여럿이면 가장 좁은 쪽을 따르기 때문입니다. 이 규칙이 최장 프리픽스 매치입니다.

/25 는 앞 25비트가 같은 주소, 곧 /24 의 절반인 128개 묶음입니다. 슬래시 뒤 숫자가 클수록 묶음이 좁습니다. 진짜 주인이 /24 를 알리는 동안 누가 /25 두 개를 알리면, 트래픽은 /25 쪽으로 갑니다.

막는 방법은 둘이 대표적입니다. 하나는 이웃이 알릴 수 있는 프리픽스 목록을 미리 받아 두고 그 밖의 알림을 걸러 내는 것입니다.

다른 하나는 RPKI(Resource Public Key Infrastructure, 자원 공개 키 기반 구조)입니다. 주소 주인이 "이 프리픽스는 이 AS 만 알릴 수 있다"는 서명된 기록을 올려 두면, 라우터가 받은 경로의 출발 AS 를 그 기록과 맞춰 봅니다. 출발 AS 는 그 프리픽스를 처음 알린 AS, 곧 AS_PATH 맨 끝 번호입니다.

또 하나의 대가는 합의에 걸리는 시간입니다. 경로가 바뀌면 그 소식이 AS 를 하나씩 건너 퍼지므로, 모든 AS 가 새 경로에 합의하기까지 시간이 걸립니다. 이렇게 새 경로에 합의해 가는 과정이 수렴입니다. 수렴하는 동안 일부 트래픽은 이미 사라진 경로로 가다 버려집니다.

백엔드 개발자가 BGP 를 만나는 곳

백엔드 개발자가 BGP 설정을 만질 일은 드뭅니다. 그래도 BGP 는 서비스가 인터넷에서 보이느냐를 쥐고 있어서, 몇몇 상황에서는 이름이 나옵니다.

첫째는 애니캐스트입니다. 여러 지역의 서버가 같은 프리픽스를 동시에 알리면, 사용자마다 BGP 가 고른 경로를 따라 서로 다른 지역의 서버에 닿습니다. 공개 DNS(Domain Name System, 도메인 이름 시스템) 서비스와 CDN(Content Delivery Network, 콘텐츠 전송 네트워크)이 이 방식으로 사용자를 가까운 거점에 붙입니다.

둘째는 장애입니다. 서버와 애플리케이션이 멀쩡해도, 자기 프리픽스의 경로를 실수로 거둬들이면 아무도 찾아오지 못합니다. 장애 보고서에 "BGP 경로가 빠졌다"는 문장이 나오면 이런 상황입니다.

셋째는 클라우드 연결입니다. 사내 데이터센터와 클라우드를 전용선이나 VPN(Virtual Private Network, 가상 사설망)으로 이으면, 양쪽 라우터가 BGP 로 서로의 내부 주소 묶음을 알립니다. 그래서 연결 설정 화면에 AS 번호를 적는 칸이 나옵니다.

관련 항목

BGP 경로에 붙는 경로 속성

AS_PATH · NEXT_HOP · LOCAL_PREF · MED · BGP 커뮤니티 · 경로 속성

BGP 세션을 이루는 구성 요소

BGP 피어 · 홀드 타임 · BGP 상태 기계 · eBGP · iBGP · 경로 반사기 · TCP · 포트

BGP 가 경로를 알리는 주소 단위

프리픽스 · CIDR · IP 주소 · IPv4 · IPv6 · 최장 프리픽스 매치 · 경로 집약 · 서브넷

BGP 로 경로를 주고받는 네트워크 조직

자율 시스템 · AS 번호 · ISP · 트랜짓 · 피어링 · 인터넷 교환 지점

BGP 와 역할을 나눠 쓰는 라우팅 프로토콜

OSPF · IS-IS · RIP · IGP · EGP

BGP 가 속하는 라우팅 방식의 분류

경로 벡터 라우팅 · 거리 벡터 라우팅 · 링크 상태 라우팅 · 동적 라우팅 · 정적 라우팅

BGP 에서 나는 장애와 공격

BGP 하이재킹 · 경로 누출 · 라우팅 루프 · 경로 플래핑 · 중간자 공격 · 수렴

BGP 경로를 지키는 보안 수단

RPKI · ROA · 경로 필터링 · BGPsec · IRR

BGP 경로에 기대는 서비스 구성

애니캐스트 · CDN · DNS · VPN · 전용선

BGP 가 고른 경로를 담는 라우터 안의 표

라우팅 테이블 · 다음 홉 · 포워딩 테이블 · RIB

BGP 를 구현하거나 내장한 소프트웨어

FRRouting · BIRD · GoBGP · Calico · MetalLB

BGP 를 규정하는 표준 문서

RFC 4271 · RFC 4456 · RFC 6793 · RFC 6811 · IETF

BGP 가 속하는 상위 분류

라우팅 프로토콜 · 라우팅 · 라우터 · 네트워크 · 프로토콜

다른 이름: Border Gateway Protocol · 경계 게이트웨이 프로토콜 · 경계 경로 프로토콜 · BGP-4