So sánh các mô hình triển khai Suricata trên Linux
Bắt tay dựng hệ thống phát hiện và ngăn chặn xâm nhập (IDS/IPS), quyết định khó nhất là chọn topology mạng. Bạn muốn Suricata đứng ngoài quan sát hay can thiệp trực tiếp vào từng gói tin? Hiện có 3 kiến trúc chính:
- Mô hình IDS thụ động (Passive Sniffing qua AF_PACKET/SPAN Port): Card mạng nhận bản sao traffic (mirror) từ switch SPAN port hoặc TAP. Suricata đọc và bóc tách gói tin chạy ngầm. Khi phát hiện mã độc hoặc lệnh quét cổng, hệ thống chỉ ghi log cảnh báo (alert).
- Mô hình IPS Inline truyền thống (NFQUEUE / iptables): Gói tin đi qua Netfilter firewall được đẩy vào hàng đợi người dùng (NFQUEUE). Suricata kiểm tra gói tin theo tập rule. Sau đó, engine phát lệnh:
ACCEPT(cho qua) hoặcDROP(ngắt kết nối ngay lập tức). - Mô hình IPS hiện đại với eBPF/XDP: Thay vì đẩy gói tin lên user-space qua kernel stack, Suricata nạp bytecode eBPF trực tiếp vào driver card mạng (XDP). Gói tin độc hại bị triệt tiêu ngay ở tầng phần cứng trước khi ngốn chu kỳ xử lý của CPU.
Phân tích ưu và nhược điểm của từng kiến trúc
Mỗi phương án đều đánh đổi giữa độ an toàn hạ tầng và tài nguyên máy chủ:
1. Passive IDS (AF_PACKET)
- Ưu điểm: Bảo toàn uptime tối đa. Suricata có quá tải hay crash thì web server và database vẫn chạy bình thường. Độ trễ mạng (latency) tăng thêm bằng 0.
- Nhược điểm: Không thể tự động chặn đòn tấn công đang diễn ra. Alert SQL Injection xuất hiện trên dashboard thì dữ liệu có thể đã rò rỉ. Quản trị viên phải viết thêm script hoặc cấu hình fail2ban để khóa IP sau đó.
2. Inline IPS qua NFQUEUE
- Ưu điểm: Chặn đứng khai thác tức thì. Gói tin độc hại bị hủy ngay tại gateway, không thể tiếp cận reverse proxy Nginx hay backend service.
- Nhược điểm: Độ trễ mạng tăng khoảng 0.2ms đến 1.5ms mỗi request do chuyển đổi qua lại giữa kernel space và user space. Nếu Suricata treo và bạn quên bật cờ bypass dự phòng, máy chủ sẽ rớt mạng hoàn toàn.
3. Inline IPS với eBPF/XDP
- Ưu điểm: Tốc độ cực cao. Khả năng lọc đạt 5 đến 10 triệu gói tin/giây (pps) trên cổng mạng 10GbE, hóa giải các cuộc tấn công DoS lớp 4 nhanh gọn.
- Nhược điểm: Yêu cầu Linux kernel 5.4 trở lên. Card mạng phải có driver hỗ trợ Native XDP (như Intel ixgbe/i40e hoặc Mellanox). Quá trình debug signature phức tạp hơn NFQUEUE.
Chọn giải pháp nào cho hệ thống production?
Lộ trình an toàn cho một cụm máy chủ gồm hai giai đoạn rõ ràng:
- Tuần đầu tiên: Chạy chế độ Passive IDS. Hãy để Suricata bắt traffic thật từ 3 đến 7 ngày. Bạn cần soi kỹ file log để lọc bỏ các cảnh báo giả (false-positive) từ webhook đối tác hay luồng backup nội bộ.
- Giai đoạn kích hoạt bảo vệ: Chuyển sang IPS Inline với NFQUEUE kết hợp cờ
--queue-bypass. Đây là lựa chọn thực tế cho các VPS hoặc server vật lý cỡ vừa (4 – 16 vCPU): chặn được exploit web mà vẫn giữ an toàn đường truyền nếu tiến trình gặp lỗi.
Hướng dẫn triển khai Suricata IPS trên Ubuntu/Debian
Bước 1: Chuẩn bị server và bảo mật tài khoản
Trước khi can thiệp vào tường lửa và mở port, bạn nên chuẩn hóa bảo mật tài khoản. Bạn có thể dùng password generator tại toolcraft.app/vi/tools/security/password-generator để tạo mật khẩu ngẫu nhiên cho user có quyền sudo. Công cụ xử lý trực tiếp trên trình duyệt, không gửi dữ liệu qua mạng, giúp thao tác SSH an toàn hơn.
# Cập nhật repo và cài đặt các thư viện cần thiết
sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common curl libpcap-dev libnetfilter-queue-dev jq
Bước 2: Cài đặt Suricata từ PPA chính thức
Các gói Suricata có sẵn trên repo mặc định của Ubuntu thường khá cũ. Bạn nên dùng PPA chính thức từ OISF để nhận bản cập nhật engine và vá lỗi mới nhất:
sudo add-apt-repository ppa:oisf/suricata-stable -y
sudo apt update
sudo apt install -y suricata
Chạy lệnh sau để xác nhận Suricata đã biên dịch kèm module NFQUEUE:
suricata --build-info | grep -E "NFQueue|AF_PACKET"
Nếu terminal trả về NFQueue support: yes, hệ thống đã sẵn sàng chạy chế độ IPS.
Bước 3: Tinh chỉnh file cấu hình suricata.yaml
Mở file cấu hình chính:
sudo nano /etc/suricata/suricata.yaml
Bạn cần rà soát lại ba mục quan trọng:
- Xác định dải mạng cần bảo vệ (HOME_NET): Điền đúng subnet nội bộ hoặc IP public của máy chủ để tránh cảnh báo sai:
vars: address-groups: HOME_NET: "[192.168.1.0/24, 10.0.0.0/8, 203.0.113.15/32]" EXTERNAL_NET: "!$HOME_NET" - Thiết lập hàng đợi nfq: Tìm khối
nfq:và đảm bảo gán đúng số hiệu hàng đợi (queue number 0):nfq: mode: accept repeat-mark: 1 repeat-mask: 1 route-queue: 2 - Định dạng log EVE JSON: Bật
eve-logđể Suricata xuất toàn bộ alerts, DNS query và HTTP metadata ra file/var/log/suricata/eve.json. File này hỗ trợ import thẳng vào ELK, Grafana Loki hoặc Vector.
Bước 4: Cập nhật Ruleset từ Emerging Threats (ET Open)
Suricata tích hợp công cụ suricata-update để tải signature mới:
# Tải các rule mới nhất từ kho OISF
sudo suricata-update
# Liệt kê các nguồn rule phụ trợ
sudo suricata-update list-sources
Theo mặc định, các rule trong bộ ET Open dùng hành động alert. Để Suricata tự đổi các cảnh báo nghiêm trọng thành lệnh drop, bạn tạo file /etc/suricata/modify.conf:
echo 're:drop "^alert (tcp|udp|icmp) \$EXTERNAL_NET any -> \$HOME_NET"' | sudo tee /etc/suricata/modify.conf
sudo suricata-update --modify-conf /etc/suricata/modify.conf
Bước 5: Tạo Rule kiểm thử ngăn chặn (Drop Rule)
Chúng ta sẽ tạo một rule chặn gói tin Ping (ICMP Echo Request) từ bên ngoài để test tính năng drop. Mở file /var/lib/suricata/rules/local.rules:
sudo nano /var/lib/suricata/rules/local.rules
Thêm dòng sau vào file:
drop icmp any any -> $HOME_NET any (msg:"LOCAL TEST - Blocked Ping Echo Request"; itype:8; sid:1000001; rev:1;)
Đảm bảo đã khai báo - local.rules trong mục rule-files: của /etc/suricata/suricata.yaml. Tiếp theo, kiểm tra cú pháp file cấu hình:
sudo suricata -T -c /etc/suricata/suricata.yaml -v
Hệ thống hiện thông báo Configuration provided was successfully verified nghĩa là file cấu hình không có lỗi.
Bước 6: Định tuyến traffic qua NFQUEUE bằng iptables
Đây là bước đưa Suricata vào dòng traffic chính. Dùng cờ --queue-bypass để đảm bảo máy chủ không bị mất mạng nếu Suricata dừng đột ngột:
# Đẩy traffic INPUT và FORWARD vào hàng đợi NFQUEUE 0
sudo iptables -I INPUT -j NFQUEUE --queue-num 0 --queue-bypass
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0 --queue-bypass
Khởi chạy Suricata gắn với hàng đợi số 0 ở chế độ chạy ngầm (daemon):
sudo suricata -c /etc/suricata/suricata.yaml -q 0 -D
Nếu quản lý qua systemd, bạn sửa file /etc/default/suricata, đổi dòng LISTENMODE=nfqueue và chạy lại service:
sudo systemctl restart suricata
sudo systemctl status suricata
Bước 7: Kiểm tra kết quả chặn và phân tích log
Dùng một máy khác trong mạng và gửi lệnh ping tới server:
ping 203.0.113.15
Gói tin sẽ bị chặn ngay, màn hình báo Request timed out hoặc 100% packet loss. Kiểm tra file eve.json trên server để xem chi tiết sự kiện:
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert") | {timestamp: .timestamp, src_ip: .src_ip, alert: .alert.signature, action: .alert.action}'
Kết quả hiển thị trên terminal:
{
"timestamp": "2026-10-19T10:47:30.123456+0000",
"src_ip": "192.168.1.50",
"alert": "LOCAL TEST - Blocked Ping Echo Request",
"action": "blocked"
}
Trường "action": "blocked" cho thấy gói tin đã bị drop trước khi vào tới network stack của Linux. Thiết lập này giúp bạn chủ động ngăn chặn các đợt scan từ nmap, brute-force SSH hoặc mã khai thác web mà vẫn duy trì được độ ổn định cho server.

