요약

  • RFC 3403은 DDDS 규칙을 DNS NAPTR 레코드에 저장했지만, 응답에 나타난 레코드의 순서가 곧 규칙 순서는 아니었다. 클라이언트는ORDER를 기준으로 정렬하고,PREFERENCE는 동일한 권한 계층에 속한 레코드 사이에서만 사용해야 했다.
  • 규칙이 한번 일치하면, 클라이언트는 다른 레코드가 먼저 도착했거나 익숙한 서비스를 제공한다는 이유만으로 다른ORDER로 넘어갈 수 없었다. 선택적 Additional 데이터, 유효한 DNSSEC, 성공한 터미널 조회는 각각 별개의 증거로 남았다.

DNS 응답은 목록처럼 보일 수 있다. 레코드는 전송 선상에서, 패킷 캡처에서, 진단 출력에서 차례로 나열된다. RFC 3403은 DDDS 클라이언트가 이 시각적 암시에 저항하도록 요구했다. NAPTR 레코드 집합은 도착 순서대로의 프로그램이 아니었다. 프로그램은 레코드 내부의 필드로부터 재구성되어야 했다.

2002년 10월 Standards Track으로 발표된 RFC 3403은 도메인 네임 시스템을 DDDS 규칙 데이터베이스로 정의했다. 데이터베이스 키는 유효한 DNS 도메인 이름이었고, 클라이언트는 그 이름을 조회하여 NAPTR 리소스 레코드(타입 코드 35)로 후보 규칙을 받았다. 이 문서는 RFC 2915와 RFC 2168을 대체하며 NAPTR의 공식 명세가 되었다.

ORDER필드는 위임 순서를 복원했다. 낮은 값이 높은 값보다 먼저 처리되었다. 동일한ORDER를 공유하는 두 레코드는 서로 다른 서비스나 전송을 제공하더라도 권한 목적상 하나의 규칙으로 취급되었다. 일치가 발견되면 클라이언트는 DDDS 알고리즘이 정의한 명시적 복합 서비스 선택 예외를 제외하고 다른ORDER로 계속 나아갈 수 없었다.

이 규칙은 도착 순서를 증거적으로 약하게 만들었다. 서버, 캐시, 라이브러리, 패킷 경로는 의미를 바꾸지 않은 채 RRset을 다른 순서로 제시할 수 있었다. 단순히 처음 본 익숙한 Services 조합을 받아들이는 클라이언트는 영역 관리자가 정렬해둔 규칙 구조를 전송상의 우연으로 조용히 대체해버린다.

PREFERENCE는 더 낮은 수준에서 작동했다. DDDS 알고리즘의 Priority에 해당하며, 동일한ORDER를 가진 대안들을 가장 낮은 값부터 정렬했다. 클라이언트는 선호되는 프로토콜에 대한 지원이 부족하다 같은 이유로 덜 선호되는 대안을 고려할 수 있었다. 그러나 그 유연성을 일치 이후 다른ORDER로 권한 경계를 넘는 데 쓸 수는 없었다.

RFC 3403은 또한PREFERENCE에 부하 분산 역할을 부여하지 않았다. 이는 권한 관점에서 동등하게 취급되는 규칙들 사이의 품질이나 선호를 전달한다. 응용이 그 외에 동등한 서비스들 사이에서 트래픽을 분산해야 한다면, DNS는 이미 SRV나 복수의 A 레코드 같은 메커니즘을 제공한다. 선호를 가중치처럼 다루는 것은 레코드에 존재하지 않는 무작위화 계약을 발명하는 일이다.

각 NAPTR에는 Flags, Services, REGEXP, REPLACEMENT가 담겼다. Flags와 Services는 데이터베이스 명세에서 보편적 의미를 갖지 않았다. 짝을 이루는 응용 명세가 이를, 어떤 플래그가 터미널인지까지 포함해 정의해야 했다. 클라이언트가 그 글자들을 인식한다고 해서 해당 응용을 이해한다는 증거는 되지 않았다.

REGEXP와 REPLACEMENT는 함께 DDDS 치환 식을 나타내지만, 서로 배타적인 형태였다. REGEXP는 원래의 응용 문자열에 적용되는 표현식을 담았고, REPLACEMENT는 단순 치환을 위한 완전한 도메인 이름을 담으며 DNS 이름 압축을 금지했다. 두 필드를 모두 채우는 레코드는 오류였으며 무시되거나 오류를 발생시켜야 했다.

이 문법은 관리와 실행 사이에 두 번째 순서 문제를 만들었다. 영역 파일은 백슬래시 이스케이프를 사용하지만, 클라이언트가 받는 표현식은 DNS 마스터 파일 구문 분석 이후의 결과를 담는다. RFC 3403은 백슬래시가 응답에 한 번 나타나려면 보통 두 번 입력해야 한다고 경고했다. 영역 파일 소스만 보거나 패킷만 보는 운영자는 그 사이의 변환을 놓칠 수 있다.

