← 전체 글

결코 패킷을 날라서는 안 되는 라우터

링크 스테이트 프로토콜 셋, 네트워크에 합류하면서 일부러 쓸모없어지는 세 가지 방식

Michel Wijnberg

2편은 Osprey가 당신의 네트워크를 건드리지 않는다고 주장했습니다. 이번 시리즈는 그 주장 한 층 아래입니다. 각 프로토콜에 실제로 어떻게 들어가는지, 각각이 무엇을 내주기를 거부하는지, 그리고 예의 바른 손님 노릇이 들리는 것보다 어려운 지점이 어디인지에 관한 이야기입니다.

가장 까다로운 요구부터 시작합시다. 나머지 전부가 거기서 따라 나오기 때문입니다.

링크 스테이트 데이터베이스를 읽으려면 그 안에 있어야 합니다. 옆에 있는 것도, 물어보는 것도 아닙니다. 진짜 인접을 맺고, 진짜 LSA를 주고받으며, 다른 모두의 데이터베이스에 하나의 라우터로 나타나야 합니다. OSPF에도 IS-IS에도 관찰자 모드는 없습니다. 합류하든가, 아무것도 못 얻든가입니다.

그리고 합류하는 순간, 그 영역의 모든 라우터가 이제 당신을 포함한 그래프 위에서 최단 경로를 계산합니다. 트래픽을 원하느냐고 아무도 묻지 않았습니다.

그래서 요구 사항은 이렇습니다.

완전히 준수하는 라우터가 되라. 결코 경로로 선택되지 마라.

이 둘은 설계상 서로 긴장 관계에 있고, 세 프로토콜은 저마다 다르게 풀어냅니다.


OSPFv2: 최대 비용

RFC 2328은 OSPFv2 라우터가 참여하는 모든 영역에 대해 Router-LSA를 기점으로 낼 것을 요구합니다. 관찰 전용 인접이라는 도피처는 없습니다. 참여한다는 것은 기술된다는 뜻입니다. 그래서 레코더는 하나를 내고, 자신의 유일한 점대점 링크를 비용 65535, 즉 16비트 메트릭이 담을 수 있는 최댓값으로 광고합니다.

영역의 다른 모든 라우터는 그 링크를 포함해 성실히 다익스트라를 돌리고, 어떤 대안 경로든 이깁니다. 레코더는 그래프 안에 있고, 보이며, 준수하고, 그리고 네트워크에 정말로 다른 것이 아무것도 없지 않은 한 결코 최단 경로에 오르지 않습니다. 그런 경우라면 당신에게는 모니터링보다 더 큰 문제가 있습니다.

OSPFv2에서의 메커니즘은 이게 전부이고, 이것이 무엇이 아닌지를 눈여겨볼 만합니다. “나를 쓰지 마라”는 플래그가 아닙니다. 평범한 알고리즘에서 답이 저절로 떨어져 나올 만큼 높게 설정된 평범한 메트릭입니다. 준수 라우터에 특별 처리가 필요 없습니다. 특별한 일이 벌어지고 있지 않기 때문입니다.

두 번째 절반이 있는데, 그것을 배우는 데는 장애 하나가 들었고, 그쪽이 더 흥미롭습니다. 레코더는 점대점 링크를 광고하고 그 밖에는 아무것도 광고하지 않습니다. 특히 GRE 터널 자신의 내부 서브넷에 대한 스텁 네트워크를 광고하지 않습니다. 그것을 광고하면, 최대 비용이라 해도, 다른 모든 라우터가 터널 프리픽스에 대한 경로를 설치하게 됩니다. 그 경로는 이윽고 터널 자신의 외부 패킷을 몰고 갈 수 있고, 그러면 관측을 나르고 있던 인접이 죽습니다. 모니터링이 모니터링하기 위해 필요한 바로 그것을 부수는 것입니다. 7편에 제가 그것을 호되게 알게 된 판본의 이야기가 있습니다.

최대 비용은 당신을 최단 경로에서 떼어 놓습니다. 라우팅 테이블 밖에 두지는 못하며, 이 둘은 다른 문제입니다.


