Configuring Suricata for Network Monitoring
When to Use
- Deploying a high-performance IDS/IPS capable of multi-threaded packet processing for 10+ Gbps network links
- Monitoring network traffic with protocol-aware inspection for HTTP, TLS, DNS, SMB, and other protocols
- Generating structured EVE JSON logs for direct SIEM ingestion without custom parsers
- Running in inline (IPS) mode to actively block malicious traffic at network choke points
- Combining signature-based detection with protocol anomaly detection and file extraction
Do not use as a standalone security solution without complementary controls, for encrypted traffic inspection without TLS decryption capabilities, or on systems with insufficient CPU/memory for the expected traffic volume.
Prerequisites
- Suricata 7.0+ installed from PPA or source (
suricata --build-info)
- Network interface on a span port, tap, or inline bridge for traffic capture
- AF_PACKET or DPDK support for high-performance packet capture
- Emerging Threats Open or Pro ruleset subscription (or Snort Talos rules via oinkcode)
- suricata-update tool for automated rule management
- Elasticsearch/Kibana or Splunk for log analysis and visualization
Workflow
Step 1: Install Suricata and Dependencies
# Install from PPA (Ubuntu/Debian)
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install -y suricata suricata-update jq
# Verify installation
suricata --build-info | grep -E "Version|AF_PACKET|NFQueue"
# Or install from source for latest features
sudo apt install -y libpcre2-dev build-essential autoconf automake libtool \
libpcap-dev libnet1-dev libyaml-dev libjansson-dev libcap-ng-dev \
libmagic-dev libnetfilter-queue-dev libhiredis-dev rustc cargo cbindgen
git clone https://github.com/OISF/suricata.git
cd suricata && git clone https://github.com/OISF/libhtp.git -b 0.5.x
./autogen.sh && ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
--enable-nfqueue --enable-af-packet
make -j$(nproc) && sudo make install install-conf
Step 2: Configure Network Interfaces
# Disable NIC offloading features
sudo ethtool -K eth1 gro off lro off tso off gso off rx off tx off sg off
# Set interface to promiscuous mode
sudo ip link set eth1 promisc on
# For high-performance deployments, configure AF_PACKET with multiple threads
# Edit /etc/suricata/suricata.yaml
Step 3: Configure suricata.yaml
# /etc/suricata/suricata.yaml (key sections)
# Network variables
vars:
address-groups:
HOME_NET: "[10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16]"
EXTERNAL_NET: "!$HOME_NET"
HTTP_SERVERS: "$HOME_NET"
DNS_SERVERS: "$HOME_NET"
SMTP_SERVERS: "$HOME_NET"
# Default rule path
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules
# AF_PACKET configuration for high performance
af-packet:
- interface: eth1
threads: auto
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
use-mmap: yes
ring-size: 200000
buffer-size: 262144
# EVE JSON logging (primary output format)
outputs:
- eve-log:
enabled: yes
filetype: regular
filename: eve.json
pcap-file: false
community-id: true
types:
- alert:
tagged-packets: yes
payload: yes
payload-printable: yes
http-body: yes
http-body-printable: yes
- http:
extended: yes
- dns:
query: yes
answer: yes
- tls:
extended: yes
- files:
force-magic: yes
force-hash: [md5, sha256]
- smtp:
extended: yes
- flow
- netflow
- anomaly:
enabled: yes
- stats:
totals: yes
threads: yes
# PCAP logging for captured packets that trigger alerts
- pcap-log:
enabled: yes
filename: alert-%n.pcap
limit: 100mb
max-files: 50
mode: normal
use-stream-depth: no
honor-pass-rules: no
# Stream engine settings
stream:
memcap: 512mb
checksum-validation: no
reassembly:
memcap: 1gb
depth: 1mb
toserver-chunk-size: 2560
toclient-chunk-size: 2560
# Detection engine
detect:
profile: high
custom-values:
toclient-groups: 200
toserver-groups: 200
sgh-mpm-context: auto
inspection-recursion-limit: 3000
# Protocol detection and parsing
app-layer:
protocols:
http:
enabled: yes
memcap: 64mb
tls:
enabled: yes
detection-ports:
dp: 443, 8443
ja3-fingerprints: yes
dns:
enabled: yes
tcp:
enabled: yes
udp:
enabled: yes
smb:
enabled: yes
detection-ports:
dp: 139, 445
ssh:
enabled: yes
hassh: yes
Step 4: Download and Manage Rulesets
# Update Suricata rules using suricata-update
sudo suricata-update
# Enable additional rule sources
sudo suricata-update list-sources
sudo suricata-update enable-source et/open
sudo suricata-update enable-source oisf/trafficid
sudo suricata-update enable-source ptresearch/attackdetection
# Update with all enabled sources
sudo suricata-update
# Check rule statistics
sudo suricata-update list-sources --enabled
wc -l /var/lib/suricata/rules/suricata.rules
# Disable noisy rules
sudo tee /etc/suricata/disable.conf << 'EOF'
# Disable overly broad rules
2100498
2013028
2210000-2210050
group:emerging-policy.rules
EOF
# Create custom local rules
sudo tee /etc/suricata/rules/local.rules << 'EOF'
# Detect reverse shell connections
alert tcp $HOME_NET any -> $EXTERNAL_NET 4444 (msg:"LOCAL Reverse Shell Port 4444"; flow:established,to_server; content:"|2f 62 69 6e 2f|"; sid:9000001; rev:1; classtype:trojan-activity; priority:1;)
# Detect DNS tunneling by query length
alert dns $HOME_NET any -> any any (msg:"LOCAL DNS Tunneling Long Query"; dns.query; content:"."; offset:50; sid:9000002; rev:1; classtype:policy-violation; priority:2;)
# Detect TLS to suspicious JA3 hash (Cobalt Strike default)
alert tls $HOME_NET any -> $EXTERNAL_NET any (msg:"LOCAL Cobalt Strike JA3 Hash"; ja3.hash; content:"72a589da586844d7f0818ce684948eea"; sid:9000003; rev:1; classtype:trojan-activity; priority:1;)
# Detect SSH brute force
alert ssh $EXTERNAL_NET any -> $HOME_NET 22 (msg:"LOCAL SSH Brute Force Attempt"; flow:to_server; threshold:type both, track by_src, count 10, seconds 60; sid:9000004; rev:1; classtype:attempted-admin; priority:2;)
# Detect data exfiltration via HTTP POST (large uploads)
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"LOCAL Large HTTP POST Upload"; flow:to_server,established; http.method; content:"POST"; http.content_len; content:">"; byte_test:8,>,10000000,0,string; sid:9000005; rev:1; classtype:policy-violation; priority:2;)
EOF
# Add local rules to configuration
echo " - local.rules" | sudo tee -a /etc/suricata/suricata.yaml
Step 5: Deploy and Validate
# Validate configuration
sudo suricata -T -c /etc/suricata/suricata.yaml -v
# Run Suricata in IDS mode
sudo suricata -c /etc/suricata/suricata.yaml --af-packet=eth1 -D
# Or run in IPS mode (inline with NFQueue)
# First configure iptables to send traffic to NFQueue
# sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
# sudo suricata -c /etc/suricata/suricata.yaml -q 0 -D
# Create systemd service
sudo tee /etc/systemd/system/suricata.service << 'EOF'
[Unit]
Description=Suricata IDS/IPS
After=network.target
Requires=network.target
[Service]
Type=simple
ExecStartPre=/usr/bin/suricata -T -c /etc/suricata/suricata.yaml
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --af-packet=eth1 --pidfile /var/run/suricata.pid
ExecReload=/bin/kill -USR2 $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now suricata
# Test with a known signature
curl http://testmynids.org/uid/index.html
# Should trigger ET GPL rule for uid.
# Verify alerts are generated
sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
Step 6: Integrate with SIEM and Monitor
# Parse EVE JSON with jq for quick analysis
# Top 10 alerts
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .alert.signature' | sort | uniq -c | sort -rn | head -10
# Extract IOCs from alerts
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | [.timestamp, .src_ip, .dest_ip, .alert.signature, .alert.severity] | @csv' > alert_summary.csv
# JA3 fingerprint analysis
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="tls") | [.src_ip, .tls.ja3.hash, .tls.sni] | @csv' | sort | uniq -c | sort -rn
# DNS query analysis
cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="dns" and .dns.type=="query") | [.src_ip, .dns.rrname, .dns.rrtype] | @csv' | sort | uniq -c | sort -rn | head -20
# Configure Filebeat for Elastic integration
sudo tee /etc/filebeat/modules.d/suricata.yml << 'EOF'
- module: suricata
eve:
enabled: true
var.paths: ["/var/log/suricata/eve.json"]
EOF
sudo filebeat modules enable suricata
sudo systemctl restart filebeat
# Monitor Suricata performance
cat /var/log/suricata/eve.json | jq 'select(.event_type=="stats") | .stats.capture' | tail -1
# Check for packet drops: kernel_drops should be 0
Key Concepts
| Term |
Definition |
| EVE JSON |
Suricata's primary logging format producing structured JSON events for alerts, protocol metadata, flow records, and statistics |
| AF_PACKET |
Linux kernel packet capture mechanism used by Suricata for high-performance traffic capture with kernel-bypass capabilities |
| JA3/JA3S |
TLS fingerprinting method that creates hash values from TLS Client Hello and Server Hello parameters for identifying applications and malware |
| HASSH |
SSH fingerprinting method similar to JA3 that creates hashes from SSH key exchange parameters to identify SSH client and server implementations |
| Community ID |
Standardized flow identifier hash that enables correlation of the same network flow across different monitoring tools (Suricata, Zeek, Wireshark) |
| suricata-update |
Official rule management tool that downloads, merges, and manages multiple rulesets with enable/disable controls |
Tools & Systems
- Suricata 7.0+: Open-source multi-threaded IDS/IPS/NSM engine with protocol detection, file extraction, and JA3/HASSH fingerprinting
- suricata-update: Ruleset management tool supporting ET Open, ET Pro, Snort rules, and custom rule sources
- Elastic Stack (ELK): Log aggregation and visualization platform with native Suricata module in Filebeat for dashboards and alerting
- Scirius: Web-based Suricata rule management interface for editing, enabling/disabling, and monitoring rule performance
- Evebox: Lightweight event viewer for Suricata EVE JSON logs with alert management and escalation capabilities
Common Scenarios
Scenario: Deploying Suricata IDS on a 10 Gbps Enterprise Network Perimeter
Context: A technology company needs to deploy IDS at their internet egress point handling 10 Gbps of traffic. They require protocol-level metadata logging for threat hunting, signature-based alerting for known threats, and JA3 fingerprinting for detecting malware C2 communications. Alerts must feed into their Elastic SIEM.
Approach:
- Deploy Suricata on a server with 16 CPU cores, 64 GB RAM, and dual 10G NICs using AF_PACKET with 14 worker threads
- Enable ET Open and ptresearch/attackdetection rulesets via suricata-update, totaling approximately 35,000 active rules
- Configure EVE JSON logging with community-id, extended HTTP/TLS/DNS metadata, and file hashing (MD5 + SHA256)
- Enable JA3 and HASSH fingerprinting for TLS and SSH traffic profiling
- Write custom rules for organization-specific threats: known bad JA3 hashes, DNS queries to DGA domains, large data uploads to uncommon destinations
- Integrate with Elastic via Filebeat's Suricata module, deploying pre-built Kibana dashboards for real-time visibility
- Tune rules over a 2-week baseline period, disabling false-positive generators and adjusting thresholds
Pitfalls:
- Not allocating sufficient CPU threads, causing packet drops at peak traffic volumes
- Enabling all available rules without tuning, overwhelming analysts with false positives
- Forgetting to disable NIC offloading, resulting in incorrect checksums and missed detections
- Not enabling community-id, making it difficult to correlate Suricata events with Zeek or other tools
Output Format
## Suricata IDS Deployment Report
**Sensor**: suricata-gw-01 (10.10.1.251)
**Interface**: eth1 (span from border router)
**Configuration**: /etc/suricata/suricata.yaml
**Worker Threads**: 14 AF_PACKET threads
**Active Rules**: 35,247 (ET Open + Custom)
### Performance Metrics (24-hour)
| Metric | Value |
|--------|-------|
| Packets Processed | 847,293,421 |
| Kernel Drops | 0 (0.000%) |
| Alerts Generated | 1,247 |
| Unique Signatures Fired | 89 |
| JA3 Fingerprints Observed | 342 unique |
| Files Extracted | 2,847 |
### Top 10 Alert Signatures
| Count | SID | Signature | Severity |
|-------|-----|-----------|----------|
| 312 | 2024897 | ET POLICY curl User-Agent Outbound | 3 |
| 189 | 9000003 | LOCAL Cobalt Strike JA3 Hash | 1 |
| 145 | 2028765 | ET SCAN Nmap SYN Scan | 2 |
| 98 | 9000002 | LOCAL DNS Tunneling Long Query | 2 |
### Critical Alerts Requiring Immediate Triage
1. SID 9000003: Cobalt Strike JA3 from 10.10.5.12 to 203.0.113.50 (189 alerts)
2. SID 9000002: DNS tunneling from 10.10.3.45 to suspect-domain.xyz (98 alerts)
1---2name: configuring-suricata-for-network-monitoring3description: Deploys and configures Suricata IDS/IPS with Emerging Threats rulesets, EVE JSON logging, and custom rules for high-throughput, protocol-aware traffic inspection (HTTP, TLS, DNS, SMB) and SIEM integration. Use when running Suricata in IDS or inline IPS mode to detect or block malicious traffic, or when combining signature-based and protocol anomaly detection with file extraction.4license: Apache-2.05---6# Configuring Suricata for Network Monitoring
7
8## When to Use
9
10- Deploying a high-performance IDS/IPS capable of multi-threaded packet processing for 10+ Gbps network links
11- Monitoring network traffic with protocol-aware inspection for HTTP, TLS, DNS, SMB, and other protocols
12- Generating structured EVE JSON logs for direct SIEM ingestion without custom parsers
13- Running in inline (IPS) mode to actively block malicious traffic at network choke points
14- Combining signature-based detection with protocol anomaly detection and file extraction
15
16**Do not use** as a standalone security solution without complementary controls, for encrypted traffic inspection without TLS decryption capabilities, or on systems with insufficient CPU/memory for the expected traffic volume.
17
18## Prerequisites
19
20- Suricata 7.0+ installed from PPA or source (`suricata --build-info`)
21- Network interface on a span port, tap, or inline bridge for traffic capture
22- AF_PACKET or DPDK support for high-performance packet capture
23- Emerging Threats Open or Pro ruleset subscription (or Snort Talos rules via oinkcode)
24- suricata-update tool for automated rule management
25- Elasticsearch/Kibana or Splunk for log analysis and visualization
26
27## Workflow
28
29### Step 1: Install Suricata and Dependencies
30
31```bash
32# Install from PPA (Ubuntu/Debian)
33sudo add-apt-repository ppa:oisf/suricata-stable
34sudo apt update
35sudo apt install -y suricata suricata-update jq
36
37# Verify installation
38suricata --build-info | grep -E "Version|AF_PACKET|NFQueue"
39
40# Or install from source for latest features
41sudo apt install -y libpcre2-dev build-essential autoconf automake libtool \
42 libpcap-dev libnet1-dev libyaml-dev libjansson-dev libcap-ng-dev \
43 libmagic-dev libnetfilter-queue-dev libhiredis-dev rustc cargo cbindgen
44git clone https://github.com/OISF/suricata.git
45cd suricata && git clone https://github.com/OISF/libhtp.git -b 0.5.x
46./autogen.sh && ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
47 --enable-nfqueue --enable-af-packet
48make -j$(nproc) && sudo make install install-conf
49```
50
51### Step 2: Configure Network Interfaces
52
53```bash
54# Disable NIC offloading features
55sudo ethtool -K eth1 gro off lro off tso off gso off rx off tx off sg off
56
57# Set interface to promiscuous mode
58sudo ip link set eth1 promisc on
59
60# For high-performance deployments, configure AF_PACKET with multiple threads
61# Edit /etc/suricata/suricata.yaml
62```
63
64### Step 3: Configure suricata.yaml
65
66```yaml
67# /etc/suricata/suricata.yaml (key sections)
68
69# Network variables
70vars:
71 address-groups:
72 HOME_NET: "[10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16]"
73 EXTERNAL_NET: "!$HOME_NET"
74 HTTP_SERVERS: "$HOME_NET"
75 DNS_SERVERS: "$HOME_NET"
76 SMTP_SERVERS: "$HOME_NET"
77
78# Default rule path
79default-rule-path: /var/lib/suricata/rules
80rule-files:
81 - suricata.rules
82
83# AF_PACKET configuration for high performance
84af-packet:
85 - interface: eth1
86 threads: auto
87 cluster-id: 99
88 cluster-type: cluster_flow
89 defrag: yes
90 use-mmap: yes
91 ring-size: 200000
92 buffer-size: 262144
93
94# EVE JSON logging (primary output format)
95outputs:
96 - eve-log:
97 enabled: yes
98 filetype: regular
99 filename: eve.json
100 pcap-file: false
101 community-id: true
102 types:
103 - alert:
104 tagged-packets: yes
105 payload: yes
106 payload-printable: yes
107 http-body: yes
108 http-body-printable: yes
109 - http:
110 extended: yes
111 - dns:
112 query: yes
113 answer: yes
114 - tls:
115 extended: yes
116 - files:
117 force-magic: yes
118 force-hash: [md5, sha256]
119 - smtp:
120 extended: yes
121 - flow
122 - netflow
123 - anomaly:
124 enabled: yes
125 - stats:
126 totals: yes
127 threads: yes
128
129 # PCAP logging for captured packets that trigger alerts
130 - pcap-log:
131 enabled: yes
132 filename: alert-%n.pcap
133 limit: 100mb
134 max-files: 50
135 mode: normal
136 use-stream-depth: no
137 honor-pass-rules: no
138
139# Stream engine settings
140stream:
141 memcap: 512mb
142 checksum-validation: no
143 reassembly:
144 memcap: 1gb
145 depth: 1mb
146 toserver-chunk-size: 2560
147 toclient-chunk-size: 2560
148
149# Detection engine
150detect:
151 profile: high
152 custom-values:
153 toclient-groups: 200
154 toserver-groups: 200
155 sgh-mpm-context: auto
156 inspection-recursion-limit: 3000
157
158# Protocol detection and parsing
159app-layer:
160 protocols:
161 http:
162 enabled: yes
163 memcap: 64mb
164 tls:
165 enabled: yes
166 detection-ports:
167 dp: 443, 8443
168 ja3-fingerprints: yes
169 dns:
170 enabled: yes
171 tcp:
172 enabled: yes
173 udp:
174 enabled: yes
175 smb:
176 enabled: yes
177 detection-ports:
178 dp: 139, 445
179 ssh:
180 enabled: yes
181 hassh: yes
182```
183
184### Step 4: Download and Manage Rulesets
185
186```bash
187# Update Suricata rules using suricata-update
188sudo suricata-update
189
190# Enable additional rule sources
191sudo suricata-update list-sources
192sudo suricata-update enable-source et/open
193sudo suricata-update enable-source oisf/trafficid
194sudo suricata-update enable-source ptresearch/attackdetection
195
196# Update with all enabled sources
197sudo suricata-update
198
199# Check rule statistics
200sudo suricata-update list-sources --enabled
201wc -l /var/lib/suricata/rules/suricata.rules
202
203# Disable noisy rules
204sudo tee /etc/suricata/disable.conf << 'EOF'
205# Disable overly broad rules
2062100498
2072013028
2082210000-2210050
209group:emerging-policy.rules
210EOF
211
212# Create custom local rules
213sudo tee /etc/suricata/rules/local.rules << 'EOF'
214# Detect reverse shell connections
215alert tcp $HOME_NET any -> $EXTERNAL_NET 4444 (msg:"LOCAL Reverse Shell Port 4444"; flow:established,to_server; content:"|2f 62 69 6e 2f|"; sid:9000001; rev:1; classtype:trojan-activity; priority:1;)
216
217# Detect DNS tunneling by query length
218alert dns $HOME_NET any -> any any (msg:"LOCAL DNS Tunneling Long Query"; dns.query; content:"."; offset:50; sid:9000002; rev:1; classtype:policy-violation; priority:2;)
219
220# Detect TLS to suspicious JA3 hash (Cobalt Strike default)
221alert tls $HOME_NET any -> $EXTERNAL_NET any (msg:"LOCAL Cobalt Strike JA3 Hash"; ja3.hash; content:"72a589da586844d7f0818ce684948eea"; sid:9000003; rev:1; classtype:trojan-activity; priority:1;)
222
223# Detect SSH brute force
224alert ssh $EXTERNAL_NET any -> $HOME_NET 22 (msg:"LOCAL SSH Brute Force Attempt"; flow:to_server; threshold:type both, track by_src, count 10, seconds 60; sid:9000004; rev:1; classtype:attempted-admin; priority:2;)
225
226# Detect data exfiltration via HTTP POST (large uploads)
227alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"LOCAL Large HTTP POST Upload"; flow:to_server,established; http.method; content:"POST"; http.content_len; content:">"; byte_test:8,>,10000000,0,string; sid:9000005; rev:1; classtype:policy-violation; priority:2;)
228EOF
229
230# Add local rules to configuration
231echo " - local.rules" | sudo tee -a /etc/suricata/suricata.yaml
232```
233
234### Step 5: Deploy and Validate
235
236```bash
237# Validate configuration
238sudo suricata -T -c /etc/suricata/suricata.yaml -v
239
240# Run Suricata in IDS mode
241sudo suricata -c /etc/suricata/suricata.yaml --af-packet=eth1 -D
242
243# Or run in IPS mode (inline with NFQueue)
244# First configure iptables to send traffic to NFQueue
245# sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
246# sudo suricata -c /etc/suricata/suricata.yaml -q 0 -D
247
248# Create systemd service
249sudo tee /etc/systemd/system/suricata.service << 'EOF'
250[Unit]
251Description=Suricata IDS/IPS
252After=network.target
253Requires=network.target
254
255[Service]
256Type=simple
257ExecStartPre=/usr/bin/suricata -T -c /etc/suricata/suricata.yaml
258ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --af-packet=eth1 --pidfile /var/run/suricata.pid
259ExecReload=/bin/kill -USR2 $MAINPID
260Restart=on-failure
261
262[Install]
263WantedBy=multi-user.target
264EOF
265
266sudo systemctl enable --now suricata
267
268# Test with a known signature
269curl http://testmynids.org/uid/index.html
270# Should trigger ET GPL rule for uid.
271
272# Verify alerts are generated
273sudo tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
274```
275
276### Step 6: Integrate with SIEM and Monitor
277
278```bash
279# Parse EVE JSON with jq for quick analysis
280# Top 10 alerts
281cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | .alert.signature' | sort | uniq -c | sort -rn | head -10
282
283# Extract IOCs from alerts
284cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="alert") | [.timestamp, .src_ip, .dest_ip, .alert.signature, .alert.severity] | @csv' > alert_summary.csv
285
286# JA3 fingerprint analysis
287cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="tls") | [.src_ip, .tls.ja3.hash, .tls.sni] | @csv' | sort | uniq -c | sort -rn
288
289# DNS query analysis
290cat /var/log/suricata/eve.json | jq -r 'select(.event_type=="dns" and .dns.type=="query") | [.src_ip, .dns.rrname, .dns.rrtype] | @csv' | sort | uniq -c | sort -rn | head -20
291
292# Configure Filebeat for Elastic integration
293sudo tee /etc/filebeat/modules.d/suricata.yml << 'EOF'
294- module: suricata
295 eve:
296 enabled: true
297 var.paths: ["/var/log/suricata/eve.json"]
298EOF
299
300sudo filebeat modules enable suricata
301sudo systemctl restart filebeat
302
303# Monitor Suricata performance
304cat /var/log/suricata/eve.json | jq 'select(.event_type=="stats") | .stats.capture' | tail -1
305# Check for packet drops: kernel_drops should be 0
306```
307
308## Key Concepts
309
310| Term | Definition |
311|------|------------|
312| **EVE JSON** | Suricata's primary logging format producing structured JSON events for alerts, protocol metadata, flow records, and statistics |
313| **AF_PACKET** | Linux kernel packet capture mechanism used by Suricata for high-performance traffic capture with kernel-bypass capabilities |
314| **JA3/JA3S** | TLS fingerprinting method that creates hash values from TLS Client Hello and Server Hello parameters for identifying applications and malware |
315| **HASSH** | SSH fingerprinting method similar to JA3 that creates hashes from SSH key exchange parameters to identify SSH client and server implementations |
316| **Community ID** | Standardized flow identifier hash that enables correlation of the same network flow across different monitoring tools (Suricata, Zeek, Wireshark) |
317| **suricata-update** | Official rule management tool that downloads, merges, and manages multiple rulesets with enable/disable controls |
318
319## Tools & Systems
320
321- **Suricata 7.0+**: Open-source multi-threaded IDS/IPS/NSM engine with protocol detection, file extraction, and JA3/HASSH fingerprinting
322- **suricata-update**: Ruleset management tool supporting ET Open, ET Pro, Snort rules, and custom rule sources
323- **Elastic Stack (ELK)**: Log aggregation and visualization platform with native Suricata module in Filebeat for dashboards and alerting
324- **Scirius**: Web-based Suricata rule management interface for editing, enabling/disabling, and monitoring rule performance
325- **Evebox**: Lightweight event viewer for Suricata EVE JSON logs with alert management and escalation capabilities
326
327## Common Scenarios
328
329### Scenario: Deploying Suricata IDS on a 10 Gbps Enterprise Network Perimeter
330
331**Context**: A technology company needs to deploy IDS at their internet egress point handling 10 Gbps of traffic. They require protocol-level metadata logging for threat hunting, signature-based alerting for known threats, and JA3 fingerprinting for detecting malware C2 communications. Alerts must feed into their Elastic SIEM.
332
333**Approach**:
3341. Deploy Suricata on a server with 16 CPU cores, 64 GB RAM, and dual 10G NICs using AF_PACKET with 14 worker threads
3352. Enable ET Open and ptresearch/attackdetection rulesets via suricata-update, totaling approximately 35,000 active rules
3363. Configure EVE JSON logging with community-id, extended HTTP/TLS/DNS metadata, and file hashing (MD5 + SHA256)
3374. Enable JA3 and HASSH fingerprinting for TLS and SSH traffic profiling
3385. Write custom rules for organization-specific threats: known bad JA3 hashes, DNS queries to DGA domains, large data uploads to uncommon destinations
3396. Integrate with Elastic via Filebeat's Suricata module, deploying pre-built Kibana dashboards for real-time visibility
3407. Tune rules over a 2-week baseline period, disabling false-positive generators and adjusting thresholds
341
342**Pitfalls**:
343- Not allocating sufficient CPU threads, causing packet drops at peak traffic volumes
344- Enabling all available rules without tuning, overwhelming analysts with false positives
345- Forgetting to disable NIC offloading, resulting in incorrect checksums and missed detections
346- Not enabling community-id, making it difficult to correlate Suricata events with Zeek or other tools
347
348## Output Format
349
350```
351## Suricata IDS Deployment Report
352
353**Sensor**: suricata-gw-01 (10.10.1.251)
354**Interface**: eth1 (span from border router)
355**Configuration**: /etc/suricata/suricata.yaml
356**Worker Threads**: 14 AF_PACKET threads
357**Active Rules**: 35,247 (ET Open + Custom)
358
359### Performance Metrics (24-hour)
360
361| Metric | Value |
362|--------|-------|
363| Packets Processed | 847,293,421 |
364| Kernel Drops | 0 (0.000%) |
365| Alerts Generated | 1,247 |
366| Unique Signatures Fired | 89 |
367| JA3 Fingerprints Observed | 342 unique |
368| Files Extracted | 2,847 |
369
370### Top 10 Alert Signatures
371
372| Count | SID | Signature | Severity |
373|-------|-----|-----------|----------|
374| 312 | 2024897 | ET POLICY curl User-Agent Outbound | 3 |
375| 189 | 9000003 | LOCAL Cobalt Strike JA3 Hash | 1 |
376| 145 | 2028765 | ET SCAN Nmap SYN Scan | 2 |
377| 98 | 9000002 | LOCAL DNS Tunneling Long Query | 2 |
378
379### Critical Alerts Requiring Immediate Triage
3801. SID 9000003: Cobalt Strike JA3 from 10.10.5.12 to 203.0.113.50 (189 alerts)
3812. SID 9000002: DNS tunneling from 10.10.3.45 to suspect-domain.xyz (98 alerts)
382```