DNS record types & debug — A, CNAME, MX và dig
Các bản ghi DNS A, AAAA, CNAME, MX, TXT, NS làm gì; đọc resolv.conf và /etc/hosts; tra bằng dig và nslookup; chẩn đoán NXDOMAIN, SERVFAIL và chuỗi CNAME.
TL;DR: Một domain mang nhiều bản ghi (record), mỗi loại một vai trò: A (tên → IPv4), AAAA (IPv6), CNAME (bí danh trỏ tên khác), MX (mail server), TXT (xác thực/cấu hình), NS (authoritative server, tức ai được uỷ quyền trả lời cho cả zone). Mỗi record vẫn mang TTL và được cache như bài trước. dig và nslookup là công cụ tra; đọc section ANSWER của dig là chính. Khi tên không phân giải được: NXDOMAIN (không tồn tại), SERVFAIL (resolver lỗi), hoặc kết quả rỗng. Máy chọn resolver theo /etc/resolv.conf, và /etc/hosts ghi đè DNS.
Chạy dig google.com MX hay dig github.com, bạn thấy nhiều dòng khác nhau: A, CNAME, MX… Mỗi loại làm một việc. Khi một tên miền không phân giải được, biết lỗi ở đâu (domain sai, resolver hỏng, hay cache bẩn) mới là phần khó.
Bài này là phần "thực chiến" của DNS: đọc các loại record, dùng dig/nslookup, và chẩn đoán lỗi phân giải tên.
1. Analogy — danh bạ công ty
Tra một công ty trong danh bạ, bạn không nhận về một con số duy nhất mà cả một trang: địa chỉ văn phòng, phòng nhận thư, số lễ tân. Mỗi dòng trả lời một câu hỏi khác nhau, và người giao hàng chỉ cần địa chỉ, người gửi thư chỉ cần phòng thư. DNS record cũng vậy: cùng một tên miền, mỗi loại record là một dòng trong trang danh bạ đó, trả lời đúng một câu hỏi.
| Danh bạ công ty | DNS record |
|---|---|
| Địa chỉ văn phòng | A (IPv4) |
| Địa chỉ văn phòng ghi theo chuẩn mới | AAAA (IPv6) |
| "Công ty X giờ đổi tên, tra tên mới" | CNAME |
| Phòng nhận thư | MX |
| Lễ tân được uỷ quyền trả lời về chi nhánh | NS |
Giờ xem từng dòng trong trang danh bạ đó ứng với record nào.
2. Các loại record thường gặp
| Record | Trỏ tới | Dùng để |
|---|---|---|
| A | IPv4 (vd 93.184.216.34) | tên miền → địa chỉ IPv4 |
| AAAA | IPv6 | tên miền → địa chỉ IPv6 |
| CNAME | một tên khác | bí danh: www → example.com |
| MX | mail server + ưu tiên | định tuyến email của domain |
| TXT | chuỗi văn bản | xác thực domain (SPF, DKIM, verify) |
| NS | authoritative server | chỉ ai phụ trách domain |
A/AAAA là cái bạn gặp nhiều nhất (trình duyệt cần IP). CNAME hay dùng để trỏ subdomain về một dịch vụ (vd trỏ app.bạn.com về một host của nhà cung cấp).
Thử ngẫmmột domain có A record nhưng không có MX. Gửi email tới contact@ domain đó thất bại — record nào đang thiếu, và trình duyệt truy cập domain đó có bị ảnh hưởng không?
3. Đọc dig — section ANSWER là chính
dig example.com
# ;; ANSWER SECTION:
# example.com. 3600 IN A 93.184.216.34
# ^TTL ^record ^gia tri
Mỗi dòng ANSWER: tên TTL class loại giá trị. Vài cách dùng nhanh:
dig example.com +short # chi gia tri (gon)
dig example.com MX # tra record loai MX
dig example.com NS # ai la authoritative
dig @1.1.1.1 example.com # hoi resolver cu the (Cloudflare)
nslookup example.com là công cụ thứ hai, có sẵn cả trên Windows:
nslookup example.com
# Server: 1.1.1.1
# Address: 1.1.1.1#53
#
# Non-authoritative answer:
# Name: example.com
# Address: 93.184.216.34
Hai dòng đầu là resolver máy bạn đang hỏi. "Non-authoritative answer" nghĩa là câu trả lời do recursive resolver đó đưa (thường lấy từ cache của nó), không phải từ authoritative server của example.com; muốn câu trả lời gốc thì dig example.com NS rồi hỏi thẳng server đó bằng dig @a.iana-servers.net example.com. nslookup gọn nhưng ít chi tiết (không có TTL, không có status), nên dân debug thường ưu tiên dig. Resolver ở hai dòng đầu (Server: 1.1.1.1) đọc từ một file cấu hình trên máy bạn.
4. resolv.conf & /etc/hosts
Máy quyết định hỏi resolver nào và tên nào bỏ qua DNS:
/etc/resolv.conf: liệt kênameserver(recursive resolver máy sẽ hỏi) vàsearchdomain (tự thêm hậu tố cho tên ngắn)./etc/hosts: bảng tĩnhIP tênđược tra trước DNS. Nhờ nó mà127.0.0.1 localhostchạy không cần DNS, và nó cũng là cách ghi đè tạm một domain về IP tuỳ ý khi test.
cat /etc/resolv.conf # nameserver 8.8.8.8 ...
cat /etc/hosts # 127.0.0.1 localhost
Khi hai file này đúng chỗ mà tên vẫn không ra IP, dig nói lý do ở trường status.
5. Chẩn đoán lỗi phân giải — lỗi nằm ở đâu?
Khi một tên không ra IP, thông điệp dig cho biết lý do (trường status):
| Triệu chứng | Nghĩa | Hướng xử lý |
|---|---|---|
status: NXDOMAIN | Tên không tồn tại | Sai chính tả domain / chưa đăng ký / sai search domain |
status: SERVFAIL | Resolver lỗi khi tra | Resolver/authoritative trục trặc, hoặc DNSSEC (cơ chế ký số xác thực bản ghi DNS) không xác minh được; thử resolver khác |
ANSWER rỗng nhưng NOERROR | Tên có nhưng không có record loại đang hỏi | Hỏi đúng loại (vd domain không có MX) |
| Phân giải sai/cũ | Cache còn bản cũ | Chờ TTL hết, hoặc test resolver khác @1.1.1.1 |
Quy trình: dig tên +short xem có ra IP không; nếu không, dig tên đọc status; rồi dig @1.1.1.1 tên để loại trừ resolver nội bộ; cuối cùng kiểm tra /etc/hosts và search domain.
Thử ngẫmđồng nghiệp báo domain sản phẩm mới trả NXDOMAIN trên máy họ nhưng bạn dig ra IP bình thường. Bước tiếp theo trong quy trình chẩn đoán ở trên là gì?
6. CNAME chaining — coi chừng vòng và tầng
CNAME trỏ tên này sang tên khác; resolver phải tra tiếp tên đích:

