VPN이 연결되면 DNS64 응답이 왜 달라질까
DNS64 응답은 변환 가정을 부호화한다. 어느 리졸버가 응답했는지, 프리픽스가 라우팅되는지, 경로에 변환기가 있는지 확인한다.
DNS64 응답은 서버의 속성이 아니라 네트워크 배치를 설명한다. 리졸버는 IPv4 주소에서 IPv6 주소를 합성하며, 그 결과는 해당 프리픽스 끝에 변환기가 있는 곳에서만 동작한다. 경로에 VPN을 넣으면 그 배치는 세 가지 조건에 따라 유지되거나, 바뀌거나, 더 이상 참이 아닐 수 있다.
그 조건은 응답한 리졸버, 합성된 프리픽스로 향하는 장치의 경로, 그리고 그 경로에서 무언가가 변환을 수행하는지 여부다. 각각 관찰할 수 있으며, 바로 그것이 장애를 진단 가능하게 만든다.
합성된 AAAA 레코드는 실제로 무엇을 가리키는가
DNS64 리졸버는 IPv4만 있는 이름의 AAAA 질의에 대해 사용하도록 설정된 프리픽스 안에 IPv4 주소를 넣어 응답하며, 그 작업에 쓰이는 잘 알려진 프리픽스는 RFC 6147에 설명된 64:ff9b::/96이다. 레코드는 애플리케이션에 다른 AAAA 레코드와 똑같이 보이며, 그것이 핵심으로, IPv6만 있는 클라이언트는 목적지에 IPv6가 한 번도 없었다는 사실을 모른 채 연결을 시도할 수 있다. 그 연결은 결국 경로 어딘가에서 두 체계 사이를 변환하는 NAT64 기능에 의존한다. 그 변환기가 없으면 합성된 주소는 그럴듯해 보이지만 어디에도 닿지 않는 목적지다.
따라서 레코드는 원래의 IPv4 주소와 변환기에 도달할 수 있다는 가정, 두 가지를 동시에 부호화한다. 응답 자체에서 보이는 것은 첫 번째뿐이다.
세 가지 조건이 여전히 동작하는지를 결정한다
첫 번째 조건은 어느 리졸버가 레코드를 만들었는지로, DNS64가 설정되지 않은 리졸버는 그 이름에 아무것도 반환하지 않고 애플리케이션은 다른 방식으로 실패한다. 두 번째는 응답이 유효해도 그곳으로 가는 길이 없을 수 있으므로, 장치가 합성된 프리픽스로 가는 경로를 가지는지다. 세 번째는 64:ff9b::/96을 다른 곳으로 나르는 터널은 다른 기능에 닿거나 아무 데도 닿지 않으므로, 그 프리픽스를 소유한 변환기가 사용할 경로에 있는지다. 세 가지 모두 터널 전에는 성립하고 후에는 무너질 수 있어서 증상이 갑작스러운 퇴행처럼 보인다.
그 순서대로 확인한다. 응답이 없는 경우와 경로가 없는 경우는 브라우저에서는 똑같이 보이고 리졸버 로그에서는 전혀 다르게 보인다.
리졸버가 바뀌면 응답도 바뀐다
VPN 클라이언트는 흔히 자체 리졸버를 밀어 넣거나 질의 경로 전체를 넘겨받으며, 그 리졸버는 아무것도 합성하지 않을 수 있다. 그러면 IPv4만 있는 이름에 대한 질의는 AAAA 레코드를 반환하지 않고, IPv6만 있는 클라이언트는 그것을 닿을 수 없는 이름으로 겪는다. 반대로 합성하는 리졸버가 터널 경로가 나르지 않는 프리픽스를 줄 수도 있다.
캐시는 이것을 보기 어렵게 만든다. 사무실 네트워크에서 얻은 합성 레코드는 그것을 만든 맥락보다 오래 살아남을 수 있어, 클라이언트는 변환기에 더는 닿을 수 없는 주소로 계속 연결한다. 항목이 저장될 때 응답한 리졸버가 아니라 지금 응답하는 리졸버를 보라. 옛 응답과 새 응답을 기록하지 않고 캐시를 비우면 필요한 증거가 사라진다.
조회와 경로를 따로 시험한다
애플리케이션을 끌어들이기 전에 이름을 직접 질의하고, 어느 서버가 응답했는지 적어 둔다. 아래 명령은 AAAA 레코드, 사용 중인 리졸버, 합성된 프리픽스로 가는 경로의 존재 여부를 보여 준다. 터널을 내린 상태로 실행하고 다시 올린 상태로 실행한다.
dig AAAA ipv4only.example.com +short
dig AAAA ipv4only.example.com | grep -E '^;; SERVER'
ip -6 route get 64:ff9b::c000:0216
curl -6 -sS -o /dev/null -w '%{http_code} %{time_connect}\n' --max-time 8 http://ipv4only.example.com/
결과를 연쇄로 읽는다. AAAA 레코드가 없으면 앞에 있는 리졸버가 합성하지 않는다는 뜻이므로, IPv6만 있는 경로는 그 이름에 대해 동작하지 않으며, 클라이언트가 무엇을 하든 마찬가지다. 레코드가 있는데 경로가 없으면 현재 경로가 프리픽스를 나르지 않는다는 뜻이고, 그것은 리졸버 결함이 아니라 라우팅 결정이다. 경로가 있는데 요청이 여전히 실패하면 변환기 자체를 가리키며, 그것은 또 다른 소유자에게 속한다.
각 결과 옆에 리졸버, 네트워크 맥락, 주소 체계를 기록한다. 다음 비교에서 리졸버 변화와 라우팅 변화를 갈라내게 해 주는 것이 바로 그 기록이다.