Nền tảng Mạng máy tính/DNS record types & debug — A, CNAME, MX và dig
16/17
Bài 16 / 17~20 phútPort, Socket & DNSMiễn phí lượt xem

DNS record types & debug — A, CNAME, MX và dig

Các loại bản ghi DNS (A, AAAA, CNAME, MX, TXT, NS) và vai trò từng cái, cách đọc resolv.conf và /etc/hosts, dùng dig/nslookup để tra, và chẩn đoán lỗi NXDOMAIN/SERVFAIL. Kèm CNAME chaining và cờ dig thường dùng.

TL;DR: Một domain không chỉ có một IP — nó có nhiều bản ghi (record) với vai trò khác nhau: 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). dignslookup 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 và bạn thấy không chỉ một IP, mà nhiều dòng — A, CNAME, MX… Mỗi loại làm một việc. Và khi một tên miền không phân giải được, làm sao biết lỗi ở đâu — domain sai, resolver hỏng, hay cache bẩn?

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. Các loại record thường gặp

RecordTrỏ tớiDùng để
AIPv4 (vd 93.184.216.34)tên miền → địa chỉ IPv4
AAAAIPv6tên miền → địa chỉ IPv6
CNAMEmột tên khácbí danh: wwwexample.com
MXmail server + ưu tiênđịnh tuyến email của domain
TXTchuỗi văn bảnxác thực domain (SPF, DKIM, verify)
NSauthoritative serverchỉ 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).

2. Đọ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 cho kết quả tương tự, đơn giản hơn nhưng ít chi tiết. Dân debug thường ưu tiên dig.

3. resolv.conf & /etc/hosts

Máy quyết định hỏi resolver nàotên nào bỏ qua DNS:

  • /etc/resolv.conf: liệt kê nameserver (recursive resolver máy sẽ hỏi) và search domain (tự thêm hậu tố cho tên ngắn).
  • /etc/hosts: bảng tĩnh IP tên được tra trước DNS. Đây là lý do 127.0.0.1 localhost hoạt động, và 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

4. Chẩn đoán lỗi phân giải

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ứngNghĩaHướng xử lý
status: NXDOMAINTên không tồn tạiSai chính tả domain / chưa đăng ký / sai search domain
status: SERVFAILResolver lỗi khi traResolver/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 NOERRORTên có nhưng không có record loại đang hỏiHỏ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 (ra IP không?) → nếu lỗi, dig tên xem status → thử dig @1.1.1.1 tên (loại trừ resolver nội bộ) → kiểm tra /etc/hostssearch domain.

5. 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:

flowchart LR
    A["www.shop.com<br/>(CNAME)"] --> B["shop.com<br/>(CNAME)"]
    B --> C["host.cdn.net<br/>(A record)"]
    C --> D["IP cuoi cung"]

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.

6. Pitfall — hiểu nhầm thường gặp

Nhầm 1: "NXDOMAIN và SERVFAIL như nhau." ✅ NXDOMAIN = tên không tồn tại (lỗi phía dữ liệu/đánh máy). SERVFAIL = 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.

7. 📚 Deep Dive — tài liệu gốc

📚 Spec & reference chính thức

Đọc khi muốn tới gốc record & debug:

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.

8. 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ị); +short gọn, @resolver chọn resolver, dig tên MX/NS tra theo loại. nslookup đơn giản hơn.
  • /etc/resolv.conf chọn resolver + search domain; /etc/hosts tra 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.

9. Tự kiểm tra

Tự kiểm tra
Q1
A, CNAME và MX record khác nhau ở chỗ trỏ tới cái gì và dùng để làm gì?
  • A: trỏ tên miền → IPv4 (cái trình duyệt cần để kết nối).
  • CNAME: bí danh, trỏ tên này → một tên khác (vd www.shop.comshop.com); resolver phải tra tiếp tên đích.
  • MX: trỏ tới mail server của domain kèm độ ưu tiên — dùng để định tuyến email, không liên quan web.
Q2
Phân biệt NXDOMAIN và SERVFAIL — mỗi cái chỉ về vấn đề ở đâu và xử lý khác nhau ra sao?
NXDOMAIN = tên miền không tồn tại — vấn đề ở dữ liệu/đánh máy: sai chính tả, domain chưa đăng ký, hoặc sai search domain. SERVFAIL = resolver không tra được — vấn đề hệ thống: resolver/authoritative trục trặc, DNSSEC sai. Xử lý: NXDOMAIN → kiểm tra lại tên; SERVFAIL → thử resolver khác (dig @1.1.1.1) để xem do resolver nội bộ hay do chính domain.
Q3
Mộ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?
/etc/hosts — vì nó được tra trước DNS. Một dòng tĩnh sai/cũ ở đó (vd từng thêm để test) khiến tên trỏ nhầm bất kể DNS thật trả gì. Đây là bẫy debug kinh điển. Sau đó mới tới cache (chờ TTL hoặc test @1.1.1.1). Luôn loại trừ /etc/hosts khi một tên phân giải "lạ" so với kỳ vọng.
Q4
Bạn chạy `dig example.com MX` và ANSWER rỗng nhưng status là NOERROR. Có phải lỗi không?
Không phải lỗi. NOERROR + ANSWER rỗng nghĩa là domain tồn tại nhưng không có record loại bạn hỏi (ở đây là MX — domain đó không cấu hình mail). Record là tuỳ chọn theo loại; thiếu MX chỉ nghĩa domain không nhận email, hoàn toàn bình thường. Muốn IP web thì hỏi A; muốn authoritative thì hỏi NS.
Q5
Vì sao nên giữ chuỗi CNAME ngắn?
Vì mỗi tầng CNAME là một bước tra thêm: resolver phải đi tiếp tên đích cho tới khi gặp một A/AAAA record — chuỗi dài làm phân giải chậm hơn. Tệ hơn, cấu hình sai có thể tạo vòng lặp (A→B→A) hoặc trỏ tới tên không có A record → phân giải thất bại. Giữ CNAME ngắn (lý tưởng một tầng) cho nhanh và tránh lỗi.
Q6
Một domain phân giải lỗi trên máy bạn. Vì sao chạy `dig @1.1.1.1 tên` lại giúp khoanh vùng nguyên nhân, và bạn suy ra gì từ kết quả?
Lệnh dig @1.1.1.1 tên ép hỏi một recursive resolver khác (Cloudflare) thay vì resolver mặc định trong /etc/resolv.conf. Nếu qua 1.1.1.1 mà ra IP đúng, thì lỗi nằm ở resolver nội bộ của bạn (cấu hình sai, cache bẩn, hoặc mạng nội bộ chặn). Nếu 1.1.1.1 cũng trả NXDOMAIN/SERVFAIL, vấn đề ở chính domain (chưa đăng ký, authoritative hỏng) chứ không phải máy bạn. Đây là bước "loại trừ" kinh điển: đổi resolver để tách lỗi phía client khỏi lỗi phía dữ liệu.

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?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên