nftables queue target aborts rules processing unconditionally

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

The nft queueing seems to have broken the continuation of
rule processing when NF_ACCEPT is returned.

If have the following rules:

table ip filter {
	map client_to_any {
		type ipv4_addr : verdict
		elements = { 10.180.200.72 : goto CIn_1}
	}

	chain FORWARD {
		type filter hook forward priority 0; policy accept;
		iif { "eth0"} counter packets 1 bytes 84 goto client_to_any

	chain client_to_any {
		nftrace set 1 # handle 11
		counter packets 1 bytes 84 ip saddr vmap @client_to_any # handle 12
		counter packets 1 bytes 84 queue num 0 # handle 13
		counter packets 0 bytes 0 # handle 14
		counter packets 0 bytes 0 ip saddr vmap @client_to_any # handle 16
		goto DENY # handle 17
	}

}

The idea is that the first packet for an yet unknown client will
bypass rules #12, match rule 13 and land in queue 0. The userspace
process then generates the appropriate rules and return an NF_ACCEPT
on the queue.

This should continue the rule processing at rule #14 and finally
match on the update vmap in rule #16.

The problem is that the rule processing is not continuing as
you can see on the counters.

http://www.netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO.txt
clearly states:

> 1. NF_ACCEPT: continue traversal as normal.

So, why is the processing aborted?

It also appears as if the nft trace infrastructure does not now how to
deal with queues. The above rules lead to this annotated trace output:

> trace id 10d53daf ip filter client_to_any packet: iif "upstream" oif "ens256" ether saddr 00:50:56:96:9b:1c ether daddr 00:0c:29:46:1f:53 ether type ip6 

That's rule #11... Where is the hit on the queue rule and the return??

> add chain ip filter CIn_1
> add rule ip filter CIn_1 counter name "CIn_1_Session"
> add rule ip filter CIn_1 ip daddr 172.20.16.0/24 counter packets 0 bytes 0 accept
> add rule ip filter CIn_1 ip daddr 8.0.0.0/8 counter packets 0 bytes 0 accept
> add chain ip filter COut_1
> add rule ip filter COut_1 counter name "COut_1_Session"
> add rule ip filter COut_1 ip saddr 172.20.16.0/24 counter packets 0 bytes 0 accept
> add rule ip filter COut_1 ip saddr 8.0.0.0/8 counter packets 0 bytes 0 accept

This is the userspace process updating the rules. But the update of the
client_to_any verdict map is missing.

> trace id 10d53daf ip mangle POSTROUTING verdict continue 
> trace id 10d53daf ip mangle POSTROUTING 

The packets skipped the filter table processing completely. Not even the
application of the default accept policy is logged....

Also of this have been tested on net-next and nftables snapshot from 2017-03-01.

The missing trace are only cosmetic (albeit confusing during debugging), but
that the queue aborts the rule processing seems to be a bug.

Regards
Andreas
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux