쓴 글공개

새로 깐 것이 범인처럼 보였다

집 네트워크가 끊기기 시작했고, 며칠 전에 깐 Tailscale 을 지우려 했다. 설치 시각과 증상 시작 시각을 각각 재니 이상 지표가 설치보다 18~127일 앞서 있었다.

무죄 · 18~127일

이 글에서 무죄가 되는 도구의 이름은 Tailscale 이다. 멀리 떨어진 내 기계들을 같은 방에 있는 것처럼 이어 주는 물건이다. 집 PC와 회사 PC에 각각 깔아 두면 공유기 설정을 열거나 포트를 뚫지 않아도 둘이 서로를 찾고, 깔린 기계끼리만 통하는 사설 주소 하나씩을 나눠 준다. 그 주소로 파일을 옮기거나 원격으로 붙는다. 나는 집과 회사에서 같은 작업을 이어 하려고 깔았다.

Tailscale 이 하는 일 — 인터넷은 그대로, 내 기계들끼리만 통하는 길을 덧댄다 깔기 전 집 PC 회사 PC 서로를 못 찾는다 — 사이에 공유기가 둘 있다 깔고 나서 집 PC 회사 PC 둘만 아는 사설 주소로 바로 붙는다 설정을 열거나 포트를 뚫지 않는다. 깔면 그 기계가 내 사설망의 한 칸이 된다 ⚠ 이 글은 이 도구를 권하는 글이 아니다 — 범인으로 몰렸다가 풀려난 기록이다
이 그림이 이 글에 있는 이유는 하나다. 무엇이 무죄인지 모르면 무죄 판정을 읽을 수 없다.

깔고 며칠 뒤, 집 네트워크가 하루에도 몇 번씩 끊겼다. 무선은 느려지고 유선도 같이 느려지고, 30초쯤 아무것도 안 나가다 돌아왔다. 의심은 바로 붙었다 — 며칠 전에 깐 그것. 새로 들어온 것이 하나뿐이면 그게 범인이다.

그래서 지우기 전에 한 가지만 했다. 설치 시각과 증상 시작 시각을 따로 쟀다. 둘 다 재고 나니 순서가 반대였다.

파일 날짜는 설치 날짜가 아니다

처음 잡은 설치일이 틀렸다. 프로그램 폴더의 파일 날짜를 봤는데 그건 만든 쪽이 빌드한 날이지 내가 깐 날이 아니다. 3주 차이가 났고, 그 3주 안에 증상이 들어 있었다. 여기서 한 번 속았다.

제대로 된 설치 시각은 세 군데에서 같은 값이 나와야 잡힌다 — 서비스가 등록된 이벤트, 레지스트리의 설치 시각, 네트워크 어댑터가 처음 나타난 시점. 셋이 같은 날 같은 시각을 가리키고 나서야 기준선이 생겼다.

판정의 기준선을 대상이 스스로 말하게 두면 안 된다. 파일 날짜는 대상이 들고 온 숫자다.

증상은 설치보다 18일에서 127일 먼저 있었다

기준선이 생기니 비교가 가능해졌다. 유선 쪽 오류 이벤트는 설치 18일 전에 처음 찍혔고, 그 앞 넉 달은 0건이었다. 포트가 말라붙는 다른 지표는 설치 127일 전이 처음이었다.

더 결정적인 건 발생률이었다. 설치 전 하루 3.17건, 설치 후 하루 2.15건. 32% 줄었다. 범인으로 지목된 것이 들어온 뒤에 증상이 났다.

도구 자체도 놀고 있었다. 외부로 나가는 경로 설정 0건, 가로채는 이름 규칙은 자기 전용 주소에만 걸려 있었고, 134일치 연결 판정 기록 전수에서 이 어댑터가 인터넷 경로로 잡힌 적이 한 번도 없었다. 데몬의 누적 CPU 사용 시간은 0초였다.

“새로 깐 것”은 용의자 목록을 만드는 근거는 되지만 판정의 근거는 못 된다. 시간 순서를 재기 전까지는 목록에 있을 뿐이다.

못 재는 자리를 “없었다”로 쓰지 않았다

무선 증상은 이 PC에서 원리적으로 확인할 수 없었다. 무선 어댑터가 아예 없는 기계다. 관련 서비스가 멈춰 있고 로그는 0건이다. 0건은 “문제가 없었다”가 아니라 “잴 수 있는 장치가 없다”였다.

30초 단절도 같았다. 이 운영체제는 연결 상태를 15초마다 확인하고 30초가 지나야 낡은 것으로 치며 35초에 판정을 내린다. 30초짜리 단절은 판정이 나기 전에 끝난다. 저수준 패킷 로그도 꺼져 있었다. 사건이 지나간 뒤에 뒤져서는 안 나오는 게 정상이다.

계측기가 꺼져 있던 구간을 무죄의 근거로 쓰면, 그건 무죄가 아니라 무기록이다. 그래서 이 두 구간은 판정에서 빼고 “못 쟀다”로 남겼다.

결론이 한 번 뒤집힌 곳은 측정 방법 때문이었다

중간에 “이름 서버가 고장 났다”는 결론을 한 번 냈다. 평균 590ms가 나왔으니 근거는 충분해 보였다. 그런데 그 측정은 존재하지 않는 임의의 주소를 물어본 것이었다. 없는 이름을 묻는 경로는 실제 조회와 다른 길을 타고, 서버마다 수십 배씩 갈린다.

실제로 쓰는 주소로, 예열을 주고, 순서를 돌려 가며 다시 쟀다. 중앙값 5ms. 비교 대상과 같은 값이었다. 꼬리 쪽만 실재했고 그건 위생 문제지 원인이 아니었다.

측정 방법이 틀리면 숫자는 여전히 나온다. 숫자가 나왔다는 사실은 그 숫자가 맞다는 증거가 아니다.

판정 — 무죄, 그리고 원인 미규명

지목된 도구는 무죄다. 지우지 않았다. 그리고 원인은 아직 모른다. 남은 용의자는 공유기 무선부, 공유기 바깥 구간, 회선 셋인데 전부 이 PC에서는 안 보이는 자리다.

이 글의 절반은 두 번째 문장을 쓰기 위해 있다. 무죄 판정과 원인 규명은 다른 일인데, 하나를 끝내고 다른 하나를 안 끝내면 무죄 쪽이 자꾸 무효가 된다. 증상이 또 나면 새로 깐 것이 다시 제일 먼저 의심받고, 잰 것을 안 적어 두면 그 사람은 같은 측정을 처음부터 다시 한다. 그래서 무죄를 재제안 금지라고 적어 뒀다 — 근거와 함께.

못 한 것

  • 원인을 못 찾았다. 이 글은 범인을 잡은 기록이 아니라 한 명을 풀어 준 기록이다.
  • 남은 용의자 셋 중 하나도 안 열었다. 전부 PC 밖이라 다른 관측 지점이 필요하다.
  • 회선의 계약 상한을 모른다. 측정된 처리량이 정상인지 절반인지 판정할 기준이 없다.
  • 무선 구간은 끝까지 못 쟀다. 기계를 바꾸지 않는 한 이 PC에서는 앞으로도 못 잰다.