Verifying Kernel Module Availability
A common misconception is that theLOG target requires external packages like xtables-addons-common. This is incorrect for standard Ubuntu 22.04 installations. The logging functionality is integrated into the mainline kernel modules loaded by default. You can verify that the necessary netfilter components are active by checking for the presence of the xt_LOG module in the running kernel.
Run the following command to confirm the module is loaded:
lsmod | grep xt_LOG
If this command returns a result showing xt_LOG, the kernel support is present and functioning. If it returns nothing, ensure that your kernel was compiled with netfilter logging enabled, which is the default for Ubuntu kernels. There is no need to manually run modprobe xt_LOG unless you have a custom kernel configuration that explicitly disables it. Most users encountering logging issues have correctly loaded modules but misconfigured the firewall rules themselves.
Rule Ordering and Chain Logic
The most frequent cause of "missing" logs is the order in which rules are evaluated within an iptables chain. Netfilter processes rules sequentially from top to bottom. If you add aLOG rule after a DROP or REJECT rule that matches the same traffic, the packet will be discarded before it ever reaches the logging rule. Consequently, no log entry is generated, leading administrators to believe the logging mechanism is broken.
To diagnose this, inspect your current rules using verbose output to see hit counters. Use the -v flag with iptables -L to view how many packets have matched each rule.
iptables -L INPUT -n -v --line-numbers
Look at the packet counts. If your DROP rule has a high count but your LOG rule shows zero hits, the ordering is the problem. You must insert the LOG rule before any terminating rules. For example, if you want to log and then drop SSH connections, the rule should look like this:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_DROP: "
Followed immediately by:
iptables -A INPUT -p tcp --dport 22 -j DROP
Or better yet, use -I (insert) to place the log rule at the top of the chain temporarily for testing:
iptables -I INPUT 1 -p tcp --dport 22 -j LOG --log-prefix "TEST_LOG: "
This ensures the packet is logged regardless of subsequent rules. Once verified, adjust your permanent ruleset to maintain this logical order.
Checking Systemd Journal Filters
In Ubuntu 22.04, system logs are managed bysystemd-journald. Even if iptables generates the log message correctly, the journal service might filter it out based on priority or facility settings. By default, iptables logs messages with a priority level that corresponds to kernel alerts or notices.
Check the journal for recent iptables entries using journalctl. Filter specifically for the kern facility and the keyword iptables.
journalctl -k | grep iptables
If you see entries here but they do not appear in /var/log/syslog, it indicates that rsyslog or another legacy logger is not capturing them. Modern Ubuntu versions rely heavily on journald. Ensure that your search queries include the -k flag to view kernel messages, as iptables operates at the kernel level.
You can also adjust the verbosity of the logs by specifying a prefix in your iptables rule. This helps distinguish your logs from other kernel noise.
iptables -A INPUT -j LOG --log-prefix "MY_FIREWALL: " --log-level 4
The --log-level option accepts values like debug, info, notice, warning, err, etc. Level 4 corresponds to warning. If your system filters out lower priorities, raising the level may make the logs visible in standard system logs.
Network Namespace Considerations
If you are managing containers or virtual machines, remember that iptables rules are specific to network namespaces. A rule added in the host namespace will not affect traffic inside a container's namespace. Ensure you are viewing the correct namespace when troubleshooting. For Docker containers, rules are often managed bydocker-proxy and stored in the DOCKER-USER chain. If you are adding rules directly to INPUT or FORWARD without considering the bridge interfaces, you may miss the actual traffic path. Refer to our guide on IPTables: NAT Source Address Bridge Interface on Linux for details on handling bridged traffic.
Additionally, check if ufw (Uncomplicated Firewall) is interfering. Ufw manages its own chains and inserts rules dynamically. Manually editing iptables while ufw is active can lead to unpredictable behavior. Disable ufw if you intend to manage iptables directly.
ufw disable
After disabling, flush the existing rules to start clean if necessary, though caution is advised as this will drop all active connections.
Conclusion
Troubleshooting iptables logging in Ubuntu 22.04 requires verifying kernel module status, ensuring correct rule ordering, and checking journal filters. TheLOG target is native and reliable when configured correctly. By focusing on these three areas, you can resolve most logging discrepancies without modifying system configurations unnecessarily. For related issues regarding packet drops, see Troubleshooting Dropping Packets in iptables.
Frequently Asked Questions
Why are my iptables logs not appearing in /var/log/syslog?
In Ubuntu 22.04, logs are primarily stored in the systemd journal rather than plain text files by default. Use journalctl -k | grep iptables to find them. If you strictly need them in syslog, ensure rsyslog is installed and configured to accept kernel messages.
Does the LOG target slow down my server?
Logging adds minimal overhead, but excessive logging of high-traffic patterns can impact performance. Always limit log rules to specific ports or IP ranges and avoid logging every single packet in broad chains.
How do I remove a specific iptables rule?
Use iptables -D CHAIN RULE_NUMBER to delete a rule by its line number, or specify the exact rule parameters with -D. Using --line-numbers in list commands helps identify the correct index.
Can I log dropped packets automatically?
No, iptables only logs what the rule explicitly tells it to log. You must add a separate LOG rule before any DROP rule to capture the packet information before it is discarded.
What is the difference between LOG and REJECT targets?
The LOG target records the packet details in the system log but allows the packet to continue processing through subsequent rules. The REJECT target sends an error response back to the sender and stops further processing of that packet.