Câu trả lời của @ Sven, với bản chỉnh sửa, đã đúng nhưng chỉ cần diễn đạt trực tiếp mọi thứ.
TL; DR có gạch dưới có giá trị trong một CNAME
bản ghi ở cả hai bên, đọc bên dưới để biết lý do.
RFC 1034 và những người khác xác định các bản ghi dựa trên "tên miền" là các nhãn với bất kỳ ký tự nào, bao gồm cả _
.
Nhưng một số bản ghi có các quy tắc chặt chẽ hơn cho tên chủ sở hữu và / hoặc dữ liệu tài nguyên (RDATA). Chỉ có một tên máy chủ sẽ được chấp nhận và thực sự các quy tắc hiện tại (chúng đã được nới lỏng trong quá khứ khi tên máy chủ không thể bắt đầu bằng một chữ số) mà bạn có thể sử dụng bất kỳ chữ cái ASCII nào (không có độ nhạy trường hợp), bất kỳ chữ số ASCII nào và dấu gạch nối , cộng với một số quy tắc vị trí bổ sung: không có dấu gạch ngang khi bắt đầu hoặc kết thúc và không có dấu gạch nối kép ở vị trí 3 và 4 (vì "bảo lưu" đối với IDN ở dạng xn--
chỉ cho phép trường hợp).
Ví dụ: tên chủ sở hữu của một A
hoặc AAAA
bản ghi là tên máy chủ, không phải tên miền. Vì vậy,
test.example.com A 192.0.2.1
là hợp lệ tại sao tất cả những điều này không phải là:
_test.example.com A 192.0.2.1
-test.example.com A 192.0.2.1
test-.example.com A 192.0.2.1
Thật dễ dàng để kiểm tra mọi thứ với named-checkzone
chương trình (một phần của bind
phần mềm máy chủ tên nhưng có thể được sử dụng và cài đặt riêng và các máy chủ tên khác có thể có các công cụ kiểm tra tương tự và dù sao cũng có thể có giao diện trực tuyến), chỉ cần đặt các bản ghi vào một tệp và chạy nó trên:
$ 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)
(số trước IN
là TTL, điều này không liên quan đến vấn đề của chúng tôi ở đây, nhưng chỉ cần để vượt qua xác thực cú pháp của một bản ghi).
Đối với các hồ sơ khác thì ngược lại: vì NS
không có hạn chế nào đối với chủ sở hữu, nhưng hạn chế đối với "mục tiêu" đó là dữ liệu. Dữ liệu chỉ có thể là tên máy chủ, không phải tên miền, vì bạn cần trỏ đến máy chủ tên có thẩm quyền là máy chủ vật lý đáp ứng truy vấn DNS.
Bây giờ CNAME
, đây là những trích dẫn có liên quan từ RFC 1034, trong phần 3.6:
"chủ sở hữu: đó là tên miền nơi RR được tìm thấy." có nghĩa là theo mặc định bất kỳ tên nào, không chỉ là tên máy chủ (như nguồn của bản ghi CNAME)
"RDATA: là loại dữ liệu và đôi khi phụ thuộc vào lớp mô tả tài nguyên:"
"CNAME một tên miền."
Vì vậy, cả chủ sở hữu của một CNAME
(cái ở bên trái của nó) và dữ liệu tài nguyên được đính kèm, đích / mục tiêu của nó (cái ở bên phải của nó) là tên miền và không chỉ tên máy chủ. Về cơ bản bất kỳ nhân vật, vì vậy bao gồm _
được cho phép ở cả hai bên.
Một lần nữa, dễ dàng để kiểm tra với 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.
Không có lỗi gì về CNAME
(các lỗi khác được mong đợi vì trong khu vực giả mạo của tôi, tôi đã không đặt bất kỳ SOA
hoặc NS
hồ sơ nào như một khu vực thực sự sẽ có)