Computer >> Hướng Dẫn Máy Tính >  >> Kết Nối Mạng >> Internet

Hiểu DNS: Tại Sao Domain Root Không Thể Là CNAME Và Cơ Bản DNS Quan Trọng

Bài viết dùng câu hỏi trên khám phá DNS, dig, A record, CNAME record, và ALIAS/ANAME record từ góc độ beginner. Bắt đầu nào.

Đầu Tiên, Một Số Định Nghĩa

  • Domain Name System (DNS): hệ thống tổng thể chuyển domain name dễ nhớ (example.com) thành IP address (93.184.216.34). IP address của server, thường web server, nơi lưu file cần thiết hiển thị webpage.
  • DNS Server (còn gọi name server hoặc nameserver): Dùng DNS software lưu thông tin domain address. Có vài level — ISP, Root (13 worldwide), Top Level Domain (TLD, ví dụ '.com'), và Domain level DNS Servers.
  • Domain name: domain (example) kết hợp TLD (.com). Thuật ngữ 'domain' thường dùng đồng nghĩa domain name, dù khác nhau. Khi mua 'domain' từ registrar/reseller, bạn mua quyền domain name cụ thể (example.com), và subdomain muốn tạo (my-site.example.com, mail.example.com, etc).

Luồng Truy Vấn Cao Cấp

Luồng high-level khi gõ "example.com" vào browser đơn giản hóa bỏ hop ISP, Root, TLD DNS Servers như sau:

Hiểu DNS: Tại Sao Domain Root Không Thể Là CNAME Và Cơ Bản DNS Quan Trọng
Luồng DNS request đơn giản, chi tiết hơn trong detailed flow

Domain thường có hai hoặc nhiều name server, chứa record liên quan domain name (example.com).

Nhiều loại record lưu được, hầu hết có thể multiple entries per type:

  • A: Address record map domain name đến IP address
  • CNAME: Canonical Name Record. Dùng alias một domain name (hoặc subdomain) sang domain khác. Xem chi tiết sau.
  • MX: Mail eXchange record báo email delivery agent deliver email đâu
  • TXT: Text record linh hoạt, lưu string cho nhiều mục đích
  • SOA: Start of Authority record đơn lẻ ở top level domain. Chứa info bắt buộc về domain, ví dụ primary name server
  • NS: Name server associated với domain

Khi device gửi query đến name server, server tìm trong record node của domain A record, và IP address lưu (example.com: 93.184.216.34). Trả về device, dùng request đúng web server lấy webpage/resource.

Dùng 'dig'

dig (domain information groper) là command-line tool query DNS server. Dùng cho troubleshooting, hoặc hiểu setup hệ thống.

$ dig example.com kết quả response dài in terminal, default output chi tiết ở đây, quan tâm ANSWER SECTION.

;; ANSWER SECTION:
example.com. 72703 IN A 93.184.216.34

Vậy example.com trả A record 93.184.216.34. Đôi khi domain có nhiều A record, nếu nhiều web server cung cấp info.

Còn hơn nữa! Thử ví dụ khác, thấy record phổ biến khác: CNAME.

$ dig www.skyscanner.net:

;; ANSWER SECTION:
www.skyscanner.net. 169 IN CNAME www.skyscanner.net.edgekey.net.
www.skyscanner.net.edgekey.net. 5639 IN CNAME e11316.a.akamaiedge.net.
e11316.a.akamaiedge.net. 20 IN A 23.217.6.192
www.skyscanner.net.edgekey.net. 5639 IN CNAME e11316.a.akamaiedge.net.
e11316.a.akamaiedge.net. 20 IN A 23.217.6.192

Dùng flag +short thấy rõ path:

$ dig www.skyscanner.net +short

www.skyscanner.net.edgekey.net.
e11316.a.akamaiedge.net.
23.217.6.192

CNAME

CNAME record cho phép domain name dùng như alias cho canonical (true) domain khác.

Khi DNS server trả CNAME record, không trả về client. Thay vào đó, lookup lại domain name trả về, và lần lượt trả A record IP address. Chuỗi này có thể nhiều CNAME level deep, nhưng chịu minor performance hit từ multiple lookup trước khi caching.

Ví dụ đơn giản: bạn có server lưu ảnh. Thường truy cập photos.example.com. Nhưng cũng muốn cho truy cập photographs.example.com. Cách làm: thêm CNAME record trỏ photographs đến photos. Nghĩa là truy cập photographs.example.com thấy nội dung giống photos.example.com.

Query $ dig photographs.example.com thấy:

photographs.example.com IN CNAME photos.example.com
photos.example.com IN A xx.xxx.x.xxx

Quan trọng: CNAME là phần bên phải. Bên trái là alias name, hoặc label.

Use case phổ biến khác cho subdomain www. Mua example.com chắc cũng muốn user gõ www.example.com thấy cùng nội dung.

Lưu ý example.com gọi là apex, root, hoặc naked domain name.

