Công Cụ Chẩn Đoán Mạng
Cả series đã giới thiệu nhiều công cụ rải rác theo từng tầng. Bài này gom chúng lại thành một bộ đồ nghề, và quan trọng hơn — một quy trình dùng chúng theo trình tự để khoanh vùng sự cố. Vì gỡ lỗi mạng không phải đoán mò, mà là đi từng tầng (Bài 1) tìm chỗ đứt.
Mỗi công cụ soi một tầng
Cách nhớ hiệu quả nhất là gắn mỗi công cụ với tầng nó kiểm tra:
Tầng Câu hỏi Công cụ
─────────────────────────────────────────────────────────────────
Ứng dụng (HTTP) server trả lời HTTP đúng? curl -v
TLS mã hóa/chứng chỉ ổn? openssl s_client
DNS tên ra đúng IP? dig
Giao vận (TCP) cổng mở? dịch vụ nghe? nc, ss/netstat
Mạng (IP) tới được host? đường đi? ping, traceroute
Mọi tầng xem gói tin thật tcpdump
Đi nhanh qua từng cái với cú pháp hay dùng nhất:
ping — host có sống và tới được không (L3), kèm độ trễ và mất gói:
ping -c 3 1.1.1.1
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max = 31.3/37.4/49.7 ms
0.0% packet loss = tới được; mất gói cao hoặc RTT lớn = vấn đề đường truyền. (Lưu ý: nhiều server chặn ICMP nên không ping được dù vẫn hoạt động — ping thất bại không luôn nghĩa là chết.)
traceroute — đường đi tới đích, tắc ở hop nào (L3, Bài 4):
traceroute 1.1.1.1
dig — DNS có phân giải đúng không (Bài 7):
dig +short example.com # ra IP chưa?
dig +trace example.com # xem cả chuỗi resolution
ss / netstat — cổng đang nghe và kết nối (L4, Bài 6, 13 series Linux):
ss -tlnp # Linux: cổng đang LISTEN + tiến trình
netstat -an -p tcp # macOS: kết nối + trạng thái
nc — một cổng có mở/tới được không (L4, Bài 6):
nc -zv example.com 443 # kết nối được tới cổng 443?
curl -v — server trả lời HTTP thế nào (L7, Bài 8):
curl -v https://example.com # xem request, response, status, header
openssl s_client — TLS và chứng chỉ (Bài 9):
openssl s_client -connect example.com:443 -servername example.com
tcpdump — soi gói tin thật ở mọi tầng (cần root):
sudo tcpdump -n -i any 'port 443 and host example.com'
tcpdump là "kính hiển vi": khi các công cụ trên chưa đủ, nó cho bạn xem từng gói (SYN, ACK, ...) trên dây. Mạnh nhất nhưng cũng "thô" nhất — để dành khi cần.
Quy trình: khoanh vùng theo tầng
Khi gặp "không vào được https://api.example.com", đừng đoán — đi từ tầng thấp lên (hoặc theo thứ tự một request diễn ra). Đây là cây quyết định:
1. DNS ra IP đúng? dig +short api.example.com
├─ rỗng/sai → lỗi DNS (tên sai, record sai, cache TTL) → Bài 7
└─ ra IP ✓
2. Tới được host (IP)? ping <IP> / traceroute <IP>
├─ không → lỗi mạng/định tuyến (hoặc ICMP bị chặn) → Bài 4
└─ tới ✓
3. Cổng mở/tới được? nc -zv <host> 443
├─ timeout → firewall DROP (Bài 10) hoặc dịch vụ không nghe
├─ refused → tới host nhưng KHÔNG ai nghe cổng đó (ss -tlnp trên server)
└─ succeeded ✓
4. TLS ổn? openssl s_client -connect <host>:443
├─ verify lỗi → chứng chỉ hết hạn/sai tên (Bài 9)
└─ ok ✓
5. HTTP trả gì? curl -v https://...
├─ 4xx → lỗi phía bạn (URL, auth, tham số)
├─ 5xx → lỗi phía server (xem log server)
└─ 2xx ✓ → mạng ổn, vấn đề (nếu còn) ở tầng ứng dụng/logic
Mỗi bước loại trừ một tầng. Đến khi một bước thất bại, bạn biết vấn đề ở đâu và đọc đúng bài để xử lý. Đây là khác biệt giữa "thử đủ thứ" và "chẩn đoán có hệ thống".
Hai cặp triệu chứng hay nhầm
Ghi nhớ hai cặp này tiết kiệm rất nhiều thời gian:
- timeout vs connection refused (ở
nc/curl): timeout = gói bị firewall drop im lặng, hoặc không tới được host; refused = tới được host nhưng không có dịch vụ nghe cổng đó (firewall cho qua). Hai nguyên nhân hoàn toàn khác. - DNS ổn nhưng vẫn không vào vs DNS sai: nếu
digra đúng IP, loại trừ DNS — đừng mất thời gian ở đó, đi tiếp xuống TCP/TLS/HTTP.
Một lưu ý môi trường
Vài công cụ khác nhau giữa OS:
Linux macOS Windows
ip addr ifconfig ipconfig
ss netstat netstat
traceroute traceroute tracert
dig/curl/nc/openssl: gần như giống nhau
Vì server hầu hết là Linux, học bộ Linux (ip, ss) là chính; nhưng dig, curl, nc, openssl, ping, traceroute thì gần như giống nhau ở mọi nơi — đó là bộ "đem theo được" của bạn.
Tổng kết
Mỗi công cụ chẩn đoán soi một tầng: ping/traceroute (mạng), dig (DNS), ss/nc (cổng/TCP), openssl (TLS), curl -v (HTTP), tcpdump (gói tin mọi tầng). Sức mạnh thật nằm ở quy trình: đi từ DNS → host → cổng → TLS → HTTP, mỗi bước loại trừ một tầng để khoanh vùng sự cố thay vì đoán. Nhớ phân biệt timeout (drop/firewall) với refused (không ai nghe).
Bài cuối (13) ghép tất cả lại: lần theo trọn vẹn một request https://... qua mọi tầng đã học, và tổng kết series.