Linux netfilter / kernel · Event net_ratelimit: callbacks suppressed
net_ratelimit: your firewall log is missing lines
The kernel throttles how fast it will print network messages, and this line is it admitting how many it threw away. Any count you calculate from netfilter LOG output during that window is wrong, usually by a lot — and this is the only warning you get.
Also written as net_ratelimit callbacks suppressedkernel net_ratelimitcallbacks suppressed iptables logmissing firewall log lines linux
How oftenFires regularly
Vendor calls itkern.warning
Logkern
Sourcekernel
What it means for you
On a personal computer
Your firewall was blocking things faster than the system could write them down, so it stopped writing some of them. Nothing broke — the packets were still handled correctly. Only the record of them is incomplete.
For an analyst
Two consequences worth internalising. First, any 'how many times did this source hit us' figure derived from LOG output is a floor, not a count, and the suppressed number is the only correction available. Second, an attacker who can generate enough noise can push the lines they care about into the suppressed window — flooding a firewall to bury a single connection is cheap and this message is where the evidence of it lives.
What it looks like
Sanitised. Addresses come from the RFC 5737 documentation ranges.
How many messages were dropped since the last such line. The number is the correction factor for anything you counted in that interval — a suppressed count of 400 next to 20 logged packets means you saw five per cent of them.
Timing
These lines appear at the end of a burst rather than the start, so the suppression applies to the period before the message, not after it.
Surrounding messages
The suppressed messages are whichever network printk was firing — usually a netfilter LOG or NFLOG target, but martian source and TCP warnings come from the same limiter and are suppressed by the same budget.
Ordinary reasons this happens
Most of the time it is one of these.
A broad LOG rule matching high-volume traffic — logging every dropped packet on an internet-facing host will hit the limiter within minutes of any scan.
A port scan or an internet background-radiation burst, where the volume is entirely inbound and entirely uninteresting.
Multicast and broadcast discovery on a busy LAN matching a catch-all drop-and-log rule.
A misconfigured application retrying a blocked connection thousands of times a second.
A backup or replication job hitting a rule that logs without limiting.
When it is not ordinary
Log flooding to hide a specific event inside the suppressed window.
What gives it awayA very large suppressed count immediately around the time of interest, with the surrounding traffic being trivially cheap to generate — spoofed sources, a single repeated port, no completed connections.
A scan or flood large enough to exceed the kernel's printing budget.
What gives it awaySustained suppression over minutes rather than a single burst, with the logged sample showing many destination ports or many source addresses.
Treat every count taken from the surrounding period as a lower bound, and say so explicitly in whatever you write up.
Add the suppressed totals across the window to estimate what you actually missed. It is a rough figure and it is far better than the logged count alone.
Put the rate limit in your rules rather than relying on the kernel's: `-m limit --limit 10/minute --limit-burst 20 -j LOG` gives you a predictable sample instead of an arbitrary one.
Better still for anything you intend to analyse, switch the LOG target for NFLOG and collect with ulogd. It buffers to userspace and does not share the kernel printk budget.
Narrow what you log. A rule that logs every dropped packet on an exposed host is not a security control; logging new connections to ports you care about is.
If suppression coincides with an incident window, note that gap in the timeline explicitly. A missing log line is not evidence of absence, and the suppressed count is your proof of that.
Queries to run
grepHow often the limiter is being hit at all. A non-zero answer means your firewall counts are incomplete.
grep -c 'callbacks suppressed' /var/log/kern.log
grepTotal suppressed messages in the file. Compare it against the number of logged packets to see how big a sample you actually have.
grepThe two knobs controlling the limiter. Raising message_burst trades log completeness against the kernel spending time printing rather than forwarding.
What does 'net_ratelimit: N callbacks suppressed' mean?
The kernel limits how many network-related messages it will print per unit of time so that logging cannot starve packet forwarding. When rules produce more messages than that budget allows, the extras are discarded and the kernel prints this line saying how many. Nothing went wrong with the traffic itself — only with the record of it.
Am I losing firewall log entries?
Yes, exactly as many as the number in the message. Those packets were still matched and still dropped or accepted according to your rules; the kernel simply did not write them down. This matters most when you are counting: a source that appears 20 times in the log may have hit you 400 times, and the suppressed count is the only clue.
How do I stop netfilter log messages being suppressed?
Rate-limit deliberately instead of leaving it to the kernel: add `-m limit --limit 10/minute --limit-burst 20` to your LOG rules so you get a predictable sample. For logs you actually intend to analyse, use the NFLOG target with ulogd rather than LOG — it delivers to userspace and does not compete for the kernel's printing budget. Raising net.core.message_burst is possible but trades forwarding performance for log volume.
Can an attacker use log suppression to hide?
In principle yes, and it is cheap to attempt. Generating enough throwaway traffic to saturate the limiter pushes other messages into the suppressed count, including ones that would otherwise have recorded something specific. A very large suppressed count around a time of interest, with the visible traffic being trivially generated, is worth noting rather than dismissing.