같은 라우터, 세 가지 다른 진실
물리 장비 하나, 여러 개의 라우팅 정체성, 그리고 노드-엣지 그래프가 그것을 담을 수 없는 이유
Michel Wijnberg
이 시리즈의 첫 네 편은 신뢰에 관한 것이었습니다. 네트워크를 정확히 모델링하고, 안전하게 관측하고, 포워딩을 정직하게 재현하고, 추측하기를 거부하는 것. 이번 글은 두 번째 묶음을 엽니다. 그 선을 지켜 내는 데 실제로 무엇이 필요한지에 관한 이야기입니다.
그리고 그 이야기는, 대부분의 토폴로지 도구가 흥미로운 질문 근처에 가 보기도 전에 무너지는 지점에서 시작합니다. 라우터는 하나의 사물이 아닙니다.
모든 것을 두 벌씩 가진 라우터
제 랩의 nrt1-cr1입니다.
오른쪽 위를 보십시오. 역할 배지가 하나가 아닙니다. 둘입니다.
OSPFv2 ABR·ASBR
OSPFv3 ABR·ASBR
그 아래 Protocols & Areas에는 이렇게 나옵니다.
| 프로토콜 인스턴스 | 영역 | 역할 |
|---|---|---|
| OSPFv2 · 프로세스 1 (ipv4) | 0.0.0.0, 14.18.20.0 | ABR · ASBR |
| OSPFv3 · 프로세스 1 (ipv6) | 0.0.0.0, 14.18.20.0 | ABR · ASBR |
중복처럼 보입니다. 아닙니다. 이것은 서로 독립적인 두 프로토콜 인스턴스이고, 서로 독립적인 두
개의 링크 상태 데이터베이스를 가집니다. nrt1-cr1은 그 인스턴스 안에서 둘 이상의 영역에
붙어 있음으로써 각각 따로 ABR이라는 칭호를 얻습니다. 영역 라벨이 같은 것은 누군가 같게
번호를 매겼기 때문이지, 같은 객체이기 때문이 아닙니다. 데이터베이스에서는 UUID가 다릅니다.
OSPFv2의 영역 14.18.20.0과 OSPFv3의 영역 14.18.20.0은 이름만 우연히 같은 서로 다른
영역이기 때문입니다.
이 구분은 둘이 어긋나기 전까지는 현학적으로 들립니다. 그런데 알고 보면 둘은 늘 어긋납니다.
선 하나, 코스트 둘, 100퍼센트의 경우에
라우터 두 대 사이의 물리 링크 하나입니다.
케이블 하나. Et0/3에서 Et0/3으로, 10G, 172.24.2.13/30 과
fddb:10:24:2::6/127을 함께 나릅니다. Osprey는 이것을 하나의 엣지로 그립니다. 물리적으로
하나의 엣지이기 때문입니다. 그리고 프로토콜마다 탭을 붙입니다.
이제 코스트를 보십시오.
OSPFv2 Area 12.1.24.0 cost 10
OSPFv3 Area 12.1.24.0 cost 1
같은 선. 같은 영역 번호. 다른 메트릭.
스크린샷을 위해 연출한 것이 아닙니다. 나중에 AS 200의 듀얼 스택 링크를 전부 확인해 봤는데, 결과는 이 하나의 예보다 더 흥미롭습니다.
| AS 200의 듀얼 스택 링크 | 124 |
|---|---|
| …그중 OSPFv2와 OSPFv3 코스트가 다른 것 | 124(100%) |
| (v2 = 10, v3 = 1)인 것 | 85 |
| (v2 = 10000, v3 = 10)인 것 | 39 |
하나도 빠짐없이 다릅니다. 그런데 두 그룹을 보십시오. 39개는 1000배 차이이고, 85개는 10배 차이입니다. 그 비대칭이 흥미로운 지점이고, 설명하려면 라우터에게 물어봐야 했습니다.
Routing Process "ospf 1" Reference bandwidth unit is 100000 mbps
Routing Process "ospfv3 1" Reference bandwidth unit is 100 mbps
설정은 하나이지 둘이 아닙니다. 코스트는 기준 대역폭을 인터페이스 대역폭으로 나눈 값이므로, 두 프로세스는 정확히 1000배 차이 나는 숫자로 같은 선들을 스케일링하고 있습니다. 10 Mbps 링크에서는 그 차이가 그대로 나타납니다. 10000 대 10입니다. 10 Gbps 링크에서는 OSPFv3가 100/10000 = 0.01을 계산하지만, 라우터가 광고할 수 있는 최소 코스트는 1입니다. 하한선이 나머지를 먹어 버립니다.
그러니까 이 왜곡은 균일하지 않습니다. 그리고 바로 그 점이 위험합니다. 균일한 스케일링이라면 무해합니다. 토폴로지의 모든 코스트에 같은 상수를 곱해도 최단 경로는 움직이지 않습니다. 여기서는 상수가 어떤 링크에서는 1000이고 다른 링크에서는 10입니다. 중간에 클램프가 끼어들었기 때문입니다. 따라서 두 프로토콜은 같은 링크들을 서로 다른 순서로 매기고, IPv4 트래픽과 IPv6 트래픽이 이 네트워크에서 서로 다른 경로를 탈 수 있습니다. 어느 것이 그런지는 눈으로 가늠할 수 없습니다. 둘 다 계산해야 합니다.
“링크 하나, 코스트 하나”를 그리는 도구는 그 두 숫자 중 하나를 골라야 합니다. 무엇을 고르든 절반은 틀리고, 지금 당신이 어느 쪽 절반에 있는지는 결코 알려 주지 않습니다.
계층이 하중을 받는 이유
이것이 Osprey의 데이터 모델이 Node, Edge, Protocol이 아닌 이유입니다.
Network → Autonomous System → Routing Domain → Protocol Instance → Area → Device
↳ Interface
각 레벨이 존재하는 이유는, 네트워크 안에 그 레벨을 가로질러 달라질 수 있는 무언가가 있기 때문입니다.
- Network: 테넌트 경계. 같은 물리 장비를 서로 다른 자격 증명과 서로 다른 뷰로 두 테넌트 아래에서 모니터링할 수 있습니다.
- Autonomous System: BGP상의 정체성이자, BMP 피드가 속하는 범위입니다.
- Routing Domain: 글로벌 테이블, VRF, 또는 L3VPN. 같은 라우터, 다른 라우팅 테이블, 진짜로 다른 도달성입니다.
- Protocol Instance: (라우팅 도메인, 프로토콜, 프로세스 ID, 주소 패밀리)에서 유일합니다.
nrt1-cr1을 라우터 두 대로 만드는 레벨이 바로 이것입니다. - Area: LSDB가 실제로 사는 곳이고, 따라서 SPF가 실제로 도는 곳입니다.
- Device: 멤버십 테이블을 통해 영역과 다대다입니다. 외래 키가 아닙니다. 외래 키였다면 “라우터는 한 영역에 산다”는 거짓말을 강요했을 것입니다.
그리고 인터페이스는 (device_id, if_index, area_id)로 스코프가 정해집니다. 같은 물리 포트가
여러 프로토콜 인스턴스에 동시에 참여하며, 각각에서 코스트도, 네이버 상태도, 주소 패밀리도 다르기
때문입니다.
파생 역할은 라벨로 저장되는 대신 그 구조에서 저절로 나옵니다.
- ABR = 한 인스턴스 안에서 둘 이상의 영역에 붙어 있음
- ASBR = 라우터 자신의 LSA에 E 비트가 설정된 것(RFC 2328 §A.4.2). 곧 외부 라우팅 정보를 생성한다고 라우터 스스로 밝히는 것입니다. 멤버십 개수가 아닙니다. 한 영역에만 살면서 ASBR일 수도 있고, 여러 인스턴스에 걸쳐 있으면서 ASBR이 아닐 수도 있습니다
- VRF-Lite = 둘 이상의 라우팅 도메인에 존재함
그래서 nrt1-cr1은 ABR이 두 번 될 수 있고, 배지도 두 번 그려집니다. 아무도 어디에도 “ABR”이라고
타이핑하지 않았습니다. 그것은 멤버십의 결과이고, LSDB로부터 다시 계산된 값입니다.
토폴로지는 모두 동시에 진짜입니다
이것을 생각하는 쓸모 있는 방식은, 그 토폴로지 같은 것은 없다는 것입니다. 토폴로지는 여럿이고, 모두 동시에 참이며, 서로 다른 질문에 답합니다.
| 토폴로지 | 무엇으로 만들어지는가 | 무엇에 답하는가 |
|---|---|---|
| 물리 | LLDP / CDP, IP-MIB | 무엇이 무엇과 케이블로 연결되어 있는가 |
| L2 | 브리지/VLAN 인접 | 무엇이 브로드캐스트 도메인을 공유하는가 |
| IGP(인스턴스별) | 프로토콜별·영역별 LSDB | 각 프로토콜이 무엇을 믿는가 |
| BGP | BMP RIB | 무엇에 누구를 거쳐 도달할 수 있는가 |
| 포워딩 | 각 라우터 자신의 테이블 | 패킷이 실제로 어디로 가는가 |
“A와 B는 연결되어 있는가?”에는 어느 쪽을 뜻했느냐에 따라 다섯 개의 서로 다른 정답이 있습니다. 두 라우터가 케이블은 공유하면서 IGP 인접은 없을 수 있습니다. IGP 인접은 있으면서 서로에게 패킷을 한 번도 포워딩하지 않을 수 있습니다. 둘 다 볼 수 없는 장비 세 대를 지나는 경로 위에서 BGP 피어일 수도 있습니다.
세 번째 글은 사실 이 표의 마지막 두 행에 대한 논증이었습니다. IGP 토폴로지와 포워딩 토폴로지는 같은 그래프가 아니며, 하나로 취급하면 여덟 번에 한 번 허구의 경로가 나온다는 것입니다. 이번 글은 같은 논증을 한 층 아래에서 반복합니다. 물리 토폴로지와 프로토콜 토폴로지 역시 같은 그래프가 아니며, 제 랩의 링크 124개가 열 배라는 계수로 그것을 증명합니다.
이것의 대가
이 점에 정직한 것은 공짜가 아닙니다. 다음을 뜻합니다.
- 단순한 도구가 하나만 훑는 자리에서 LSDB를 두 개 훑어야 함
- 외래 키 대신 멤버십 테이블
- 역할을 저장하는 대신 다시 계산함
- 모든 경로 질의가 어느 인스턴스, 어느 주소 패밀리에 대해 묻는 것인지 알아야 함
- 링크에 숫자 하나가 아니라 탭 줄을 보여 줘야 하는 UI
다른 선택지는, 더 빨리 그려지고 데모가 더 잘되며 당신 네트워크의 모든 듀얼 스택 링크에서 두 코스트 중 하나를 조용히 골라 버리는 그래프입니다.
IPv4 경로와 IPv6 경로가 갈라졌는데도 몇 달 동안 아무도 알아채지 못한 네트워크를 저는 운영해 봤습니다. 벽에 걸린 모든 도구가 라우터 두 대 사이에 선 하나를 그렸기 때문입니다. 그 선이 틀린 것은 아니었습니다. 그저 아무도 묻지 않은 질문에 답하고 있었을 뿐입니다.
다음 글: 그 출처들이 정면으로 서로 모순될 때 무슨 일이 벌어지는가: 네트워크가 스스로와 어긋날 때.