You point pfSense at Wazuh, the logs arrive, and the dashboard stays empty. Most people assume the integration is broken. On Wazuh 4.14.7 it usually is not: there are two separate reasons, and one of them is by design.
We sent pfSense filterlog lines over UDP syslog to a Wazuh 4.14.7 manager container and read archives.log and alerts.json.
Reason 1: rule 87701 carries no_log
The stock pfSense rules live in ruleset/rules/0540-pfsense_rules.xml:
| Rule | Level | Matches | Becomes an alert? |
|---|---|---|---|
| 87700 | 0 | any filterlog event decoded as pf
|
no (level 0) |
| 87701 | 5 |
action = block |
no: it has <options>no_log</options>
|
| 87702 | 10 | 18 × 87701 from one source IP within 45 s | yes |
The comment above 87701 says: "We don't log firewall events, because they go to their own log file." Pass events stop at 87700.
What we measured:
- One block line over UDP 514: it reached
archives.log;alerts.jsonstayed empty. - 18 block lines from one address within the window: the 18th came back as 87702, level 10.
So a working integration shows nothing until one address is blocked 18 times in 45 seconds.
One trap while testing: wazuh-logtest prints "Alert to be generated" for 87701 anyway. Logtest does not apply no_log. Check alerts.json, not logtest.
Reason 2: RFC 5424 lines match no decoder
pfSense can log in BSD (RFC 3164) or RFC 5424 format. The stock decoder is keyed on <program_name>filterlog</program_name>, which Wazuh's pre-decoder reads from a BSD-style header. Over UDP on 4.14.7:
| Line sent | Decoder |
|---|---|
Oct 2 15:00:01 pfSense filterlog[12345]: 5,,,1000000103,igb1,match,block,… |
pf: srcip, dstip, action read |
2026-10-02T15:00:01.123456+07:00 pfSense.home.arpa filterlog[12345]: … |
pf: read |
<134>1 2026-10-02T15:00:01.123456+07:00 pfSense.home.arpa filterlog 12345 - - … |
No decoder matched |
With RFC 5424, archives.log even shows the manager's own host name instead of the firewall's: the header was never parsed.
The fix
- Send BSD format. In pfSense, Status → System Logs → Settings, set the log message format to BSD (RFC 3164).
-
Decide which blocks you want as alerts. To alert on every block, overwrite 87701 without
no_login/var/ossec/etc/rules/local_rules.xml:
<group name="local,pfsense,">
<rule id="87701" level="5" overwrite="yes">
<if_sid>87700</if_sid>
<action>block</action>
<description>pfSense firewall drop event.</description>
<group>firewall_block,pci_dss_1.4,gpg13_4.12,hipaa_164.312.a.1,nist_800_53_SC.7,tsc_CC6.7,tsc_CC6.8,</group>
</rule>
</group>
On 4.14.7 this loaded with no warnings, and the same single block line that produced nothing produced one 87701 alert. An internet-facing firewall blocks a lot, so many people prefer a narrower child rule (one interface, one port) and leave 87701 alone.
Limits
Measured on a Wazuh 4.14.7 manager container, with syslog over UDP from 127.0.0.1 and in wazuh-logtest. We did not run a pfSense box: the lines were written in the filterlog format for one IPv4 TCP block and one pass. Not measured: IPv6, other pfSense programs, OPNsense, other Wazuh versions.
Full note with the one-minute checks: https://atkvn.com/fix-pfsense-logs-not-showing-in-wazuh.html
Dong Nguyen, ATK New Technology. We check and fix Wazuh rules for people who run it.
Top comments (0)