Cài Suricata trong 5 phút — Bắt đầu ngay
Sau khi audit security cho 10+ server, mình nhận thấy hầu hết đều có chung một vấn đề: không ai giám sát traffic mạng. Server chạy ngon, không ai hay biết có kẻ đang dò quét cổng hay thử brute force từng đêm. Suricata giải quyết đúng chỗ đó.
Cài nhanh để chạy thử trước:
sudo apt update
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt install suricata -y
sudo suricata --build-info | head -5
Thấy dòng Suricata version X.X.X là xong phần cài đặt. Tiếp theo, xác định network interface đang dùng:
ip a | grep -E "^[0-9]+:|inet "
# Ghi lại tên interface — thường là eth0 hoặc ens3
Khởi động Suricata ở chế độ IDS — theo dõi traffic, không block gì cả:
sudo suricata -c /etc/suricata/suricata.yaml -i eth0 --runmode autofp -D
sudo tail -f /var/log/suricata/fast.log
Xong phần test nhanh. Để Suricata nhận diện được tấn công thật, cần cấu hình rule và network — đọc tiếp.
Suricata hoạt động như thế nào?
Trước khi cấu hình, biết Suricata vận hành theo chế độ nào sẽ giúp tránh bật nhầm IPS khi chưa sẵn sàng. Có 3 chế độ chính:
- IDS (Intrusion Detection System): Theo dõi traffic, ghi log cảnh báo, không can thiệp
- IPS (Intrusion Prevention System): Chủ động block traffic nguy hiểm theo thời gian thực
- NSM (Network Security Monitoring): Ghi lại toàn bộ metadata của mọi kết nối
So với Snort — IDS truyền thống mà nhiều người đã quen — Suricata hỗ trợ multi-thread mặc định, tận dụng CPU đa nhân tốt hơn rõ rệt. TLS inspection, HTTP logging và file extraction được tích hợp sẵn, không cần cài plugin thêm. Rule format tương thích với Snort, nên nếu đang dùng Snort, migrate sang Suricata khá suôn sẻ.
Cấu hình Suricata chi tiết
Bước 1: Tải rule Emerging Threats
Rule là “từ điển” để Suricata nhận diện các mẫu tấn công. Emerging Threats Open là bộ rule miễn phí với ~45,000 signature, cập nhật hàng ngày:
sudo apt install suricata-update -y
sudo suricata-update update-sources
sudo suricata-update enable-source et/open
sudo suricata-update
# Kết quả: ~45,000 rule được tải về /var/lib/suricata/rules/suricata.rules
Bước 2: Chỉnh file cấu hình chính
Mở /etc/suricata/suricata.yaml và tìm 2 phần quan trọng nhất:
sudo nano /etc/suricata/suricata.yaml
Phần HOME_NET — khai báo dải IP nội bộ của bạn:
vars:
address-groups:
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
EXTERNAL_NET: "!$HOME_NET"
Phần af-packet — interface Suricata sẽ lắng nghe:
af-packet:
- interface: eth0 # Thay bằng interface thực tế
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
Bước 3: Kiểm tra cấu hình và khởi động service
# Kiểm tra cú pháp trước khi khởi động — bước này cứu bạn nhiều lần
sudo suricata -T -c /etc/suricata/suricata.yaml -v
# Nếu không có lỗi:
sudo systemctl enable suricata
sudo systemctl start suricata
sudo systemctl status suricata
Chuyển từ IDS sang IPS — Block traffic thật
Đây là bước mà nhiều hướng dẫn bỏ qua. IDS chỉ cảnh báo, còn IPS mới thực sự block được. Trên Linux, Suricata IPS hoạt động qua nfqueue — Netfilter Queue.
sudo apt install libnetfilter-queue1 -y
Chuyển traffic qua Suricata để kiểm tra trước khi cho đi:
# Forward traffic vào queue của Suricata
sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
sudo iptables -I INPUT -j NFQUEUE --queue-num 0
sudo iptables -I OUTPUT -j NFQUEUE --queue-num 0
# Lưu rule để giữ sau khi reboot
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
Chạy Suricata ở chế độ IPS (inline mode):
sudo suricata -c /etc/suricata/suricata.yaml -q 0
Bài học đắt giá: đừng bật IPS thẳng lên production. Mình từng kích hoạt IPS trên một server — nó block nhầm cả traffic của load balancer nội bộ, mất 2 tiếng debug mới tìm ra nguyên nhân. Chạy IDS ít nhất 1 tuần để observe false positive trước khi chuyển sang IPS.
Đọc và phân tích log Suricata
Các file log cần biết
Suricata tạo ra vài file log, mỗi cái phục vụ mục đích khác nhau:
ls /var/log/suricata/
# fast.log → Alert ngắn gọn, dễ đọc, real-time
# eve.json → Full JSON log, dùng cho SIEM/ELK Stack
# stats.log → Thống kê hiệu suất Suricata
Theo dõi alert real-time:
sudo tail -f /var/log/suricata/fast.log
# Ví dụ output:
# 03/03/2026-10:15:32 [**] [1:2100366:7] GPL ICMP_INFO PING *NIX [**] {ICMP} 203.0.113.5 -> 10.0.0.1
Cần lọc alert theo loại? Script Python này đọc eve.json và in ra dạng dễ đọc hơn:
sudo python3 -c "
import sys, json
with open('/var/log/suricata/eve.json') as f:
for line in f:
try:
e = json.loads(line)
if e.get('event_type') == 'alert':
print(f\"{e['timestamp']} | {e['alert']['signature']} | {e['src_ip']} -> {e['dest_ip']}\")
except:
pass
" | tail -20
Nâng cao: Viết rule tùy chỉnh và tích hợp fail2ban
Tạo custom rule phát hiện SSH brute force
sudo nano /etc/suricata/rules/local.rules
# Phát hiện brute force SSH: 10 lần kết nối trong 60 giây
alert tcp any any -> $HOME_NET 22 (msg:"SSH Brute Force Attempt"; flow:to_server; flags:S; threshold:type both, track by_src, count 10, seconds 60; classtype:attempted-admin; sid:9000001; rev:1;)
# Phát hiện port scan: 50 SYN packet trong 10 giây
alert tcp any any -> $HOME_NET any (msg:"Possible Port Scan Detected"; flags:S; threshold:type both, track by_src, count 50, seconds 10; classtype:network-scan; sid:9000002; rev:1;)
Thêm đường dẫn rule vào suricata.yaml:
rule-files:
- suricata.rules
- local.rules # Thêm dòng này
Kết hợp với fail2ban để auto-block
fail2ban đọc fast.log của Suricata và tự động thêm iptables rule khi phát hiện IP tấn công lặp lại:
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/filter.d/suricata.conf
[Definition]
failregex = ^\d{2}/\d{2}/\d{4}-\d{2}:\d{2}:\d{2}\.\d+ \[\*\*\] .* \[\*\*\].* \{TCP\} <HOST>:\d+ ->
ignoreregex =
sudo nano /etc/fail2ban/jail.d/suricata.conf
[suricata]
enabled = true
filter = suricata
logpath = /var/log/suricata/fast.log
maxretry = 3
bantime = 3600
findtime = 300
action = iptables-allports[name=suricata]
sudo systemctl restart fail2ban
sudo fail2ban-client status suricata
Những điều rút ra từ vận hành thực tế
- Eve.json lớn nhanh hơn bạn nghĩ: Mình từng thấy file đạt 50GB sau 2 tuần trên server traffic ~500Mbps. Bật
rotate-interval: daytrong phầneve-logcủa suricata.yaml và kết hợp logrotate — đừng để tới khi ổ cứng đầy lúc 3 giờ sáng mới xử lý - Whitelist IP nội bộ quan trọng: Load balancer, monitoring server, backup agent — thêm vào suppress list để tránh alert nhiễu
- Cập nhật rule tự động hàng ngày:
# Cron job update rule lúc 2 giờ sáng
echo "0 2 * * * root /usr/bin/suricata-update && /bin/systemctl reload suricata" | sudo tee /etc/cron.d/suricata-update
- Test rule trước khi reload, không ngoại lệ: Một lỗi syntax sẽ làm Suricata từ chối khởi động hoàn toàn
sudo suricata -T -c /etc/suricata/suricata.yaml -v
# Chỉ reload khi output clean
sudo systemctl reload suricata
- Theo dõi hiệu suất: Với traffic lớn (1Gbps+), Suricata có thể ngốn 30-40% CPU trên server 4 vCPU. Check
stats.logvà tăng số worker threads hoặc thu hẹp rule set nếu cần - Dùng Suricata cùng UFW: UFW lo phần firewall, Suricata lo phần phát hiện pattern tấn công — 2 lớp bảo vệ độc lập, không thay thế nhau

