← 전체 글

네트워크가 스스로와 어긋날 때

여섯 개의 진실 출처, 하나의 답, 그리고 그것들이 서로 모순될 때 할 일

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 전환이 ip-bound 근거와 함께 양쪽 물리 포트를 이름으로 밝히는 AS 간 경로
eBGP 전환이 ip-bound 근거와 함께 양쪽 물리 포트를 이름으로 밝히는 AS 간 경로

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-peersnmp-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를 거치는 우회를 아예 볼 수 없습니다. 직결이 아닌데도 경로가 직결처럼 보입니다. 실제 인터넷 토폴로지의 한 부류 전체가, 그것을 숨기는 대상을 일부러 찾아 나서지 않는 한 보이지 않습니다.


규칙

두 출처가 어긋날 때 할 수 있는 일은 세 가지입니다.

  1. 하나를 고른다. 빠르고, 단호해 보이고, 언제인지 모를 때 조용히 틀립니다.
  2. 평균을 낸다. 존재하지 않는 무언가를 기술하는 숫자가 나옵니다.
  3. 순위를 매기고, 어느 것을 썼는지 말한다.

Osprey는 어디에서나 세 번째를 합니다. 지난 화요일에 네트워크가 어떤 모습이었는지에 대한 제 기억보다 그 출력을 더 믿는 이유가 그것입니다.

대가는 인터페이스가 경쟁사보다 더 많은 단어를 지고 가야 한다는 것입니다. resolved, inferred, opaque, ip-bound, session link undetermined, bmp-peersnmp-peer의 구분. 그 하나하나가 더 예쁜 제품이라면 깔끔한 선 하나를 그렸을 자리입니다.

깔끔한 선은 주장입니다. 뒷받침할 수 없다면, 그리지 마십시오.


다음은 이 철학이 그 저자를 향해 돌아서는 글입니다. 제 도구가 허구를 그려 왔다는 것을 알게 된 날: 내 토폴로지가 나에게 거짓말한 날.