페이스북이 인터넷에서 스스로를 지운 날

2021년 10월, 페이스북은 해킹당하지도 DDoS를 맞지도 않았다. 명령어 하나를 실행했고, 자사의 안전장치가 페이스북을 인터넷 지도에서 지워버렸다 — 그리고 해결책이 있는 방에서 엔지니어들을 잠가버렸다.

2021년 10월 4일 15시 39분 UTC, 페이스북은 인터넷의 나머지에게 자기가 어디 사는지 잊으라고 말했다 — 그리고 거의 여섯 시간 동안 그 주소를 다시 알려주지 못했다.

해커는 없었다. 기록적인 DDoS도, 제로데이도, 랜섬웨어 협박문도 없었다. 페이스북·인스타그램·왓츠앱·메신저·오큘러스가 지구 인구의 약 3분의 1에게서 사라진 것은, 정기 점검 중 실행한 명령어 하나 때문이었고 — 그리고 여기서 잠깐 곱씹을 대목인데 — 안전장치가 설계된 그대로 정확히 작동했기 때문이었다. 여기서 흥미로운 실패는 누군가 설정을 잘못 쳤다는 게 아니다. 세계 최고 수준의 네트워크 엔지니어를 보유한 회사가, 스스로를 끊어버릴 수 있고 그다음엔 물리적으로 다시 이을 수 없는 시스템을 만들었다는 것 — 돌아가는 모든 길이 하필 다운된 바로 그것을 통과했기 때문이다.

명령어 하나, 백본 전체

페이스북의 전 세계 데이터센터는 사설 백본으로 엮여 있다 — 시설 사이로 트래픽을 나르는 글로벌 네트워크로, 한 지역에서 올린 사진과 다른 지역에서 그걸 보는 친구가 중간 어딘가에서 만나게 하는 것이다. 페이스북 자체 포스트모템에 따르면, 정기 작업 중 한 엔지니어가 그 백본의 가용 용량을 점검하려는 명령을 내렸다. 명령은 대신 백본 네트워크의 모든 연결을 끊어, 페이스북 데이터센터를 전 세계적으로 서로에게서 그리고 인터넷에서 분리했다.

가드레일이 있었어야 했다. 페이스북은 바로 이런 명령을 잡아 실행 전에 막는 것이 유일한 임무인 감사 도구를 운영한다. 그 도구에 버그가 있었다. 명령을 표시하지 않았고, 그래서 아무것도 막지 못했으며, 한 동작에 백본이 침묵했다.

이것만으로도 나쁜 오후였을 것이다. 이걸 전설로 만든 건, 방 안의 누구도 예상 못 한 2차 효과였다. 그건 공개 인터넷 바깥에서 벌어졌기 때문이다.

DNS 서버가 스스로를 철회했다 — 의도적으로

백본 장애를 소멸로 바꾼 메커니즘이 여기 있고, 이건 진짜로 우아하다. 그게 이걸 끔찍하게 만든다.

페이스북의 권위 DNS 서버 — “facebook.com의 IP가 뭐냐”에 답하는 기계들 — 는 데이터센터에 살지 않는다. 네트워크 가장자리에 더 가까이 앉아, BGP로 자신의 존재를 인터넷의 나머지에게 광고한다. BGP(경계 경로 프로토콜)는 지구상 모든 네트워크가 다른 모든 네트워크에게 자기가 닿을 수 있는 IP 대역을 알려주는 라우팅 체계다.

이 DNS 서버들은 헬스체크를 돈다. 그중 하나가 페이스북 데이터센터 — 진짜 진실의 원천이 사는 곳 — 로의 연결을 잃으면, 자기에게 뭔가 문제가 생겼다고 결론짓고 책임 있는 행동을 한다: BGP 경로 광고를 멈춘다. 논리는 타당하다. 모선에 닿지 못하는 DNS 서버가 계속 자신 있게 질문에 답해서는 안 된다; 뒷받침 못 할 답을 나눠주느니 스스로 로테이션에서 빠지는 게 낫다.

그런데 이번엔 모든 DNS 서버가 동시에 데이터센터로의 연결을 잃었다. 그들을 잇던 백본이 방금 증발했기 때문이다. 그래서 하나하나가, 독립적으로 그리고 올바르게, 철회를 결정했다. 바깥에서 지켜보던 클라우드플레어는 15시 39분 UTC부터 쏟아진 BGP 철회를 기록했다 — 그리고 철회된 경로에는 페이스북 네임서버를 담은 대역이 포함돼 있었다. 몇 분 사이 페이스북 DNS는 오류를 반환한 게 아니다. 존재하기를 멈췄다. 물어볼 서버가 없었다. 서버들이 인터넷에게 자기들로 라우팅하지 말라고 말했으니까.

15시 50분 UTC 무렵, facebook.com은 모든 주요 공개 리졸버 캐시에서 만료돼 사라졌다. 그 순간 전까지는 여기저기 캐시된 답 하나가 파편을 살려두고 있었다. 그 뒤로 그 이름은 어디서도 해석되지 않았다. 글로벌 DNS가 아는 한, 페이스북은 애초에 주소를 가진 적이 없었다.

인터넷이 알아챘다, 요란하게

