편집과 함께 @Sven의 대답은 이미 옳았지만 직접 문구를 표현하는 것입니다.
TL; DR 예 밑줄이 CNAME
양쪽 레코드 모두 에서 유효합니다 . 이유를 보려면 아래를 읽으십시오.
RFC 1034 및 기타는 "도메인 이름"을 기반으로하여 모든 문자가 포함 된 레이블 인 레코드를 정의합니다 _
.
그러나 일부 레코드에는 소유자 이름 및 / 또는 리소스 데이터 (RDATA)에 대해보다 엄격한 규칙이 있습니다. 호스트 이름 만 허용되며 실제로 규칙은 이제 ASCII 문자 (대소 문자 구분 안 함), ASCII 숫자 및 하이픈을 사용할 수있는 규칙이 완화되었습니다 (이전에는 호스트 이름이 숫자로 시작할 수 없었습니다). , 추가 위치 규칙 : 시작 또는 끝에 하이픈 없음 및 위치 3 및 4에 이중 하이픈 없음 ( xn--
대소 문자 만 허용되는 IDN의 "예약"때문에 ).
예를 들어 A
또는 AAAA
레코드 의 소유자 이름은 도메인 이름이 아닌 호스트 이름입니다. 그래서
test.example.com A 192.0.2.1
이 모든이없는 이유는 유효합니다 :
_test.example.com A 192.0.2.1
-test.example.com A 192.0.2.1
test-.example.com A 192.0.2.1
프로그램을 사용하여 쉽게 테스트 할 수 있습니다 (이름 서버 소프트웨어의 named-checkzone
일부 bind
이지만 별도로 사용 및 설치 될 수 있으며 다른 이름 서버에는 유사한 검사 도구가있을 수 있으며 온라인 인터페이스가있을 수도 있습니다). 파일에 레코드를 넣고 실행하십시오. 그것에 :
$ cat z1.txt
test.example.com. 1 IN A 192.0.2.1
_test.example.com. 1 IN A 192.0.2.1
-test.example.com. 1 IN A 192.0.2.1
test-.example.com. 1 IN A 192.0.2.1
$ /usr/local/sbin/named-checkzone example.com z1.txt
z1.txt:2: _test.example.com: bad owner name (check-names)
z1.txt:3: -test.example.com: bad owner name (check-names)
z1.txt:4: test-.example.com: bad owner name (check-names)
(이전의 숫자 IN
는 TTL이며, 이것은 우리의 문제와 관련이 없지만 레코드의 구문 유효성 검사를 통과하는 데 필요합니다).
다른 레코드의 경우 반대입니다. NS
소유자에 대한 제한은 없지만 데이터 인 "대상"에 대한 제한이 있기 때문입니다. DNS 쿼리에 응답하는 물리적 호스트 인 신뢰할 수있는 네임 서버를 가리켜 야하기 때문에 데이터는 도메인 이름이 아닌 호스트 이름 일 수 있습니다.
이제 CNAME
섹션 3.6의 RFC 1034 관련 인용문이 있습니다.
"소유자 : RR이있는 도메인 이름입니다." 이는 기본적으로 호스트 이름뿐만 아니라 모든 이름을 의미합니다 (CNAME 레코드의 소스로).
"RDATA : 자원을 설명하는 유형이며 때로는 클래스 종속 데이터입니다."
"CNAME 도메인 이름."
따라서 CNAME
(왼쪽에 있는) 소유자 와 그에 연결된 리소스 데이터, 대상 / 대상 (오른쪽에있는)은 모두 도메인 이름이며 호스트 이름 만 아닙니다. 기본적으로 모든 문자가 포함되므로 _
양쪽에 모두 허용됩니다.
다시 한번, named-checkzone
다음 과 같이 쉽게 테스트 할 수 있습니다 .
$ cat z2.txt
_foo 1 CNAME _bar
$ /usr/local/sbin/named-checkzone example.com z2.txt
zone example.com/IN: has 0 SOA records
zone example.com/IN: has no NS records
zone example.com/IN: not loaded due to errors.
[정보] 어떠한 오류가 없다 CNAME
(내 가짜 영역에서 내가 어떤 넣지 않았기 때문에 다른 오류 예상 SOA
이나 NS
했을 진정한 지역처럼 레코드)