Mỗi tầng CNAME là một bước tra thêm (chậm hơn) và nếu cấu hình sai có thể tạo vòng lặp hoặc trỏ tới tên không có A record. Giữ chuỗi CNAME ngắn.
7. Pitfall — hiểu nhầm thường gặp
❌ Nhầm 1: "NXDOMAIN và SERVFAIL như nhau."
✅ NXDOMAIN nghĩa là tên không tồn tại (lỗi phía dữ liệu/đánh máy). SERVFAIL nghĩa là resolver không tra được (lỗi phía hệ thống/cấu hình). Hướng xử lý khác hẳn nhau.
❌ Nhầm 2: "/etc/hosts không liên quan, mọi tên đều qua DNS."
✅ /etc/hosts được tra trước DNS. Một dòng sai/cũ ở đó khiến domain trỏ nhầm dù DNS đúng — một "bẫy" debug kinh điển. Luôn kiểm tra /etc/hosts khi một tên phân giải lạ.
❌ Nhầm 3: "Domain nào cũng có record MX/TXT."
✅ Record là tuỳ chọn theo loại. ANSWER rỗng với NOERROR khi hỏi MX chỉ nghĩa domain đó không cấu hình mail — không phải lỗi. Hỏi đúng loại bạn cần.
8. 📚 Deep Dive — tài liệu gốc
Đọc khi muốn tới gốc record & debug:
- RFC 1035 — Domain Names: Implementation: định nghĩa các record type (A, NS, CNAME, MX, TXT…).
- RFC 3596 — DNS Extensions for IPv6 (AAAA): record AAAA.
- RFC 2181 — Clarifications to the DNS Specification: quy tắc tinh tế (TTL, CNAME).
Ghi chú: dig là công cụ debug DNS chuẩn của dân vận hành — thuộc vài cờ (+short, +trace, @resolver, MX/NS) là đủ xử lý phần lớn sự cố tên miền.
9. Tóm tắt
- Một domain có nhiều record: A/AAAA (IP), CNAME (bí danh), MX (mail), TXT (xác thực), NS (authoritative).
digđọc ở ANSWER section (tên TTL class loại giá trị);+shortgọn,@resolverchọn resolver,dig tên MX/NStra theo loại.nslookupđơn giản hơn./etc/resolv.confchọn resolver + search domain;/etc/hoststra trước DNS (ghi đè).- Debug theo
status: NXDOMAIN = tên không tồn tại; SERVFAIL = resolver lỗi; ANSWER rỗng + NOERROR = không có record loại đó; sai/cũ = cache. - CNAME chaining thêm bước tra và rủi ro vòng lặp — giữ ngắn.
10. Tự kiểm tra
- Q1Domain có A record đúng nhưng web load ra trang của công ty khác. Record nào đáng nghi trước tiên, và lệnh dig nào xác nhận?
- Q2Phân biệt NXDOMAIN và SERVFAIL — mỗi cái chỉ về vấn đề ở đâu và xử lý khác nhau ra sao?
- Q3Một domain phân giải ra IP sai dù bạn chắc DNS đã đúng. Chỗ nào nên kiểm tra đầu tiên, và vì sao?
- Q4Bạn chạy
dig example.com MXvà ANSWER rỗng nhưng status là NOERROR. Có phải lỗi không? - Q5Vì sao nên giữ chuỗi CNAME ngắn?
- Q6Một domain phân giải lỗi trên máy bạn. Vì sao chạy
dig @1.1.1.1 tênlại giúp khoanh vùng nguyên nhân, và bạn suy ra gì từ kết quả?
Bài tiếp theo: Module 3 — Tổng kết & cheat sheet
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Thảo luận & góp ý
Hỏi đáp về bài này