수십억 요청을 처리하는 도메인이 갑자기 해석을 멈추면, 클라이언트들은 어깨를 으쓱하고 넘어가지 않는다. 앱을 열어둔 모든 폰, 모든 브라우저 탭, “페이스북으로 로그인” 버튼을 단 모든 서비스가 재시도를 시작한다 — 그리고 각 재시도는 세계의 재귀 리졸버로 쏘아지는 새 DNS 쿼리다. 답을 못 받은 리졸버도 재시도한다. 공개 DNS 제공업체들은, 페이스북 소프트웨어의 설치 기반 전체가 어두워진 이름을 두드리면서 트래픽이 급증했다고 보고했다.

요란한 교훈 안에 조용한 교훈이 끼어 있다: 한 회사의 장애가 모두의 DNS 부하 급증이 됐다. “답 없음” 상태에서 DNS의 실패 방식이 “더 세게 다시 물어봐”이기 때문이다. 페이스북의 소멸은 자기가 소유하지도 않은 인프라에 세금을 물렸다.

잠긴 방

이제 엔지니어들이 고쳐야 했다. 그리고 함정을 발견했다.

백본을 진단하고 수리할 때 평소 쓰던 도구 — 대시보드, 원격 접속, 내부 커뮤니케이션 — 는 전부 다운된 바로 그 네트워크 위에서 돌았고, 더는 해석되지 않는 바로 그 DNS에 의존했다. 복구를 조율하려던 사람들은 서로에게도 안정적으로 닿지 못했다고 전해진다. 내부 툴링이 공개 사이트만큼이나 사라졌기 때문이다. 원격으로 들어갈 수 없는 이유를 고치려고 그 네트워크에 원격으로 들어갈 수는 없다.

그래서 물리적 접근으로 물러섰고, 함정엔 한 겹이 더 있었다. 데이터센터와 서버 케이지에 들어가려면 배지 리더와 출입 통제 시스템이 필요했다 — 물론 전자식이었고, 영향받은 네트워크 위에 있었다. 그날의 보고들은 평소 키카드로 열리던 문과 케이지를 통과하려 엔지니어들이 물리적 도구를 동원해야 했다고 묘사한다. 그리고 “하드웨어에 물리적으로 닿을 수 있는 사람”과 “거기에 인증하는 법과 뭘 쳐야 하는지 아는 사람” 사이의 그 간극조차 시간을 잡아먹었다; 두 집단은 같은 사람이 아니었고, 같은 장소에 있지도 않았다.

결국의 해결책은, 페이스북 규모로 돌아가는 회사치고는 우습도록 로우테크였다: 현장의 팀이 노트북을 백본 라우터의 콘솔 포트에 직접 연결해, 죽은 네트워크를 통째로 우회하고 손으로 되살렸다. 그리고 천천히 되살려야 했다 — 모든 걸 한 번에 켜면 전력 소모와 트래픽이 급증해 전체가 다시 넘어질 위험이 있었다. BGP 광고는 21시 조금 전에 재개됐고, 도메인은 21시 5분경 다시 해석됐으며, 서비스는 대략 22시 45분에 대체로 돌아왔다.

이 이야기가 진짜로 말하는 것

이걸 “인적 오류”로 분류하고 넘어가고 싶어진다. 그건 틀린 교훈이다. 더 나은 규율이 당신을 구했으리라 믿게 만들기 때문이다. 물론 명령은 실수였다. 하지만 실수는 상수다; 회복력 있는 시스템의 임무는 실수에서 살아남는 것이다. 각각 개별적으로는 합리적인 두 설계 결정이, 실수를 여섯 시간짜리 소멸로 바꿨다.

첫째는 DNS 자기 철회다. 이건 좋은 안전장치다 — 검증 못 할 답을 내주지 말 것 — 그리고 신중한 엔지니어라면 누구나 추가할 법한 헬스체크다. 동시에 그건 “백본이 다운됐다”를 “우리는 인터넷에 더는 존재하지 않는다”로 변환한 증폭기가 됐다. 같은 근원 조건에서 전부 발동하는 안전장치들은 합쳐서 더 많은 안전이 되지 않는다; 합쳐서 사방에서 동시에 터지는 하나의 상관된 실패가 된다.

둘째는, 어딘가에 문신으로 새길 만한 것인데, 페이스북의 복구 경로가 실은 out-of-band가 아니었다는 것이다. out-of-band 채널이란 복구하려는 시스템과 아무것도 공유하지 않는 채널이다 — 네트워크도, DNS도, 인증도, 문 잠금장치도. 페이스북 것은 공유했다. 모니터링, 커뮤니케이션, 원격 접속, 물리적 출입 통제가 전부, 스택 어딘가에서, 자기가 독립적이어야 할 바로 그 인프라에 기대고 있었다. 그것이 무너지자 사다리까지 함께 가져갔다.

중요한 무언가를 돌리는 모든 조직은 이 그래프의 자기 버전을 갖고 있고, 그걸 바닥까지 실제로 추적해 본 곳은 거의 없다. 불편한 질문을 던져보라: 지금 당장 주 네트워크가 사라진다면, 고칠 경로가 정말로 분리돼 있는가 — 아니면 복구 계획이 조용히, 당신이 복구하려는 그것이 이미 작동 중이라고 가정하고 있는가? 페이스북은 그 답을, 월요일 오후, 모두가 보는 앞에서, 어렵게 알아냈다. 나머지 우리는 그걸 공짜로 배울 수 있었다.

토론 참여

← 블로그로 돌아가기