OSPFv3: 같은 것에, 그것을 대놓고 말하는 비트 하나

OSPFv3는 메트릭 수법을 물려받고, 거기에 OSPFv2에는 대응물이 없는 것을 하나 더합니다.

OSPFv3는 Router-LSA 옵션에 R 비트를 싣습니다(RFC 5340). 이 비트가 지워져 있으면, 광고하는 라우터는 트랜싯 트래픽을 전달할 능력이 있다고 간주되지 않습니다. 토폴로지 배포에는 계속 참여합니다. 다만 트랜싯 노드로서의 자격이 없을 뿐입니다.

그건 메트릭이 아닙니다. 선언입니다. 그래서 레코더는 R 비트를 지운 채로 두고, 준수하는 OSPFv3 라우터는 단지 순위를 꼴찌로 두는 대신 트랜싯 계산에서 아예 제외합니다.

이 차이는 보기보다 중요합니다. 최대 메트릭은 우연히 결정적이 된 선호에 관한 진술입니다. 지워진 R 비트는 능력에 관한 진술이며, 다른 모든 경로가 더 나쁜 토폴로지에 의해 뒤집힐 수 없습니다.

읽는 쪽에서도 고리가 닫힙니다. Osprey 자신의 SPF도 영역별 논트랜싯 플래그를 통해 같은 비트를 존중하므로, 레코더는 준수 라우터에 의해서도 Osprey 자신의 경로 계산에 의해서도, 같은 명시된 이유로 트랜싯에서 제외됩니다. 두 구현, 하나의 비트, 어느 쪽에도 특수 케이스 없음.

OSPFv2에는 그 문장을 적어 둘 자리가 그냥 없습니다. 옵션 필드에 대응물이 없으니 v2는 메트릭 하나만 갖게 되고, 이 비대칭은 들인 노력이 아니라 프로토콜의 성질입니다.


IS-IS: 문 둘과 빗장 하나

IS-IS는 단일 메커니즘으로는 가장 강한 것을 갖고 있고, 이 구현에서는 그 주위에 가장 두꺼운 이중 방어를 둘렀습니다.

자기 기점 LSP는 오버로드 비트를 세웁니다. ISO 10589는 그 의미에 대해 분명합니다. 다른 라우터들은 이 시스템에 도달해도 되지만, 이것을 지나는 경로를 계산해서는 안 됩니다. OSPFv3의 R 비트와 같은 부류의 진술이고, 그보다 한참 앞섭니다.

그리고 둘 더 있는데, 이 둘은 같은 종류가 아닙니다.

필드값무엇을 막는가
OL 비트설정트랜싯 노드로 계산되는 것
ATT 비트0000기본 게이트웨이로 설치되는 것
TLV 22 메트릭0xFFFFFF오버로드 비트를 권고로 취급하는 모든 구현

ATT 행이 제자리를 얻는 이유는 다른 문을 닫기 때문입니다. 오버로드 비트는 경로 계산에 관한 것입니다. 어태치드 비트는 기본 라우팅에 관한 것으로, L1L2 라우터가 영역 밖에 도달할 수 있음을 레벨 1 라우터들에게 알리려고 세우고, 그러면 그 라우터들이 기본 경로를 그쪽으로 겨눕니다. 그건 레코더를 지나는 경로가 계산되는 게 아니라, 더 나은 일치가 없는 모든 패킷이 그리로 보내지는 것이며, 더 나쁘고, 첫 번째 메커니즘이 덮지 않는 경로로 도착합니다.

메트릭 행은 순수한 방어입니다. 24비트로 16,777,215라는 메트릭은, 본래라면 그것을 불필요하게 만들어야 할 메커니즘 아래에서 OSPFv2의 수법을 하고 있는 것이며, 어딘가에 오버로드 비트를 권고로 취급하는 구현이 있으리라는 가정 위에 서 있습니다.

(LSP는 파티션 복구 비트도 지웁니다. 정말 사소한 일이고, 왜 저게 거기 있나 아무도 궁금해하지 않도록 언급만 해 둡니다.)

