CNAME 레코드에서 _ (밑줄)이 불법입니까?


9

호스팅 업체의 웹 인터페이스에서 DKIM 키에 대한 긴 TXT 레코드를 생성하는 데 문제가 있습니다.

각 줄에는 256자를 사용할 수 있습니다.

우리는 여러 줄을 시도한 다음 ("처음과 ")마지막에 추가를 시도 했습니다 . 둘 다 작동하지 않습니다.

그런 다음 다른 호스트의 레코드에 cname을 작성하여 DKIM TXT 레코드를 작성할 수 있습니다 .

그러나 이제 웹 인터페이스는 CNAME기록 에서 불법적 인 이름에 대해 불평합니다 .

mail._domainkey.example.com TXT확인이
mail._domainkey.example.com CNAME확인되지 않습니다
mail.domainkey.example.com CNAMEOK이지만, 우리가 원하지 않는 것을.

웹 인터페이스가 방금 우리를 미치게하기로 결심 CNAME했습니까?


1
내가 쓰는 동안 공급자가 웹 인터페이스를 수정하고 있습니다!
Lenne

답변:


18

예, DNS 이름 (A / AAAA도 포함)은을 포함 할 수 [0-9], [a-z], -있으므로 밑줄이 유효하지 않습니다. TXT 레코드는 호스트 이름이 아니며이 제한 사항은 적용되지 않습니다. 마지막 편집 : -첫 번째 문자로도 사용 mail.-domainkey.our.dom되지 않을 수 있으므로 유효하지 않습니다.

https://ko.wikipedia.org/wiki/Hostname#Restrictions_on_valid_hostnames


최종 편집 : 부분적으로 잘못되었습니다. CNAME을 호스트 이름으로 사용하는 경우 위 제한이 적용됩니다. CNAME은 DKIM 컨텍스트에서 호스트 이름으로 간주되지 않는 경우 _CNAME 항목의 유효한 부분이어야합니다. /programming/13650233/underscore-in-cname-required-by-ses-not-allowed-by-registrar/26692491#26692491를 참조 하십시오.


그러나 CNAME은 호스트 이름입니까? 일부 문서에서는 cname에서 밑줄을 사용하는 것으로 표시되어 작동합니다. kb.mailchimp.com/accounts/email-authentication/…
Lenne

또한 밑줄은 적어도 Microsoft의 DNS 관리 도구에서 Windows 도메인의 기초가되는 MS Windows Active Directory 통합 영역의 DNS 항목에 표시되지만 밑줄이 실제로 이름의 일부인지, Windows가 DNS의 밑줄을 지원하는지 확실하지 않습니다. 요청 또는 밑줄이 DNS 관리 스냅인에만 나타나고 실제로 이름의 일부가 아닌 경우.
토드 윌콕스

인용 된 Wikipedia 항목은 DNS가 아닌 인터넷 이름과 관련이 있습니다.
Jim B

@ Lenne : CNAME은 호스트의 별칭이므로 유효한 호스트 이름입니다. @ToddWilcox : 그렇습니다. 이것은 알려진 것이며, 이는 불법적이지만 그럼에도 불구하고 다른 시스템이 DNS, DHCP,…
mirabilos

2
@mirabilos "CNAME은 유효한 호스트 이름입니다"아니오, CNAME의 대상 (RDATA)은 호스트 이름이 아닌 도메인 이름입니다 (도메인 이름은 가능한 모든 호스트 이름의 수퍼 세트입니다). _foo CNAME _bar완전히 합법적입니다 named-checkzone.
Patrick Mevzek

2

유효한 문자는 DNS에 허용됩니다. https://tools.ietf.org/html/rfc2181#section-11을 참조 하십시오.

"DNS 자체는 리소스 레코드를 식별하는 데 사용할 수있는 특정 레이블에 대해 하나의 제한 사항 만 적용합니다. 한 가지 제한은 레이블의 길이와 이름과 관련이 있습니다. 한 레이블의 길이는 1에서 63 옥텟으로 제한됩니다. "

클라이언트는 이름 값의 유효성을 검사해야합니다. 예를 들어 MX 레코드에 "Alice"값이 포함될 수 있지만 "Alice"는 유효한 전자 메일 주소가 아니기 때문에 조회 후 해당 값을 거부해야합니다.

이 경우, 호스팅 담당자가 입력을 "확인"하는 것처럼 보이고 수동으로 입력 할 수 있어야합니다.


"DNS에서 유효한 문자는 모두 허용됩니다."그보다 조금 더 복잡합니다. 도메인 이름과 호스트 이름이 있습니다. 달리 언급되지 않는 한, 어느 곳에서나 도메인 이름 인 라벨이 _있습니다. 그러나 일부 레코드의 경우 도메인 이름이 아닌 호스트 이름 만 사용할 수 있습니다. 호스트 이름은 문자 숫자와 하이픈 일뿐입니다. 예를 들어 A또는 AAAA레코드 의 소유자 는 도메인 이름이 아닌 호스트 이름입니다. NS레코드 의 RDATA (대상) 도 도메인 이름이 아닌 호스트 이름입니다.
Patrick Mevzek

1
"MX 레코드에"Alice "값이 포함될 수 있지만 조회 후"Alice "가 유효한 이메일 주소가 아니기 때문에 해당 값을 거부해야합니다." MX RR은 언제 이메일 주소를 참조합니까?
CVn

0

RFC 1034 : 레이블은 ARPANET 호스트 이름 규칙을 따라야합니다. 문자로 시작하고 문자 또는 숫자로 끝나야하며 문자, 숫자 및 하이픈 만 내부 문자로 사용해야합니다. 길이에는 제한이 있습니다. 라벨은 63 자 이하 여야합니다.


또한 일부 라이브러리가 ESP_245537과 같은 호스트 이름을 제공하는 Arduino에 문제가 있습니다. DHCP 서버가 DNS를 업데이트하려고 할 때이 이름이 거부됩니다.
Lenne

이것은 잘못이다. CNAME의 레이블이 반드시 호스트 이름 일 필요는 없으므로를 포함하여 여기에서 모든 문자가 유효합니다 _.
Patrick Mevzek

1
그리고 그것 없이도, 이것은 오래된 규칙입니다. 호스트 이름은 숫자로 시작하는 것을 금지하고 있지만 3com.com예를 들어이 규칙을 완화하기 위해 tools.ietf.org/html/rfc1123#page-13 "호스트 이름 구문의 한 측면이 변경되었습니다. 문자 나 숫자를 허용하도록 완화되었습니다. "
Patrick Mevzek

@Lenne esp_245537호스트 이름으로 사용되는 경우 유효한 호스트 이름이 아니므로 DNS 업데이트를 거부해야합니다. 이것이 도메인 이름으로 사용되는 경우 DNS 업데이트는 유효한 DNS 레이블이기 때문에 성공해야합니다 (그렇지 않으면 버그 임).
Patrick Mevzek

유효하지 않은 문자를 DHCP에서 DNS로 변환 할 수 있지만 작동하지 않는 힌트를 보았습니다.
Lenne

0

편집과 함께 @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했을 진정한 지역처럼 레코드)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.