Khi ứng dụng báo lỗi nhưng ping vẫn thông suốt
Kịch bản này xảy ra như cơm bữa: App mobile báo lỗi timeout khi gọi API. Bạn SSH vào server, gõ lệnh ping sang máy chủ database hoặc API đối tác thì thấy 0% packet loss, RTT chỉ 2ms. Tuy nhiên, log backend vẫn trơ ra lỗi Connection timed out hoặc Connection refused.
Nguyên nhân rất đơn giản: ping chạy trên giao thức ICMP, còn ứng dụng giao tiếp qua TCP/UDP. Một gói ICMP Echo Request đi qua trơn tru không đồng nghĩa với việc cổng TCP 443 hay 5432 đang chấp nhận kết nối. Tường lửa có thể chặn riêng port ứng dụng. Web server có thể đang nghẽn hàng đợi (backlog queue). Để biết chính xác chuyện gì đang xảy ra trên đường truyền, bạn cần soi từng gói tin vật lý qua tcpdump.
tcpdump bắt và phân tích lưu lượng thế nào?
tcpdump là công cụ CLI phân tích mạng kinh điển dựa trên thư viện libpcap. Nó chặn bắt trực tiếp các frame dữ liệu ra vào card mạng (Network Interface Card) trước khi hệ điều hành hoặc iptables xử lý sâu hơn.
Khi debug kết nối TCP, bạn chỉ cần để ý 4 cờ (flags) hiển thị trong dấu ngoặc vuông [...]:
- [S] (SYN): Gói khởi tạo bắt tay 3 bước (3-way handshake).
- [S.] (SYN-ACK): Phía server đồng ý bắt tay và phản hồi lại client.
- [.] (ACK): Xác nhận đã nhận gói tin trước đó.
- [F] (FIN): Đóng kết nối bình thường từ một phía.
- [R] (RST): Ngắt kết nối lập tức. Thường do port chưa mở, tiến trình nhận crash đột ngột hoặc firewall chủ động gửi trả RST để từ chối truy cập.
Thực hành: Các lệnh tcpdump thực chiến
1. Cài đặt nhanh
tcpdump hầu như luôn có sẵn trong repo chuẩn của mọi distro Linux:
# Ubuntu / Debian
sudo apt update && sudo apt install -y tcpdump
# RHEL / CentOS / Rocky Linux / AlmaLinux
sudo dnf install -y tcpdump
2. Kiểm tra danh sách card mạng
Trước tiên, xem máy chủ đang có những interface nào:
sudo tcpdump -D
Đầu ra sẽ liệt kê các cổng mạng kèm số thứ tự, ví dụ 1.eth0, 2.ens33 hoặc any (bắt trên tất cả interface).
3. Tham số quan trọng cần thuộc lòng
Chạy lệnh tcpdump trần trụi sẽ làm ngập terminal ngay lập tức. Hãy luôn kèm theo các flag tối ưu sau:
-i <interface>: Chỉ định card mạng (ví dụ:-i eth0hoặc-i any).-n: Không phân giải IP sang hostname, giúp giảm độ trễ khi in log.-nn: Không phân giải cả hostname lẫn port (hiển thị thẳng80,443thay vìhttp,https).-c <số_lượng>: Bắt đúng số gói quy định rồi tự thoát (ví dụ:-c 20).-q: Chế độ in vắn tắt, chỉ giữ lại thông tin cốt lõi của gói tin.
Mẫu lệnh kiểm tra nhanh 5 gói tin an toàn nhất:
sudo tcpdump -i eth0 -nn -c 5
4. Kỹ thuật lọc gói tin với BPF (Berkeley Packet Filter)
Sức mạnh lớn nhất của tcpdump là cú pháp lọc BPF cực kỳ linh hoạt. Bạn có thể ghép các điều kiện bằng and, or, not.
Trường hợp A: Khoanh vùng theo IP nguồn hoặc đích
Khi cần điều tra một client cụ thể (ví dụ 192.168.1.50) gặp sự cố gọi API:
# Bắt mọi traffic 2 chiều đi và đến từ IP 192.168.1.50
sudo tcpdump -i eth0 -nn host 192.168.1.50
# Chỉ theo dõi request từ client gửi lên server
sudo tcpdump -i eth0 -nn src host 192.168.1.50
# Chỉ theo dõi dữ liệu server phản hồi về client
sudo tcpdump -i eth0 -nn dst host 192.168.1.50
Trường hợp B: Bắt bệnh kết nối Web Server (Port 80 / 443)
Lọc riêng luồng HTTP/HTTPS để kiểm tra quá trình bắt tay TCP:
sudo tcpdump -i eth0 -nn "port 80 or port 443" -c 50
Nếu thấy client gửi [S] liên tục mà server im lặng không trả về [S.], vấn đề nằm ở iptables/UFW đang DROP gói tin. Ngược lại, nếu server lập tức phản hồi cờ [R] (RST), dịch vụ Nginx/Apache nhiều khả năng đang chết hoặc chưa bind đúng port.
Trường hợp C: Điều tra lỗi DNS timeout (Port 53)
Lệnh curl ra bên ngoài mất 5–10 giây mới bắt đầu tải dữ liệu? Thủ phạm thường là DNS phân giải chậm:
sudo tcpdump -i eth0 -nn udp port 53
Bạn sẽ thấy rõ truy vấn A/AAAA gửi tới DNS resolver nào (như 8.8.8.8 hay local resolver) và mất bao nhiêu mili-giây để nhận được kết quả trả về.
5. Xuất file pcap để mở trên Wireshark
Phân tích các phiên TLS handshake hoặc HTTP payload phức tạp trên terminal rất dễ sót lỗi. Hãy lưu lại gói tin thô để mở bằng giao diện đồ họa trực quan của Wireshark:
# Bắt 200 gói tin trên port 443 và ghi ra file dump.pcap
sudo tcpdump -i eth0 -nn -c 200 port 443 -w /tmp/dump.pcap
Để đọc lại file này trực tiếp trên server mà không cần GUI:
tcpdump -nn -r /tmp/dump.pcap
6. Cảnh báo an toàn trên môi trường Production
Trên các hệ thống tải cao, tcpdump có thể đẩy mức dùng CPU tăng vọt hoặc làm tràn disk do I/O ghi file liên tục. Ví dụ, một cụm API xử lý 10.000 req/s có thể tạo ra hàng gigabyte dữ liệu pcap chỉ trong 2 phút.
Để tránh làm sập server do cạn kiệt tài nguyên, luôn áp dụng 3 quy tắc sau:
- Luôn dùng flag
-c: Giới hạn số lượng gói tin bắt buộc dừng lại (ví dụ-c 500hoặc-c 1000). - Chỉ lưu TCP Header: Thêm tham số
-s 96(snaplen 96 bytes) để chỉ bắt phần header gói tin, bỏ qua payload dữ liệu. Kích thước file ghi sẽ giảm hơn 80%. - Không bao giờ chạy bắt toàn bộ (unfiltered) mà không có bộ lọc IP hoặc Port cụ thể.
Tổng kết
tcpdump là công cụ chẩn đoán không thể thiếu của bất kỳ ai vận hành hệ thống Linux. Khi ứng dụng phát sinh lỗi mạng khó hiểu, việc chạy vài dòng lệnh tcpdump sẽ phân định rõ ràng: lỗi do code ứng dụng, do firewall nội bộ hay do đường truyền ISP. Hãy lưu lại các cú pháp BPF cơ bản này để sẵn sàng xử lý sự cố trong ca on-call tiếp theo.

