킬 스위치 테스트: 재연결만이 아니라 공백 시간을 측정하라
빠른 재연결은 클라이언트가 빠르다는 것만 증명한다. 공백 동안 무엇이 머신을 떠났는지, 사용한 트리거와 함께 기록하지 않으면 테스트는 절반만 측정한 것이다.
한 초 만에 끝나는 재연결은 클라이언트가 빠르다고 알려준다. 터널이 내려가 있는 동안 무언가가 빠져나갔는지는 알려주지 않는다. 일 분이 걸리는 재연결은 클라이언트가 느리다고 알려주며, 공백 동안 직접 트래픽이 허용되었는지는 여전히 알려주지 않는다. 이것은 두 가지 측정이고, 첫 번째만 보고하는 킬 스위치 테스트는 스위치를 시험하지 않은 것이다.
두 가지 관찰, 두 가지 별개의 판정
가용성 질문은 단순하다. 터널이 언제 다시 사용 가능해졌는지, 그리고 보호된 애플리케이션이 거기에 도달하려고 새 연결을 필요로 했는지. 강제 질문은 다르다. 보호가 떨어진 순간부터 돌아온 순간까지 어떤 패킷이 머신을 떠났는지.
별도의 기록으로 답하라. 한 줄은 공백이 일정한 초 동안 지속되었다고 말한다. 다른 줄은 그 공백 동안 보호되지 않은 요청이 성공했는지 말한다. 이것을 하나의 통과 또는 실패로 합치면 가장 중요한 사례, 즉 누출이 있는 빠른 재연결이 숨는다.
시간을 잴 수 있는 프로브를 만들어라
요청은 무해하고 저렴하며 터널 자체의 제어 채널과 무관해야 한다. 아래 루프는 매초 한 번 타임스탬프와 HTTP 상태, 경과 시간을 출력하고, 멈추는 대신 크게 실패한다.
while true; do
printf '%s ' "$(date +%H:%M:%S)"
curl -sS -o /dev/null -w '%{http_code} %{time_total}\n' --max-time 2 https://example.com || echo "curl-exit-$?"
sleep 1
done
상태만이 아니라 curl 종료 코드를 읽어라. 28은 요청 시간이 초과되었다는 뜻이며, 차단된 경로는 그렇게 보인다. 6은 이름 확인이 실패했다는 뜻이고, 이것은 다른 발견이며 종종 더 흥미롭다. 공백 동안 짧은 경과 시간으로 200이 나오면 트래픽이 밖으로 나가도록 허용된 것이다.
출력을 파일에 쓰고 보관하라. 터미널 스크롤백은 증거가 아니며, 흥미로운 부분은 보통 중간의 세 줄이다.
정돈된 실패가 아니라 실제 실패를 일으켜라
클라이언트 자체 메뉴에서 연결을 끊는 것은 협조적 경로를 시험한다. 클라이언트가 차단 규칙을 설치할 시간이 있다. 대신 프로세스를 죽이거나 하위 링크를 끊으면 실제 실패가 지나가는 경로를 시험하게 된다.
각 트리거는 다른 코드 경로를 훈련한다. 서버 측 장애, 로컬 링크 손실, 클라이언트 충돌은 각각 다른 상태를 남길 수 있고, 그중 하나가 결국 마주칠 사례일 가능성이 높다. 프로브를 최소 두 개의 트리거에서 실행하고 결과를 트리거별로 표시하라.
허용된 트래픽이 어떤 모습인지 로그에서 읽어라
공백 동안의 200 또는 빠른 연결 실패는 어느 방향을 가리키든 누출이다. 공백 내내 시간 초과가 차단 정책의 예상되는 형태다. 연결이 실패하는 동안 이름 확인이 성공하면 리졸버에 여전히 도달할 수 있다는 뜻이며, 이는 다른 종류의 누출이다.
기존 소켓은 주의가 필요하다. 프로그램은 연결 해제 전에 연 연결을 계속 사용할 수 있으므로, 살아 있는 것처럼 보이는 트래픽이 새 경로가 허용되었다는 증거가 아닐 수 있다. 소켓 목록은 연결이 이벤트보다 앞서는지 보여준다.
ss -tunp | grep -E 'ESTAB|SYN-SENT' ip route get 198.51.100.7 resolvectl status | sed -n '1,20p'
소켓 시작 시간을 연결 해제의 타임스탬프와 비교하라. 장애보다 오래된 연결은 누출이 아니라 소켓 재사용의 증거이며, 이를 실패로 보고하면 다음 사람을 존재하지 않는 버그를 찾아 나서게 한다.
업데이트를 견디는 형식으로 결과를 기록하라
트리거, 초 단위의 공백, 차단되지 않은 요청이 성공했는지, 이름 확인이 성공했는지, 그리고 클라이언트와 운영체제 버전을 적어라. 이 다섯 가지 사실의 집합은 릴리스 간에 비교할 수 있으며, 산문 한 문단은 그렇게 할 수 없다.
클라이언트 업데이트나 프로필 변경 후 같은 테스트를 다시 실행하라. 차단 동작은 구현 세부 사항이고 움직이기 때문이다. 기록의 목적은 그것이 사건이 되기 전에 움직임을 알아차리는 것이지, 클라이언트를 한 번 인증하는 것이 아니다.