Option: setup A record khác, trỏ cùng IP với example.com. Hoàn toàn valid, và example.com thật làm vậy, nhưng không scale tốt. nếu cần update IP example.com trỏ đến? Cũng phải update cho www subdomain, và các subdomain khác.

Nếu dùng CNAME record alias www.example.com trỏ example.com thì chỉ cập nhật root domain, vì tất cả node khác trỏ đến nó.

Hạn Chế CNAME

Khi DNS standards viết, quy tắc quản trị dùng. RFC 1912 và RFC 2181 quy định:

  • SOA và NS record bắt buộc ở root domain
  • CNAME record chỉ tồn tại như single record và không combine với resource record khác (DNSSEC SIG, NXT, và KEY RR record trừ)

Điều này loại trừ CNAME dùng ở root domain, vì hai rule противоречит nhau.

Quan trọng: đây là hạn chế contractual, không phải technical. Có thể dùng CNAME ở root, nhưng có thể gây unexpected error, vì vi phạm expected contract behavior.

Ví dụ Cloudflare kể vấn đề gặp với Microsoft Exchange mail server sau khi dùng CNAME ở root domain:

Domain thường chỉ định server xử lý email qua MX Record. Vấn đề Exchange server … có thể pick up CNAME ở root record và không respect đúng CNAME tại MX record. Không thể blame Exchange. Họ hoạt động dưới assumption của DNS specification.

Thấy downside xuất hiện trong server software/library. Vì standard quy định CNAME là record duy nhất tại node, không record khác được lookup. Tất cả record khác bị silently ignore, không warning hay error. Dù MX record set nhận email, MX bị ignore như không tồn tại vì CNAME evaluate first. Tương tự nếu có A record: CNAME ưu tiên và A record không đọc.

Internet Hiện Đại

Tại sao đây là vấn đề? Tại sao bao giờ muốn dùng CNAME cho root domain? Chắc chắn đó là cuối path khi tìm IP web server host content?

Trong internet hiện đại, không còn vậy. Thế giới khác xa khi DNS standards viết.

Bạn có thể chọn Platform as a Service (PaaS) như Heroku lưu content trên web server của họ. Bạn control content, không control infrastructure, PaaS provider lo network maintenance nặng nhọc. Thường cung cấp URL (my-app.herokuapp.com) là subdomain root domain của họ, xem IP web server content. Nhưng hoàn toàn dưới control PaaS provider, thay đổi bất cứ lúc nào không warning.

Scale và tần suất backend change bởi PaaS provider khiến maintain root domain A record trỏ single IP khó khăn. Lý tưởng muốn:

example.com IN CNAME my-app.herokuapp.com.
www.example.com IN CNAME my-app.herokuapp.com.
example.com IN CNAME my-app.herokuapp.com.
www.example.com IN CNAME my-app.herokuapp.com.

Cho phép Heroku (hoặc host provider) manage update A record mà CNAME trỏ đến без thay đổi phía bạn. Tuy nhiên, như biết, vi phạm DNS specification, nên very bad idea.

Có thể implement 301/302 redirect từ example.com đến www.example.com. Tuy nhiên, instruction đó diễn ra trên web server (vẫn vấn đề cần fixed A record DNS trỏ web server đó), hoặc custom DNS provider redirect (gây complication với HTTPS).

Cũng có side effect thay domain thấy trên URL bar, có thể không muốn. Method này dành cho khi website permanently moved, hoặc preserve SEO ranking, không phải giải quyết vấn đề trỏ complex changing backend scalable.

Giải Pháp

Nhiều DNS provider phát triển custom solution workaround vấn đề này, bao gồm:

  • ALIAS tại DNSimple
  • ANAME tại DNS Made Easy
  • ANAME tại easyDNS
  • CNAME (virtual) tại CloudFlare

Đây là virtual record types cung cấp CNAME behavior, không downside. Implementation chính xác khác nhau, nhưng high level khi DNS server thấy virtual record types này, nó act như DNS resolver. Theo dõi chain alias đến khi resolve tại A record (hoặc records) và trả A record này cho DNS server. Điều này 'flatten' CNAME chain vào A record(s) trả về, indistinguishable với query gửi. Query chỉ thấy pure A record, không vi phạm DNS specification, không disadvantage của CNAME.

Virtual records này ngồi cùng record khác ở root không lo unintended behavior. Tùy method DNS resolution provider khi follow CNAME chain, có thể có performance benefit từ caching previous lookup.

Setup DNSimple, config như sau. Giải pháp này có tất cả lợi ích domain name aliasing, không rủi ro dùng ở root level.

example.com IN ALIAS my-app.herokuapp.com.
www.example.com IN CNAME my-app.herokuapp.com.

Cảm ơn đã đọc! 🤔

Như luôn, mở cho correction hoặc additional points.

Tài Nguyên

  • What is a DNS Server
  • Set Up a DNS Name Server
  • DNSimple support pages và ALIAS blog
  • Cloudflare support và CNAME blog
  • dig HowTo
  • Nhiều Stack Overflow hoặc StackExchange post hay
  • Wikipedia entry viết tốt
  • Netlify blog 'To www or not www'