Khi server bỗng dưng quá tải: Bạn nhìn vào đâu?
Nửa đêm, chuông cảnh báo Telegram réo liên hồi. CPU server chạm ngưỡng 100%, băng thông mạng nghẽn cứng và phản hồi ứng dụng chậm bất thường. Bạn SSH vội vào máy chủ, gõ netstat và thấy hàng ngàn kết nối TCP đang mở dồn dập.
Trên máy tính cá nhân, bạn có thể dễ dàng mở Wireshark để lọc gói tin bằng giao diện đồ họa. Nhưng trên server production qua cổng SSH, bạn chỉ có vỏn vẹn màn hình terminal đen trắng. Dùng tcpdump thì log raw trôi nhanh như thác đổ, rất khó bóc tách chi tiết ở tầng ứng dụng (L7). Đây chính là lúc Tshark phát huy sức mạnh.
Trước đây mình từng mất gần 3 tiếng để tìm nguyên nhân một vụ brute-force SSH tinh vi trên cụm web server. Từ bài học xương máu đó, Tshark luôn là công cụ đầu tiên mình cài đặt trên mọi máy chủ quản trị.
Tshark là gì và tại sao nên dùng thay thế tcpdump?
Hiểu đơn giản, Tshark là phiên bản dòng lệnh (CLI) của Wireshark. Cả hai dùng chung bộ thư viện giải mã giao thức (dissectors). Wireshark phân tích được giao thức nào thì Tshark đọc vanh vách giao thức đó.
Dù tcpdump rất phổ biến và có sẵn trên hầu hết các bản phân phối Linux, Tshark vẫn vượt trội hơn ở 3 điểm mấu chốt:
- Mổ xẻ sâu tầng ứng dụng (Layer 7): Tshark đọc trực tiếp các trường trong HTTP headers, DNS query, chứng chỉ TLS Handshake hay payload SSH mà không cần viết script parse chuỗi phức tạp.
- Bộ lọc hiển thị cực mạnh (Display Filters): Bạn có thể tái sử dụng toàn bộ cú pháp quen thuộc của Wireshark như
http.request.method == "POST"hoặcdns.flags.response == 0. - Trích xuất dữ liệu tùy biến: Dễ dàng bóc tách các trường như IP nguồn, mã lỗi HTTP hoặc User-Agent thành dạng bảng để kết hợp trực tiếp với
grep,awk,sort.
Thực hành: Bắt và điều tra gói tin với Tshark
1. Cài đặt Tshark trên Linux
Với hệ điều hành Ubuntu hoặc Debian, bạn cài đặt nhanh qua APT:
sudo apt update
sudo apt install -y tshark
Trong quá trình cài đặt, hệ thống sẽ hỏi có cho phép non-root user bắt gói tin hay không. Hãy chọn Yes, sau đó thêm tài khoản hiện tại vào nhóm wireshark để không cần gõ sudo liên tục:
sudo usermod -aG wireshark $USER
# Đăng xuất và đăng nhập lại SSH để quyền mới có hiệu lực
2. Xác định card mạng và bắt gói tin thời gian thực
Trước tiên, kiểm tra danh sách card mạng đang hoạt động:
tshark -D
Hệ thống sẽ liệt kê các interface như 1. eth0, 2. lo (loopback). Giả sử card mạng chính ra Internet là eth0, bạn bắt đầu theo dõi lưu lượng trực tiếp:
tshark -i eth0
Màn hình sẽ hiển thị liên tục các gói tin đang đi qua card mạng. Nhấn Ctrl + C khi muốn dừng lại.
3. Lọc trường dữ liệu với tùy chọn -T fields
Thay vì nhìn cả dòng log dài lê thê, tùy chọn -T fields giúp bạn chỉ gom đúng thông tin cần thiết:
tshark -i eth0 -T fields -e ip.src -e ip.dst -e _ws.col.Protocol -e _ws.col.Info
Lệnh trên sẽ in ra 4 cột rõ ràng: IP nguồn, IP đích, Giao thức và Tóm tắt thông tin gói tin, phân tách bằng dấu Tab rất trực quan.
4. Kịch bản 1: Phát hiện kẻ tấn công quét cổng (SYN Port Scan)
Khi kẻ tấn công dùng Nmap quét cổng máy chủ (chế độ SYN scan), họ sẽ gửi ồ ạt các gói TCP SYN mà không gửi lại ACK để hoàn tất bắt tay 3 bước. Bạn có thể lọc riêng các gói tin này:
tshark -i eth0 -Y "tcp.flags.syn == 1 and tcp.flags.ack == 0" -T fields -e ip.src -e tcp.dstport
Nếu một địa chỉ IP lạ liên tục gửi gói tin tới hàng chục cổng khác nhau (21, 22, 80, 443, 3306, 8080…) chỉ trong 1-2 giây, server của bạn chắc chắn đang bị do thám tìm lỗ hổng.
5. Kịch bản 2: Truy vết tấn công SSH Brute-force
Khi kẻ tấn công chạy tool dò mật khẩu SSH (như Hydra), lượng kết nối đến cổng 22 sẽ tăng đột biến. Lệnh dưới đây sẽ bắt và thống kê top IP kết nối đến port 22 trong vòng 20 giây:
tshark -i eth0 -a duration:20 -Y "tcp.dstport == 22 and tcp.flags.syn == 1" -T fields -e ip.src | sort | uniq -c | sort -nr
Ý nghĩa từng tham số:
-a duration:20: Tự động dừng sau 20 giây.-Y "tcp.dstport == 22 and tcp.flags.syn == 1": Chỉ lọc gói khởi tạo bắt tay TCP vào cổng SSH.sort | uniq -c | sort -nr: Gom nhóm và sắp xếp IP theo số lần kết nối giảm dần.
Nếu thấy một IP phát sinh tới 50-100 request chỉ trong 20 giây, bạn có thể lấy ngay IP đó để chặn thẳng tay bằng iptables -A INPUT -s <IP_KẺ_TẤN_CÔNG> -j DROP hoặc ufw deny from <IP_KẺ_TẤN_CÔNG>.
6. Kịch bản 3: Phát hiện rò rỉ dữ liệu qua DNS (DNS Tunneling)
Mã độc và botnet thường lợi dụng DNS query để lén truyền dữ liệu ra ngoài hoặc liên lạc với server điều khiển (C2), bởi cổng 53 UDP hiếm khi bị tường lửa chặn. Bạn có thể theo dõi toàn bộ domain mà server gửi yêu cầu phân giải:
tshark -i eth0 -Y "dns.flags.response == 0" -T fields -e ip.src -e dns.qry.name
Nếu thấy xuất hiện các subdomain dạng chuỗi ký tự ngẫu nhiên hoặc mã hóa Base64 dài bất thường (ví dụ: dGVzdC1kYXRh.malicious-domain.com), khả năng cao server đã bị nhiễm mã độc và đang bị tuồn dữ liệu ngầm ra ngoài.
7. Bắt gói tin ra file .pcap để phân tích chuyên sâu
Khi sự cố đang diễn ra dồn dập, cách xử lý an toàn nhất là dump toàn bộ lưu lượng thô ra file .pcap trước khi phân tích kỹ:
# Bắt đúng 10.000 gói tin và ghi vào file incident.pcap
sudo tshark -i eth0 -c 10000 -w /tmp/incident.pcap
Sau đó, bạn có thể phân tích nguội file này ngay trên server bất cứ lúc nào:
# Lọc nhanh các request HTTP trả mã lỗi 4xx hoặc 5xx
tshark -r /tmp/incident.pcap -Y "http.response.code >= 400" -T fields -e ip.src -e http.response.code -e http.request.uri
Lời kết
Tshark giống như chiếc kính lúp đắc lực ngay trên terminal Linux. Bạn không cần tải file dump hàng gigabyte về máy tính cá nhân chỉ để mở Wireshark lọc vài dòng log. Khi nắm vững các bộ lọc cơ bản của Tshark, bạn sẽ cô lập nhanh nguyên nhân sự cố và chủ động bảo vệ máy chủ trước các đợt tấn công bất ngờ.