OSPF 데이터베이스가 실제로 담고 있는 두 대의 GRE 레코더를, 레코더 터널 대역으로 걸러낸 화면. 각각 자기 LSA와 시퀀스 번호를 가진 어엿한 라우터이며, 링크는 정확히 하나뿐이고 ABR도 ASBR도 아니다. 존재하되 최소한이고, 구조상 막다른 길이다
OSPF 데이터베이스가 실제로 담고 있는 두 대의 GRE 레코더를, 레코더 터널 대역으로 걸러낸 화면. 각각 자기 LSA와 시퀀스 번호를 가진 어엿한 라우터이며, 링크는 정확히 하나뿐이고 ABR도 ASBR도 아니다. 존재하되 최소한이고, 구조상 막다른 길이다

이 표가 이 글의 논지 전부입니다. 레코더는 데이터베이스 안에 있고, 자기 LSA와 자기 시퀀스 번호를 가지며, 다른 라우터와 똑같이 다뤄집니다. 링크는 하나씩, 플래그는 없고, 재분배할 것도 없습니다. 안전 설계는 레코더를 밖에 두기 위한 것이 아니라, 안에 있어도 무해하게 만들기 위한 것입니다.


제목이 주장하지 않는 것

더 나아가기 전에 갈라 두는 편이 좋습니다. 기계에 관한 진술로 읽으면 제목은 과장이기 때문입니다.

위의 어느 것도 호스트를 물리적으로 전달 불가능하게 만들지 않습니다. 랩 레코더에서는 마침 불가능한데, net.ipv4.ip_forward가 0이고 IPv6 대응 항목도 그렇기 때문입니다. 하지만 그건 호스트 설정입니다. 누군가 명령 하나로 바꿀 수 있고, 프로토콜 계층의 무엇도 알아차리지 못합니다.

그러므로 요구 사항은 “이 상자는 패킷을 전달할 수 없다”가 아닙니다. 이렇습니다.

네트워크 어디의 어떤 라우팅 계산도 이 상자를 트랜싯 노드로 선택할 수 없다.

차이는 보장이 어디에 사느냐입니다. 레코더의 무해함이 sysctl에 달려 있었다면, 그것을 배포하는 모든 운영자는 sysctl -w 하나 거리에서 모니터링 호스트를 전달 경로에 넣을 수 있었을 테고, 네트워크는 그것을 알지 못했을 것입니다. 대신 토폴로지에 달려 있기 때문에, 커널이 전달했을지 말지와 무관하게 네트워크 자신의 최단 경로 계산이 레코더를 거쳐 가기를 거부합니다.

sysctl은 좋은 허리띠입니다. 다만 이 글에서 가장 약한 것이고, 다음 절이 바로 그 기울기에 관한 이야기입니다.


불변식이 아니라 기본값인 것

세 레코더 모두 DR 선출 우선순위 0으로 돌기 때문에, 세그먼트의 지정 라우터가 될 일은 결코 없습니다. DR 선출에서 이긴 레코더는 그 세그먼트의 다른 모든 라우터가 플러딩을 의지하는 존재가 되어 버리고, 그건 전제 자체의 정반대입니다.

우선순위 0은 기본값이고, 그것이 어떤 종류의 보호인지 정확히 말해 두고 싶습니다. 그것은 설정 필드입니다. 코드의 어디도 더 높은 값을 거부하지 않습니다. 설정하면 레코더는 다른 어떤 라우터와도 똑같이 선출을 다툽니다.

이건 이 글의 나머지와 갈라 둘 만합니다. 그 위의 모든 것은 코드 안의 상수이기 때문입니다. 오버로드 비트는 기점을 내는 지점에서 OLBit: true이며 설정으로 끌 방법이 없습니다. OSPFv2 메트릭은 LSA 빌더 안에서 65535입니다. R 비트는 결코 세워지지 않습니다. 이것들은 불변식입니다. DR 우선순위는 기본값이고, 기본값이란 아무도 YAML 파일을 편집하지 않는 동안에만 정확히 살아남는 종류의 안전장치입니다.


