디렉터리를 열고 속도순으로 정렬해 온라인으로 표시된 노드를 고르면, 클라이언트는 연결을 마치기도 전에 포기한다. 목록이 정확히 거짓말한 것은 아니다. 다른 네트워크에서, 더 이른 시점에, 누군가가 수행한 점검의 결과를, 자원봉사자가 언제든 끌 수 있는 서비스에 대해 알려 주었을 뿐이다. 이 간극을 이해하면 답답한 탐색은 어떤 후보에도 돌려 볼 수 있는 짧은 점검 목록이 된다.

목록이 실제로 측정한 것

공개 디렉터리는 마지막 점검 시각, 관측된 왕복 시간 값, 세션 수, 때로는 프로토콜 목록 같은 항목을 보관한다. 그 하나하나가 프로젝트 자체의 관점에서 본 마지막 성공 관측을 뜻하며, 당신의 패킷이 도착하는 시점의 노드 상태가 아니다.

숫자보다 신선도가 더 중요하다. 사 분 전에 점검된 노드와 네 시간 전에 점검된 노드가 같은 초록 표시를 보여 줄 수 있고, 그중 아직 기록된 상태와 비슷한 것은 하나뿐이다. 색이 아니라 타임스탬프를 보라.

자원봉사 운영은 어떤 모니터도 고칠 수 없는 두 번째 변화 원인을 더한다. 운영자가 노트북을 재부팅하고 있을 수도, 대역폭이 바닥나고 있을 수도, 통신사를 바꾸고 있을 수도, 아니면 그냥 덮개를 닫고 있을 수도 있다. 목록 항목은 후보이며, 그것을 서비스 수준 협약으로 취급하는 것은 범주 오류다.

스피너가 아니라 클라이언트의 단계를 보라

모든 VPN 클라이언트는 같은 큰 흐름을 거친다——이름을 해석하고, 전송 연결을 열고, 보안을 협상하고, 인증한 다음, 터널을 구성하고 데이터를 전달한다. 각 단계의 실패는 서로 다른 증거를 남기지만, 스피너는 그중 아무것도 보여 주지 않는다.

이름 해석부터 시작하라. 호스트 이름이 해석되지 않으면, 노드의 가용성에 대해서는 아무것도 시험되지 않았다, 연결이 당신의 기계를 벗어나지 않았기 때문이다. 다음은 전송이다: TCP나 UDP 교환이 거부되거나 시간 초과되면 그 포트에서 끝점이 응답하지 않는다는 뜻이고, 이는 노드에 관한 실제 발견이다. 이어서 협상과 인증에서는 잘못된 인증서, 만료된 프로필, 맞지 않는 암호 방식이 실패하는 동안 노드는 완전히 건강할 수 있다. 터널을 구성한 뒤에야 라우팅이나 DNS 결함이 마지막 단계를 설명할 수 있다.

화면에 아직 들어오는 가장 높은 상세 수준으로 클라이언트 로그를 읽고, 마지막으로 성공한 줄을 적어 두라. 바로 그 줄에서 진단이 시작되며, 보통 디렉터리가 보여 주는 무엇보다 많은 정보를 준다.

시도마다 변수 하나

같은 클라이언트, 같은 액세스 네트워크, 같은 프로필 형식으로 후보를 비교하고 끝점만 바꿔라. 그렇지 않으면 실패가 당신 쪽의 것일 수 있는데 노드 탓으로 돌리게 된다.

두 번의 시도로 패턴이 잡히고, 세 번째가 그것을 확인한다. 노드 A가 전송 단계에서 실패하고 노드 B가 인증에서 실패한다면, 낡은 목록 하나가 아니라 서로 무관한 두 문제를 가진 것이다.

모든 노드가 같은 방식으로 실패할 때

첫 단계에서의 보편적 실패는 당신 쪽을 가리킨다——응답할 수 없는 리졸버, 프로토콜을 막는 로컬 방화벽, 웹 트래픽만 허용하는 네트워크 중 하나다. 디렉터리는 그것을 알릴 수 없다, 그 점검이 당신의 자리에서 실행되지 않기 때문이다.

변형된 네트워크의 경우를 일부러 시험하라. 일부 액세스 네트워크는 웹으로 가는 HTTPS만 허용하고 다른 프로토콜은 버리므로, 목록이 정확해도 모든 후보가 죽은 것처럼 보인다. 브라우저의 페이지 로드와 원시 연결 시도를 비교하면 그 두 상황을 일 분도 안 되어 가를 수 있다.

실패가 일어난 단계에서 그 실패를 읽어라

단계가 보이도록 터미널에서 시도를 재현하라. 아래 세 명령은 이름을 해석하고, 포트가 응답하는지 시험하고, OpenVPN 프로필에서 협상 줄을 출력한다:

dig +short node.example.net
curl -s --max-time 5 telnet://node.example.net:443
openvpn --config node.ovpn --verb 4 2>&1 | grep -iE "TLS|AUTH|PUSH"

포트가 응답하고 협상 줄이 인증서 문제를 보고하면 노드는 살아 있고 프로필이 낡은 것이다. 포트가 전혀 응답하지 않으면 그 항목은 실패한 후보이며, 클라이언트를 디버그하는 대신 다음으로 넘어가는 것이 옳은 대응이다. 단계를 짧은 한 줄로 적어 두면, 다음 시도는 희망이 아니라 지식에서 시작된다.

관련 글