Khó khăn thực tế khi test Firewall và IDS/IPS
Khi dựng cụm Firewall mới hoặc chỉnh rule cho Snort, Suricata, dân NetOps thường gặp chung một bài toán khó. Làm sao biết chắc rule bắt đúng đòn tấn công mà không làm drop nhầm traffic sạch của user?
Dùng curl hay ping thì quá đơn giản. Các tool sinh tải như iperf3 chỉ đẩy được throughput thô (L4). Chúng thiếu hẳn payload thực tế, cờ TCP bất thường hay signature mã độc. Ngược lại, nếu chạy exploit script trực tiếp vào lab, bạn khó kiểm soát tốc độ phát. Việc tái hiện chuẩn xác 100% phiên lỗi gần như bất khả thi.
Mình từng ngấm đòn sự cố rớt gói chập chờn ở một cổng thanh toán. Lỗi chỉ xuất hiện vào giờ cao điểm, tầm 14h đến 16h với lưu lượng khoảng 5.000 CCU. Đêm xuống, mạng vắng tanh. Anh em trực không thể bắt hàng nghìn user vào thao tác đồng loạt lúc 2 giờ sáng để debug. Giải pháp hiệu quả nhất lúc đó là dùng tcpreplay để phát lại đúng file pcap đã capture lúc nghẽn mạng.
Bộ công cụ tcpreplay gồm những gì và chạy ra sao?
tcpreplay không phải một lệnh đơn lẻ. Đây là bộ công cụ chuyên xử lý và tái tạo lưu lượng từ file .pcap:
- tcpreplay: Đọc gói tin từ file capture rồi bơm thẳng xuống Layer 2 (Data Link) của card mạng (NIC). Tool này bypass toàn bộ TCP/IP stack của kernel. Nhờ vậy, máy phát có thể đạt tốc độ hàng trăm Mbps đến hàng chục Gbps tùy card mạng.
- tcprewrite: Biên tập trực tiếp header của gói tin. Bạn có thể đổi địa chỉ MAC, sửa dải IP nguồn/đích hoặc tính lại checksum. Nếu lấy pcap từ hạ tầng production đem về lab, IP và MAC cũ chắc chắn sẽ lệch topology. Bạn bắt buộc phải dùng tool này để map lại.
- tcpprep: Tách luồng traffic thành hai chiều client và server riêng biệt. File
.cachesinh ra giúptcpreplayphát đồng thời qua hai interface mạng độc lập (chẳng hạn client ở eth1, server ở eth2).
Cơ chế rất rõ ràng. Bạn capture traffic thật một lần, sửa IP/MAC cho khớp với phòng lab, rồi bắn thẳng vào Firewall hay IDS/IPS để đo phản ứng.
Quy trình 5 bước thu thập, chỉnh sửa và phát lại packet
Bước 1: Cài đặt công cụ trên Linux
Hầu hết distro phổ biến đều tích hợp sẵn tcpreplay trong repo.
Với Ubuntu / Debian:
sudo apt update
sudo apt install -y tcpreplay
Với RHEL / Rocky Linux / AlmaLinux:
sudo dnf install -y epel-release
sudo dnf install -y tcpreplay
Kiểm tra sau khi cài:
tcpreplay -V
Bước 2: Thu thập file mẫu traffic (.pcap)
Ghi lại 1.000 packet nghi vấn trên interface mạng bằng tcpdump:
sudo tcpdump -i eth0 -c 1000 -w attack_sample.pcap
Đọc nhanh thông số file vừa capture bằng capinfo:
capinfo attack_sample.pcap
Lệnh này cho bạn biết thời lượng capture, tổng số packet và bitrate trung bình.
Bước 3: Chỉnh sửa MAC, IP và sửa Checksum bằng tcprewrite
Nếu giữ nguyên IP từ ngoài Internet, Switch L3 và Firewall trong lab sẽ drop gói ngay lập tức vì sai routing hoặc sai ARP. Ta cần ánh xạ lại header.
Giả sử mô hình lab gồm:
- Card mạng máy phát:
eth1 - IP giả lập Client (nguồn):
192.168.10.50, MAC:00:11:22:33:44:55 - IP gateway Firewall/IDS (đích):
192.168.10.1, MAC:aa:bb:cc:dd:ee:ff
Chạy lệnh chuyển đổi:
tcprewrite --enet-smac=00:11:22:33:44:55 \
--enet-dmac=aa:bb:cc:dd:ee:ff \
--srcipmap=0.0.0.0/0:192.168.10.50/32 \
--dstipmap=0.0.0.0/0:192.168.10.1/32 \
--fixcsum \
--infile=attack_sample.pcap \
--outfile=ready_to_send.pcap
Lưu ý kỹ thuật quan trọng: Khi thay đổi header IP hoặc port, giá trị checksum gốc sẽ hỏng. Cờ --fixcsum ép tcprewrite tính toán lại toàn bộ checksum IPv4, TCP và UDP. Thiếu cờ này, Snort hay Suricata sẽ âm thầm drop gói ngay tại tầng network interface vì checksum verification failed.
Bước 4: Phát lại lưu lượng qua card mạng
Tùy mục đích test, bạn chọn 1 trong 3 kịch bản bắn traffic sau.
Kịch bản 1: Phát theo thời gian thực (Real-time replay)
Phù hợp để test độ nhạy của IDS/IPS. Lệnh này giữ nguyên khoảng cách thời gian giữa các gói như lúc capture ngoài đời:
sudo tcpreplay --intf1=eth1 --realtime ready_to_send.pcap
Kịch bản 2: Giới hạn băng thông và lặp gói (Rate limiting & Loop)
Thích hợp để đo ngưỡng chịu tải. Ví dụ: phát đúng tốc độ 50 Mbps và lặp lại 20 lần:
sudo tcpreplay --intf1=eth1 --mbps=50.0 --loop=20 ready_to_send.pcap
Kịch bản 3: Xả tải hết công suất phần cứng (Top speed)
Dành riêng cho bài stress test phần cứng Firewall:
sudo tcpreplay --intf1=eth1 --topspeed ready_to_send.pcap
Bước 5: Đọc log và đánh giá kết quả trên IDS/IPS
Mở một cửa sổ SSH khác trên máy chạy Suricata hoặc Snort để theo dõi alert trực tiếp:
# Đối với Suricata:
sudo tail -f /var/log/suricata/fast.log
# Đối với Snort:
sudo tail -f /var/log/snort/alert
Nếu rule bắt đúng signature, log cảnh báo sẽ nhảy đều theo từng đợt packet bắn vào. Nếu không thấy alert, bạn cần kiểm tra lại hai điểm: cú pháp rule đã chuẩn chưa, hoặc gói tin có bị card mạng drop trước khi vào engine phân tích hay không.
Lời kết
Packet Replay giải quyết dứt điểm tình trạng debug theo cảm tính. Với cặp công cụ tcprewrite và tcpreplay, bạn có thể tái hiện chính xác bất kỳ sự cố mạng nào trong môi trường lab an toàn. Hãy xây dựng sẵn một kho pcap chứa các mẫu tấn công phổ biến (như SYN flood, SQLi hay CVE cụ thể). Mỗi khi cập nhật rule mới, bạn chỉ cần vài phút chạy lại test suite trước khi áp dụng lên cụm production.

