Bản ghi CNAME (Canonical Name)
Bản ghi CNAME
Bản ghi CNAME hay “canonical name” là một loại bản ghi DNS được dùng để gán bí danh (alias) hoặc chuyển hướng một tên miền này sang một tên miền khác.
Loại bản ghi này được giới thiệu trong các tài liệu chuẩn ban đầu của DNS (RFC 1034 và RFC 1035) từ năm 1987. Từ đó đến nay, bản ghi CNAME hầu như không thay đổi, vẫn được sử dụng và mang lại hiệu quả cao, hữu ích cho các dịch vụ, ứng dụng trên Internet.
Cú pháp của bản ghi CNAME:
<alias-domain> IN CNAME <canonical domain>
“canonical name” này có thể được xem là đích đến của bản ghi CNAME. Khi một DNS client thực hiện truy vấn đối với tên miền được gán CNAME, nó sẽ nhận được “canonical name”. Sau đó, tất cả các DNS client sẽ tiếp tục thực hiện truy vấn đối với
“canonical name” này và thêm kết quả thu được vào tập hợp các bản ghi DNS được trả về cho ứng dụng.
CNAME được hỗ trợ rộng rãi và phổ biến. Mọi phần mềm DNS (client và server) đều bắt buộc phải hỗ trợ đầy đủ bản ghi CNAME trong quá trình triển khai.
Chúng có thể tra cứu bản ghi CNAME cho một zone tên miền bằng các công cụ kiểm tra CNAME (CNAME checker).
CNAME từ www trỏ về tên gốc của zone
Một cách sử dụng phổ biến của bản ghi CNAME là để cho tên “www” trong một zone tên miền trỏ về cùng bản ghi với tên gốc của zone. Hãy cùng xem ví dụ sau sử dụng zone tên miền cho vnnic.vn:
vnnic.vn. 3600 SOA dns1. vnnic.vn. ( ... )
vnnic.vn. 3600 A 10.0.0.1
vnnic.vn. 3600 A 10.0.0.2
vnnic.vn. 3600 A 10.0.0.3
www. vnnic.vn. 3600 CNAME vnnic.vn.Trong ví dụ này, zone tên miền chứa một bản ghi SOA và ba bản ghi địa chỉ IPv4 (bản ghi A). Những bản ghi như NS cũng tồn tại trong zone nhưng được lược bỏ trong ví dụ cho ngắn gọn. Website vnnic.vn được lưu trữ trên ba địa chỉ IP này để đảm bảo tính dự phòng.
Thông thường, www.vnnic.vn cũng cần trỏ đến cùng ba địa chỉ IP trên. Điều này giúp người dùng có thể truy cập website bằng cả vnnic.vn và www.vnnic.vn một cách linh hoạt.
Để đạt được điều đó, quản trị hệ thống DNS có thể sao chép các bản ghi A sang tên miền www.vnnic.vn, nhưng việc sao chép dữ liệu là bất tiện và tiềm ẩn rủi ro. Nếu chỉ cập nhật một phía mà quên bên còn lại, người dùng có thể gặp lỗi hoặc kết quả không nhất quán.
Việc sao chép dữ liệu sẽ nhanh chóng trở nên phức tạp. Có thể có nhiều hơn ba bản ghi A, có thể thêm bản ghi AAAA cho IPv6, và nhiều tên miền phụ khác cũng sử dụng CNAME – từ đó, lượng dữ liệu cần đồng bộ thủ công sẽ rất lớn.
Thay vì sao chép, cách tốt hơn là sử dụng bản ghi CNAME tại www.vnnic.vn trỏ đến vnnic.vn. Khi đó, mọi thay đổi ở bản ghi địa chỉ tại vnnic.vn sẽ tự động áp dụng cho việc phân giải tên miền www.vnnic.vn. Điều này đơn giản, hiệu quả và loại bỏ nguy cơ lỗi do sao chép dữ liệu không nhất quán.
Gán nhiều tên miền DNS trên cùng một máy chủ web
Việc sử dụng cùng một “canonical name” nhiều lần trong một zone tên miền cũng là điều phổ biến.
Trong ví dụ dưới đây, các tên miền portal.vnnic.vn và customerservice.vnnic.vn đều được phân giải về tên của một máy chủ backend, máy chủ này có nhiều bản ghi địa chỉ để đảm bảo tính dự phòng. Nếu bất kỳ bản ghi địa chỉ nào của máy chủ được thay đổi, thì cả portal.vnnic.vn và customerservice.vnnic.vn sẽ tự động phân giải đến các địa chỉ mới thông qua các bản ghi CNAME tương ứng.
Một zone có thể chứa hàng chục, hàng trăm, thậm chí hàng ngàn bản ghi CNAME tương tự để ánh xạ nhiều tên miền DNS đến cùng một máy chủ hoặc một điểm dịch vụ.
server.vnnic.vn. 3600 A 10.0.0.10
server.vnnic.vn. 3600 A 10.0.0.11
server.vnnic.vn. 3600 AAAA 2000::1
server.vnnic.vn. 3600 AAAA 2000::2
portal.vnnic.vn. 3600 CNAME server.vnnic.vn.
customerservice.vnnic.vn. 3600 CNAME server.vnnic.vn.Việc cấu hình như vậy giúp giảm thiểu lỗi do trùng lặp dữ liệu, dễ dàng bảo trì và linh hoạt trong việc cập nhật thông tin hệ thống. Đây là một giải pháp hiệu quả và chuẩn hóa trong quản lý DNS cho các hệ thống có quy mô lớn hoặc nhiều dịch vụ phụ thuộc.
CNAME đến các tên miền ở bên ngoài
Các bản ghi CNAME không bị giới hạn chỉ hoạt động trong một zone tên miền duy nhất. “canonical name” – tức đích đến của bản ghi CNAME – có thể thuộc bất kỳ zone tên miền nào trong hệ thống tên miền.
Ví dụ, một tổ chức có thể thuê bên thứ ba để cung cấp dịch vụ máy chủ, và cấu hình để chuyển hướng lưu lượng từ tên “www” trong zone của họ đến hostname của nhà cung cấp dịch vụ nằm trong một zone tên miền hoàn toàn khác. Tuy nhiên, cần lưu ý rằng điều này sẽ ảnh hưởng đến chứng chỉ SSL nếu sử dụng giao thức HTTPS.
Các giới hạn đối với bản ghi CNAME
Có một số giới hạn khi sử dụng bản ghi CNAME. Giới hạn đầu tiên là quan trọng nhất: không được phép tồn tại bất kỳ bản ghi DNS nào khác tại cùng tên với bản ghi CNAME. Ngoại lệ duy nhất là các bản ghi DNSSEC như NSEC và RRSIG.
Vì lý do này, một bản ghi CNAME không bao giờ được sử dụng cho tên gốc của zone tên miền (apex zone), vì luôn tồn tại các bản ghi khác như SOA và NS cho tên gốc của zone tên miền đó. Một số tính năng đặc thù của nền tảng DNS, như “CNAME flattening” và bản ghi “alias”, có thể giúp loại bỏ giới hạn này.
Quy tắc này cũng áp dụng với chính bản ghi CNAME: chỉ được phép tồn tại duy nhất một bản ghi CNAME cho một tên miền bất kỳ trong DNS. RFC 2181 mô tả rất rõ ràng các giới hạn đối với CNAME và làm rõ một số khía cạnh khác của hệ thống DNS.
Dưới đây là ba ví dụ khác nhau về các bản ghi CNAME không hợp lệ. Không ví dụ mẫu nào trong số này được phép xuất hiện trong hệ thống DNS.
; CNAME không hợp lệ trong zone tên miền
example.vn. 3600 SOA ns1.example.vn. ...
example.vn. 3600 CNAME server1.example.vn.
; Hai bản ghi CNAME cho cùng một tên miền — cũng không hợp lệ
alias1.example.vn. 3600 CNAME server1.example.vn.
alias1.example.vn. 3600 CNAME server2.example.vn.
; CNAME không hợp lệ - cùng tên miền với bản ghi MX
mail.example.vn. 3600 MX 10 mailserver.example.vn.
mail.example.vn. 3600 CNAME mailserver.example.vn.
Một giới hạn khác là: “canonical name” hoặc đích đến của bản ghi CNAME, phải là một tên máy chủ DNS hợp lệ. Điều này là do hệ thống DNS phải hoạt động độc lập với tầng truyền tải (transport layer). Ví dụ dưới đây sẽ không hoạt động đúng, vì các DNS client sẽ hiểu 1.2.3.4 là một tên máy chủ DNS theo nghĩa đen, thay vì địa chỉ IP:
alias1.example.vn. 3600 CNAME 1.2.3.4
Ngoài ra, theo RFC 2181 (phần 10.3), các bản ghi loại MX và NS bị cấm sử dụng CNAME làm đích đến. Hai ví dụ dưới đây đều không hợp lệ. Dù đôi khi quy tắc này bị vi phạm, nhưng điều đó là không nên. Việc phân giải email và DNS cho tên miền có thể không hoạt động đúng trong mọi trường hợp:
; Không hợp lệ: tên máy chủ mail không được trỏ đến CNAME
mail.example.vn. 3600 MX 10 mailserver.example.vn.
mailserver.example.vn. 3600 CNAME server.example.vn.
; Không hợp lệ: tên máy chủ DNS không được trỏ đến CNAME
ns1.example.vn. 3600 NS nameserver.example.vn.
nameserver.example.vn. 3600 CNAME server.example.vn.
CNAME và hiệu năng
Các bản ghi CNAME cũng có thể được liên kết với nhau thành chuỗi. Trong các ví dụ ở trên, ta thấy một tên miền của máy chủ DNS được ánh xạ (alias) đến một tên miền khác thông qua một bản ghi CNAME duy nhất, nhưng “canonical name” của bản ghi CNAME cũng có thể là một bản ghi CNAME khác — và cứ tiếp tục như vậy. Việc gặp các chuỗi CNAME gồm 4 hoặc 5 bản ghi, mỗi bản ghi thuộc các zone tên miền khác nhau, không phải là điều hiếm gặp.
Các chuỗi CNAME dài tuy hợp lệ, và các trình phân giải DNS (DNS resolver) sẽ cố gắng đưa thêm các bản ghi bổ sung vào phản hồi để giảm thiểu tác động tới hiệu năng, nhưng nhìn chung, chuỗi CNAME dài không phải là cách thiết lập tối ưu. Nó có thể mất nhều thời gian cho quá trình phân giải DNS (DNS roundtrip), và độ phức tạp của các chuỗi CNAME dài có thể khiến việc phân giải DNS trở nên khó khăn và không ổn định. Tốt nhất nên giới hạn chuỗi CNAME ở mức 2 hoặc 3 bản ghi.
Một số nhà cung cấp DNS, chẳng hạn như Cloudflare, cung cấp các tính năng giúp giảm bớt chuỗi CNAME và bổ sung các chức năng liên quan khác, ví dụ như CNAME flattening của Cloudflare. Tính năng này còn cho phép người dùng sử dụng chức năng tương đương với CNAME ngay tại zone tên miền, mà không vi phạm bất kỳ RFC DNS nào.
Nhìn chung, việc đặt TTL dài cho các bản ghi CNAME là điều nên làm, vì “canonical name” thường không thay đổi thường xuyên. Nên đặt giá trị TTL=3600 (1 giờ) là hợp lý trong hầu hết các trường hợp. Các trình phân giải DNS sẽ lưu vào bộ nhớ đệm bản ghi CNAME và các bản ghi địa chỉ (A/AAAA) của “canonical name” một cách độc lập. Thực tế phổ biến là đặt TTL ngắn hơn cho bản ghi địa chỉ so với bản ghi CNAME, bởi vì địa chỉ IP thường thay đổi nhiều hơn so với các ánh xạ tên.
Các lỗi thường gặp với CNAME
Một điểm quan trọng cần lưu ý là bản ghi CNAME chỉ cho phép chuyển hướng ở cấp độ DNS từ một tên máy chủ này sang tên máy chủ khác. Bản ghi CNAME không thể chứa URL, mà chỉ chứa tên máy chủ. Chức năng chuyển hướng HTTP thường thấy, vốn được triển khai trong các dịch vụ web, hoạt động hoàn toàn độc lập với DNS.
Một vấn đề thú vị khác liên quan đến bản ghi CNAME là việc tạo ra vòng lặp CNAME rất dễ xảy ra. Điều này có thể là vô tình, hoặc có thể do kẻ xấu cố tình thực hiện như một phần của tấn công DDoS nhằm tiêu tốn tài nguyên của các resolver và gây ra gián đoạn dịch vụ DNS. Vì các DNS resolver phải lần theo từng bản ghi CNAME liên tiếp, điều này có thể tạo nên vòng lặp vô hạn mà về mặt kỹ thuật.
Có thể tạo ra vòng lặp bằng hai hoặc nhiều bản ghi CNAME, ví dụ:
; Vòng lặp CNAME với hai bản ghi: 1 -> 2 -> 1 -> 2 -> 1 ...
alias1.example.vn. 3600 CNAME alias2.example.vn.
alias2.example.vn. 3600 CNAME alias1.example.vn.
; Vòng lặp CNAME với ba bản ghi: 1 -> 2 -> 3 -> 1 ...
alias1.example.vn. 3600 CNAME alias2.example.vn.
alias2.example.vn. 3600 CNAME alias3.example.vn.
alias3.example.vn. 3600 CNAME alias1.example.vn.Một biến thể phức tạp hơn nữa là các chuỗi CNAME được liên kết qua nhiều zone khác nhau, điều này về mặt lý thuyết có thể khiến DNS resolver phải làm việc vất vả hơn nhiều. Vòng lặp CNAME, dù là do vô tình hay cố ý, đều là vấn đề đã được hiểu và xác định rõ hiện nay. Tất cả các trình phân giải DNS hiện đại đều có cơ chế phát hiện vòng lặp CNAME, và sẽ từ chối truy vấn bằng cách loại bỏ truy vấn hoặc trả về lỗi DNS SERVFAIL khi phát hiện vòng lặp.
Các lựa chọn thay thế cho CNAME
Khả năng tạo bí danh cho một tên miền này với tên miền khác là vô cùng hữu ích. Các giải pháp lựa chọn có thể thay thế bản ghi CNAME, bao gồm:
DNAME: Đây là một loại bản ghi DNS dùng để chuyển hướng toàn bộ các tên miền con (subdomain) tới một tên miền khác. Bản ghi này hoạt động tương tự như bản ghi CNAME (Canonical Name), nhưng thay vì chỉ chuyển hướng một tên miền cụ thể, nó có thể chuyển hướng một nhóm tên miền con.
ANAME: Đây là một bản ghi DNS không chính thức nhưng ngày càng được sử dụng trong các dịch vụ DNS hiện đại, đặc biệt là trong các hệ thống quản lý DNS như DNSimple hoặc Cloudflare.
Tìm bản ghi CNAME
Bản ghi CNAME của một tên miền có thể được truy vấn bằng các công cụ dòng lệnh như dig hoặc nslookup. Để tìm bản ghi CNAME cho www.vnnic.vn, sử dụng lệnh sau:
dig CNAME www.vnnic.vn
Trên các hệ điều hành hỗ trợ nslookup, chúng ta có thể sử dụng lệnh sau:
nslookup -type=cname www.vnnic.vn