mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
netfilter: nf_conncount: prevent connlimit drops for early confirmed ct
Commit69894e5b4c("netfilter: nft_connlimit: update the count if add was skipped") introduced a regression where packets for valid connections are dropped when using connlimit for soft-limiting scenarios. The issue occurs when a new connection reuses a socket currently in the TIME_WAIT state. In this scenario, the connection tracking entry is evaluated as already confirmed. Previously, __nf_conncount_add() assumed that if a connection was confirmed and did not originate from the loopback interface, it should skip the addition and return -EEXIST. Skipping the addition triggers a garbage collection run that cleans up the TIME_WAIT connection. Consequently, the active connection count drops to 0, which xt_connlimit mishandles, leading to the false rejection of the perfectly valid new connection. Fix this by replacing the interface check with protocol-agnostic state checks. We now skip the tree insertion and preserve the lockless garbage collection optimization only if the connection is IPS_ASSURED. This allows early-confirmed setup packets (such as reused TIME_WAIT sockets or locally generated SYN-ACKs) to be properly evaluated and counted without falsely dropping. The goto check_connections path is maintained to ensure these setup packets are deduplicated correctly. This has been tested with slowhttptest and HTTP server configured locally to ensure we are not breaking soft-limiting scenarios for local or external connections. In addition, it was tested with a OVS zone limit too. Fixes:69894e5b4c("netfilter: nft_connlimit: update the count if add was skipped") Reported-by: Alejandro Olivan Alvarez <alejandro.olivan.alvarez@gmail.com> Closes: https://lore.kernel.org/netfilter-devel/177349610461.3071718.4083978280323144323@eldamar.lan/ Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
069cfe3de2
commit
c8b6f36f76
|
|
@ -183,17 +183,16 @@ static int __nf_conncount_add(struct net *net,
|
|||
return -ENOENT;
|
||||
|
||||
if (ct && nf_ct_is_confirmed(ct)) {
|
||||
/* local connections are confirmed in postrouting so confirmation
|
||||
* might have happened before hitting connlimit
|
||||
/* Connection is confirmed but might still be in the setup phase.
|
||||
* Only skip the tracking if it is fully assured. This guarantees
|
||||
* that setup packets or retransmissions are properly counted and
|
||||
* deduplicated.
|
||||
*/
|
||||
if (skb->skb_iif != LOOPBACK_IFINDEX) {
|
||||
if (test_bit(IPS_ASSURED_BIT, &ct->status)) {
|
||||
err = -EEXIST;
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
/* this is likely a local connection, skip optimization to avoid
|
||||
* adding duplicates from a 'packet train'
|
||||
*/
|
||||
goto check_connections;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user