텍스트 해석도 중요했다. NAPTR의 문자 필드는 UTF-8을 사용했다. ASCII와 동등한 범위 밖에서 치환은 입력을 바이트의 연속이 아니라 코드 포인트로 다루어야 했다. 표현식은 특정 POSIX 로캘에 의존할 수 없었는데, 클라이언트의 로캘에 따라 의미가 달라지는 규칙은 보편적으로 적용될 수 없게 되기 때문이다.

데이터베이스는 두 개 이상의 DDDS 응용을 함께 호스팅할 수 있어 충돌 위험이 있었다. RFC 3403은 세 가지 경계를 제시했다: 응용들을 별도의 영역에 두거나, 표현식을 응용을 구별하는 입력에 고정하거나, 응용 고유의 Flags와 Services에 의존하여 무관한 규칙을 무시하는 것이다. 하나의 DNS 이름에 레코드를 함께 두는 것만으로 그것들이 하나의 응용이 되지는 않았다.

Additional 섹션 처리는 최적화이지 의존성이 아니었다. 서버는 답변과 동일한 인증 상태를 지닌 관련 A 또는 SRV RRset을 붙일 수 있었고, 응용은 그것을 사용할 수 있었다. 그러나 모든 응용은 Additional 데이터를 전혀 제공하지 않는 네임서버에서도 작동해야 했다. 따라서 그 부재는 “NAPTR 답변이 불완전하다”가 아니라 “다음 질의를 수행하라”를 의미했다.

TTL은 재사용을 제약했다. 클라이언트가 나쁜 위임 경로나 서버 장애 이후 이전에 가져온 규칙으로 폴백할 경우, 의존하는 모든 레코드가 여전히 유효한지 확인해야 했다. 단 하나의 규칙이라도 만료되면 DDDS 알고리즘을 처음부터 다시 시작해야 했다. 새로운 NAPTR과 만료된 이전 규칙을 조합하면 한 시점에 동시에 존재한 적이 없는 정렬된 프로그램이 만들어진다.

조회 실패에 관한 RFC의 조언은 의도적으로 보수적이었다. 재작성이 실패한 조회로 이어진 후, 클라이언트는 다른 재작성 경로로 되돌아가 추진하기보다 실패를 보고하도록 강력히 권고되었다. 백트래킹은 결정론적인 위임 그래프를 기회주의적 탐색 트리처럼 동작하게 만들고, 경로가 실패한 권한 지점을 가릴 수 있었다.

DNSSEC은 NAPTR을 다른 DNS 레코드처럼 서명하고 검증할 수 있었다. 이는 DNSSEC 체인 아래에서 DNS 데이터의 진정성 속성을 확립한다. 그러나 정규 표현식이 안전하다는 것, 클라이언트가 올바르게 정렬한다는 것, Services가 의도된 응용과 일치한다는 것, 하류 엔드포인트가 동작한다는 것은 증명하지 않았다. RFC 3403은 표현식을 임의 코드를 실행할 수 있는 환경에 무분별하게 넘기지 말라고 별도로 경고했다.

IANA DNS Parameters 레지스트리는 여전히 NAPTR을 리소스 레코드 타입 35로 기록하고 있다. 이는 조율된 할당의 증거이지 올바른 처리나 배포의 증거는 아니다. RFC Editor는 현재 하나의 편집 정오표(ID 2868)를 문서 갱신 보류 상태로 등재하고 있다. 이는 Services 설명의 중복된 단어를 제거하는 것이며, 순서 의미론은 전혀 바꾸지 않는다.

따라서 운영상의 접수 기록은 질의 키, 완전한 RRset, DNSSEC 상태, TTL, 패킷 순서, 정렬된ORDER그룹, 그룹 내PREFERENCE, Flags, Services, REGEXP 또는 REPLACEMENT 유효성, UTF-8 해석, 영역 파일에서 전송선까지의 표현식, 서비스 거부, 선택된 레코드, 실제 사용된 Additional 데이터, 다음 질의, 터미널 소비자의 결과를 보존해야 한다.

Lu Heng의 Minimum Initial Specification 원칙은 이 구분을 설명한다. RFC 3403은 DNS 표현과 처리의 최소 경계를 표준화했고, 응용들은 각자의 서비스 의미를 유지했다. Running-Code Primacy가 그 증명을 제공한다: 반환된 RRset을 섞고, Additional 데이터를 생략하고, 클라이언트 로캘을 바꾸고, 의존성 하나를 만료시킨 뒤 선택된 규칙을 비교하라. 준수하는 결과는 표시 방식이 아니라 권한 필드를 따라야 한다.

RFC 3403은 DNS 전송이 순서를 공급했다고 주장하지 않으면서 DNS 집합을 정렬된 행위로 바꾸었다. 패킷의 첫 레코드는 단지 처음 본 레코드였을 뿐이다. 첫 번째 규칙은 계약이 먼저 온다고 말한 규칙이다.

출처