네트워크가 스스로와 어긋날 때
여섯 개의 진실 출처, 하나의 답, 그리고 그것들이 서로 모순될 때 할 일
Michel Wijnberg
Osprey는 여섯 곳에서 네트워크를 배웁니다.
| 출처 | 알려 주는 것 |
|---|---|
| OSPF / IS-IS LSDB | 각 프로토콜이 토폴로지를 무엇이라고 믿는지 |
| SNMP 라우팅 테이블 | 라우터가 실제로 무엇을 설치했는지 |
| BMP Adj-RIB-In | 각 BGP 피어가 이 라우터에게 무엇을, 누구로부터 광고했는지 |
| LLDP / CDP | 물리적으로 무엇이 무엇과 연결되어 있는지 |
| IP-MIB | 어떤 주소가 어느 포트에 사는지 |
| BGP 세션 테이블 | 누가 누구와 피어를 맺었는지 |
이들 하나하나는 어떤 것에 대해서는 권위입니다. 모든 것에 대해 권위인 것은 하나도 없습니다. 그리고 늘 일치하지도 않습니다.
순진한 답은 전역으로 승자를 하나 정하고(“토폴로지는 LLDP를 믿고, BGP는 BMP를 믿자”) 그냥 넘어가는 것입니다. 그 방식은 링크 한쪽에서 LLDP가 낡아 있는 첫 번째 네트워크에서, 또는 직결이라고 믿는 두 라우터 사이에 브리지가 끼어 있는 첫 번째 네트워크에서 무너집니다.
제가 도달한 답은 더 심심하고, 그리고 작동합니다. 주장마다 근거의 순위를 매기고, 각 주장이 어디에서 왔는지 기록한다.
포트: 네 가지 상황, 네 가지 다른 답
이 문제의 가장 날카로운 형태는 eBGP 전환에 물리 포트를 주석으로 다는 일입니다. 서로 다른 자율 시스템에 있는 라우터 두 대가 세션을 맺고 있습니다. 그 세션은 어느 케이블을 지날까요?
Osprey는 네 가지 경우를 구분하고, 각각에 서로 다른 종류의 답을 줍니다.
링크 쌍이 하나이고 패브릭 대안이 없음. 포트를 사실로 진술합니다.
jfk1-gw1 Et1/1 → i-jfk1-gw1 Et1/2
병렬 링크. 어느 쌍인지 확정되지 않으므로 하나를 주장하지 않습니다.
3 parallel L2 links: Gi2↔Et1/0, … (session link undetermined)
양쪽 경계가 공유 브리지에 있고 직결 링크는 없음. 접속 포트를 곁들여 브리지의 존재를 보고합니다. 그곳을 지나는 경로가 존재한다는 진술일 뿐, 이 세션이 그리로 간다는 주장은 결코 하지 않습니다.
shared L2 fabric: ix-sw (wn-edge Et0/3 ↔ ix-sw Et0/1; ix-sw Et0/2 ↔ nn-edge Et0/3) (session path unconfirmed)
직결 링크와 공유 패브릭이 둘 다 있음. 모호성을 명시적으로 이름 붙이고, 어느 쪽도 고르지 않습니다.
이 네 번째 경우가 바로 이 설계를 값어치 있게 만듭니다. 인터넷 익스체인지에서는 실제로 흔하고, L2만으로는 실제로 판정 불가능하며, 자신 있어 보이고 싶은 도구가 직결 링크를 골라 조용히 틀리는 바로 그 지점입니다.
추측을 사실로 바꾸는 단
빠져나갈 길이 하나 있고, 그것은 휴리스틱이 아닙니다. BGP 세션의 두 주소가 장비의 IP-MIB 바인딩을 통해 특정 포트로 해석되면, 그 포트는 더 이상 추론이 아닙니다. 어느 인터페이스가 그 주소를 소유하는지 라우터 자신이 알려 준 것입니다. 이 근거는 모호성 게이트를 덮어씁니다.
eBGP transition 200 → 300 jfk1-gw1 Et1/1 → i-jfk1-gw1 Et1/2 (bmp-peer+l2; ip-bound)
저 괄호는 증거 관리 연쇄로 읽으십시오.
bmp-peer: 둘 사이에 확립된 eBGP 세션이 있고, BMP를 통해 관측됨+l2: 반대편은 두 경계 장비의 LLDP/CDP 인접을 통해 맞춰짐ip-bound: 두 세션 주소가 IP-MIB를 통해 정확히 그 포트로 해석됨
서로 독립적인 세 출처가 일치합니다. 주장의 강도는 그것이 딛고 선 가장 약한 것과 같고, 이 표기법은 그것이 무엇인지를 말해 줍니다.
신선도도 근거의 일부입니다
L2 데이터는 낡습니다. 그리고 낡은 L2 데이터는 없는 것보다 나쁩니다. 신선한 L2 데이터와 똑같이 생겼기 때문입니다. 그래서 뒷받침용 행에는 규칙이 붙습니다.
- 포트 주장을 뒷받침하려면 행이 13시간보다 새로워야 합니다
- 6시간을 넘으면 경과 시간을 공개합니다
- 해석된 장비 정체성이 아니라 sysname만으로 매칭된 브리지는 포트 주장에 거부권을 행사하되, 자신이 사실로 표시되는 일은 결코 없습니다
마지막 것이 미묘하고 저는 그 점이 마음에 듭니다. 약한 근거에게는 확신을 부수는 것은 허용되지만 확신을 만드는 것은 허용되지 않습니다. 절반만 식별된 브리지는 직결 포트 쌍 주장을 그만둘 이유로는 충분하고, 그 브리지를 주장할 이유로는 턱없이 모자랍니다.
출처: 같은 표, 두 개의 다른 혈통
두 번째 글에서 BGP 피어 표를 보여 드렸습니다. 피어 57개에 걸친 378개 세션입니다. 그 스크린샷이 보여 주지 않는 것은, 그것들이 전부 같은 길로 들어오지는 않았다는 사실입니다.
| 출처 | 세션 수 |
|---|---|
| BMP: 라우터가 자기 Adj-RIB-In을 밀어 보냄(RFC 7854) | 24 |
| SNMP: 폴링 시점의 BGP4-MIB 워크 | 354 |
둘 다 참입니다. 둘이 똑같이 좋지는 않습니다. BMP는 피어가 광고한 모든 경로를, 라우터가 본 그대로의 Peer Up과 Peer Down과 함께 실시간으로 나릅니다. SNMP 워크는 마지막 폴링 시점의 세션 표를 줄 뿐, 그사이에 무슨 일이 있었는지는 아무것도 알려 주지 않습니다.
어느 RIB인지는 정확히 말할 가치가 있습니다. 무엇을 주장해도 되는지를 그것이 결정하기 때문입니다. RFC 7854가 관측하는 것은 Adj-RIB-In, 즉 이 라우터가 무엇을 고르기 전에 각 피어로부터 도착한 것입니다. 라우터가 스스로 선택한 표인 Loc-RIB는 나중에 나온 별개의 확장(RFC 9069)이고, 여기 있는 익스포터들은 그것을 보내지 않습니다. 그래서 이 랩은 “피어 X가 나에게 이 경로를 제시했다”는 라우터의 권위로 말할 수 있지만, “이것이 라우터가 설치한 경로다”는 그 후보들에 대한 Osprey 자신의 계산입니다. 둘은 서로 다른 주장이고, 서로 다르게 라벨이 붙습니다.
그래서 모든 행이 자기가 어느 쪽인지를 source 열에 기록하고, 그 값은 장식이 아니라 하중을 받습니다.
Osprey가 AS를 가로지르는 경로를 이어 붙이며 도메인 간 홉이 필요할 때, eBGP 세션은 출처를 달고
근거로 계산됩니다. bmp-peer와 snmp-peer는 사다리의 서로 다른 단이고, 경로 주석은 어느 단을 딛고
섰는지를 말해 줍니다.
경로 엔진 깊숙이 묻혀 있는, 제가 아끼는 관련 규칙이 하나 있습니다. BGP 경로를 내부인지 외부인지
분류할 때 뻔한 휴리스틱은 AS_PATH를 보는 것입니다. 원소가 하나면 iBGP라는 식이죠. Osprey는 그것을
먼저 하지 않습니다. 먼저 그 경로를 세션 테이블의 실제 피어 유형에 조인합니다(라이브는
bgp_peer, 시점 T는 bgp_peer_history). 그리고 출발 피어가 해석되지 않을 때만 AS_PATH 휴리스틱으로
물러납니다. 그 휴리스틱은 거의 언제나 맞습니다. 이 시리즈 전체가 다루는 실패 양상이 바로 그 “거의
언제나”입니다.
아무것도 일치하지 않을 때: 그렇다고 말하기
때로 출처들은 단지 어긋나는 데 그치지 않고 아예 바닥납니다. 도메인 간 경로 이어 붙이기는 엄격한 사다리로 세그먼트마다 등급을 매깁니다.
| 단 | 근거 | 확신도 |
|---|---|---|
| a | 경계에서 목적지를 포함하는 RIB 행 | resolved |
| a2 | 자신의 BMP RIB가 다음 AS를 거쳐 그것을 포함하는 라우트 서버 | inferred(bmp-rib-rs) |
| b | 다음 AS를 향해 확립된 eBGP 세션 | inferred |
| c | 아무것도 없음 | opaque: 주석이 달린 세그먼트, 홉은 그리지 않음 |
그리고 등급은 경로 단위가 아니라 세그먼트 단위입니다. 어떤 AS에서는 확실하고 다음 AS에서는 짐작일 수 있기 때문입니다. 위의 도메인 간 스크린샷이 같은 답의 양쪽 절반에 서로 다른 배지를 달고 있는 이유가 그것입니다.
(a2) 단이 존재하는 데에는 이름을 붙일 만한 이유가 하나 있습니다. 투명 라우트 서버는 AS_PATH에 결코 나타나지 않습니다. 라우트 서버 자신의 RIB를 읽지 않으면 IX를 거치는 우회를 아예 볼 수 없습니다. 직결이 아닌데도 경로가 직결처럼 보입니다. 실제 인터넷 토폴로지의 한 부류 전체가, 그것을 숨기는 대상을 일부러 찾아 나서지 않는 한 보이지 않습니다.
규칙
두 출처가 어긋날 때 할 수 있는 일은 세 가지입니다.
- 하나를 고른다. 빠르고, 단호해 보이고, 언제인지 모를 때 조용히 틀립니다.
- 평균을 낸다. 존재하지 않는 무언가를 기술하는 숫자가 나옵니다.
- 순위를 매기고, 어느 것을 썼는지 말한다.
Osprey는 어디에서나 세 번째를 합니다. 지난 화요일에 네트워크가 어떤 모습이었는지에 대한 제 기억보다 그 출력을 더 믿는 이유가 그것입니다.
대가는 인터페이스가 경쟁사보다 더 많은 단어를 지고 가야 한다는 것입니다. resolved, inferred,
opaque, ip-bound, session link undetermined, bmp-peer와 snmp-peer의 구분. 그 하나하나가 더
예쁜 제품이라면 깔끔한 선 하나를 그렸을 자리입니다.
깔끔한 선은 주장입니다. 뒷받침할 수 없다면, 그리지 마십시오.
다음은 이 철학이 그 저자를 향해 돌아서는 글입니다. 제 도구가 허구를 그려 왔다는 것을 알게 된 날: 내 토폴로지가 나에게 거짓말한 날.