실수를 아예 불가능하게 만들기

그래서 제가 정말로 신경 쓰는 부분에 이르렀습니다.

트랜싯을 막는 것은 선호의 문제입니다. 주입을 막는 것은 정확성의 문제이고, 훨씬 더 나쁩니다. 실패 양상이 차선의 경로가 아니기 때문입니다. 그것은 남의 테이블에 들어앉은, 아무것과도 대응하지 않는 경로입니다.

그래서 자기 기점 IS-IS LSP는 IP 도달성을 전혀 싣지 않습니다. TLV 128도, 130도, 135도, 236도 없습니다. 레코더를 TE 데이터베이스에 넣어 버릴 TLV 134 트래픽 엔지니어링 라우터 ID도 없습니다. TLV 222도, TLV 242도 없습니다.

그것이 어떻게 강제되는지가 요점입니다. 기점 루틴은 레벨, 시스템 ID, 영역 주소, 피어 시스템 ID, 시퀀스 번호, 인터페이스 주소, 그리고 선택적 인증자를 담은 작은 설정 구조체에서 입력을 받습니다. 거기에는 프리픽스를 담을 수 있는 필드가 없습니다. 호출자는 경로를 넘길 수 없습니다. 넘길 자리가 없기 때문입니다.

그 한계에 대해서는 정확하고 싶습니다. 더 크게 주장하고 싶어지기 때문입니다. 만들어지는 LSP는 범용 TLV 목록을 갖고 있고, 루틴은 거기에 덧붙입니다. 그 루틴을 편집하는 사람은 도달성 TLV를 덧붙일 수 있고, 타입 시스템은 반대하지 않을 것입니다. 설계가 제거하는 것은 가능성이 아니라 사고입니다. 어떤 설정도, 어떤 호출자도, 어떤 설정 조합도 경로를 들여올 수 없습니다. 주입하려면 존재 이유인 불변식들을 문서 블록에 나열해 둔 함수를 편집해야 합니다.

그 구분이 이 글 두 절반의 차이 전부이며, 이제 네 개의 단이 등장했습니다. 호스트 설정은 운영자가 그것이 무엇을 지키고 있었는지 끝내 모른 채 바꿀 수 있는 것입니다. 런타임 검사는 작성하기를 잊을 수 있는 것입니다. 기본값은 알아채지 못한 채 덮어쓸 수 있는 것입니다. 실수를 놓을 자리가 없는 입력면은 일부러 애를 써야 무너뜨릴 수 있는 것이고, 그 애쓴 흔적은 diff에 보입니다.

이 중 어느 것도 절대적이지 않습니다. 그저 우연히 벌어질 여지가 매우 다를 뿐이고, 할 가치가 있는 엔지니어링이란 맨 위에 검사를 하나 더 얹는 게 아니라 보장을 이 목록의 아래로 옮기는 일입니다.


요점

세 프로토콜, 세 메커니즘, 하나의 요구 사항. 그리고 메커니즘들은 서로 대체 가능하지 않습니다. OSPFv2는 “비싸다”만 표현할 수 있습니다. OSPFv3와 IS-IS는 “트랜싯 라우터가 아니다”를 표현할 수 있고, 그것은 더 강하고 더 정직한 말이며, 이 모든 것보다 수십 년 앞선 비트로 표현합니다.

흥미로운 엔지니어링은 드레인을 작성하는 일이 아니었습니다. 최대 비용이 당신을 라우팅 테이블 밖에 두지 못한다는 것, 기본값은 불변식이 아니라는 것, 그리고 규칙을 두기 가장 안전한 자리는 그 규칙을 잘못 표현할 수 없는 곳이라는 것을 알아차리는 일이었습니다.


다음: 떠나기. 재시작한 레코더는 네트워크가 더 높은 시퀀스 번호로 이전의 자신을 여전히 붙들고 있는 것을 발견하고, 그것을 고치는 메시지는 종료하면서 보내는 그 메시지입니다. 되돌릴 수 없는 LSA.