]> git.ipfire.org Git - thirdparty/nftables.git/log
thirdparty/nftables.git
8 years agoevaluate: Update cache on flush ruleset
Anatole Denis [Thu, 1 Dec 2016 10:50:17 +0000 (11:50 +0100)] 
evaluate: Update cache on flush ruleset

After a flush, the cache should be empty, otherwise the cache and the expected
state are desynced, causing unwarranted errors. See
tests/shell/testcases/cache/0002_interval_0.

`flush table` and `flush chain` don't empty sets or destroy chains, so the cache
does not need an update in those cases, since only chain names and set contents
are held in cache for commands other than "list"

Reported-by: Leon Merten Lohse <leon@green-side.de>
Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agorule: Introduce helper function cache_flush
Anatole Denis [Thu, 1 Dec 2016 10:50:16 +0000 (11:50 +0100)] 
rule: Introduce helper function cache_flush

cache_release empties the cache, and marks it as uninitialized. Add cache_flush,
which does the same, except it keeps the cache initialized, eg. after a "nft
flush ruleset" when empty is the correct state of the cache.

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: honor -nn option from inet_service_type_print()
Pablo Neira Ayuso [Wed, 30 Nov 2016 22:03:46 +0000 (23:03 +0100)] 
datatype: honor -nn option from inet_service_type_print()

If -nn is passed, we have to display ports in numbers, not as a symbol.

Fixes: ccc5da470e76 ("datatype: Replace getnameinfo() by internal lookup table")
Reported-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: Test TCP flags match with parentheses
Phil Sutter [Wed, 30 Nov 2016 21:07:14 +0000 (22:07 +0100)] 
tests: py: Test TCP flags match with parentheses

This should test the fix in commit 7222680eb328b ("parser_bison: Allow
parens on RHS of relational_expr").

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agobison: remove old log level tokens
Florian Westphal [Wed, 30 Nov 2016 19:33:14 +0000 (20:33 +0100)] 
bison: remove old log level tokens

not used anymore since 0423caa91ad26e7 ("src: don't need keyword for log level")

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: Replace getnameinfo() by internal lookup table
Elise Lennion [Wed, 30 Nov 2016 01:12:37 +0000 (23:12 -0200)] 
datatype: Replace getnameinfo() by internal lookup table

To avoid exceeding the inputs number limit of the flex scanner used,
when calling getnameinfo() in inet_service_type_print().

The new symbol_table was associated with inet_service_type, to enable
listing all pre-defined services using nft command line tool.

The listed services are all well-known and registered ports of my
local /etc/services file, from Ubuntu 16.04. Service numbers are
converted to respect network byte order.

Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: Allow parens on RHS of relational_expr
Phil Sutter [Mon, 28 Nov 2016 17:51:43 +0000 (18:51 +0100)] 
parser_bison: Allow parens on RHS of relational_expr

This is useful to allow a construct such as:

| tcp flags & (syn|fin) == (syn|fin)

Before, only the parentheses on the left side were allowed, but via a
quite funny path through the parser:

* expr might be a concat_expr
* concat_expr might be a basic_expr
* basic_expr is an inclusive_or_expr
* inclusive_or_expr might be an exclusive_or_expr
* exclusive_or_expr might be an and_expr
* and_expr might be 'and_expr AMPERSAND shift_expr'
  -> here we eliminate 'flags &' in above statement
* shift_expr might be a primary_expr
* primary_expr might be '( basic_expr )'

Commit a3e60492a684b ("parser: restrict relational rhs expression
recursion") introduced rhs_expr to disallow recursion on RHS, so just
reverting that change for relational_expr is a no go. Allowing rhs_expr
to be '( rhs_expr )' though seems way too intrusive to me since it's
being used in all kinds of places, so this patch is the safest way to
allow the above I could come up with.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add testcase for different defines usage
Arturo Borrero Gonzalez [Mon, 28 Nov 2016 12:59:28 +0000 (13:59 +0100)] 
tests: shell: add testcase for different defines usage

This testcase add some defines in a nft -f run and then uses
them in different spots (which are not covered in previous testcases).

 * defines used to define another one
 * different datatypes (numbers, strings, bits, ranges)
 * usage in sets, maps, contatenatios
 * single rules with single statements, multiple statements
 * reuse define in same rule

Perhaps this isn't testing many different code path, but I find this
interesting to have given it will probably be one of the most common
use cases of nftables.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add a testcase for many defines
Arturo Borrero Gonzalez [Mon, 28 Nov 2016 12:59:22 +0000 (13:59 +0100)] 
tests: shell: add a testcase for many defines

Use many defines in a single nft -f run.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests/py: Unmask negative set lookup
Anatole Denis [Thu, 24 Nov 2016 14:16:21 +0000 (15:16 +0100)] 
tests/py: Unmask negative set lookup

Many testcases were masked because of bug #888. This series of patches unmasks
them

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Interpret OP_NEQ against a set as OP_LOOKUP
Anatole Denis [Thu, 24 Nov 2016 14:16:20 +0000 (15:16 +0100)] 
src: Interpret OP_NEQ against a set as OP_LOOKUP

Now that the support for inverted matching is in the kernel and in libnftnl, add
it to nftables too.

This fixes bug #888

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoRevert "evaluate: check for NULL datatype in rhs in lookup expr"
Anatole Denis [Mon, 28 Nov 2016 16:43:10 +0000 (17:43 +0100)] 
Revert "evaluate: check for NULL datatype in rhs in lookup expr"

This reverts commit 5afa5a164ff1c066af1ec56d875b91562882bd50.
This commit is obsoleted by removing the possibility for a NULL right->dtype in
the first place, at set declaration.

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: Add regression test for malformed sets
Anatole Denis [Mon, 28 Nov 2016 16:43:09 +0000 (17:43 +0100)] 
tests: Add regression test for malformed sets

see: 5afa5a164ff1c066af1ec56d875b91562882bd50
When a malformed set is added, it was added before erroring out, causing a
segfault further down when used. This tests for this case, ensuring that
nftables doesn't segfault but errors correctly

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Add set to cache only when well-formed
Anatole Denis [Mon, 28 Nov 2016 16:43:08 +0000 (17:43 +0100)] 
evaluate: Add set to cache only when well-formed

When creating a set (in set_evaluate), it is added to the table cache before
being checked for correctness. When the set is ill-formed, the function returns
without removing the (non-existent, since the function returned) set. Further
references to this set will not result in an error (since the set is in the
lookup table), but the malformed set will probably cause a segfault.

The symptom (the segfault) was fixed by checking for NULL when evaluating a
reference to the set (commit 5afa5a164ff1c066af1ec56d875b91562882bd50), this
should fix the root cause.

Signed-off-by: Anatole Denis <anatole@rezel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add log flags syntax support
Liping Zhang [Sat, 19 Nov 2016 11:31:15 +0000 (19:31 +0800)] 
src: add log flags syntax support

Now NF_LOG_XXX is exposed to the userspace, we can set it explicitly.
Like iptables LOG target, we can log TCP sequence numbers, TCP options,
IP options, UID owning local socket and decode MAC header. Note the
log flags are mutually exclusive with group.

Some examples are listed below:
 # nft add rule t c log flags tcp sequence,options
 # nft add rule t c log flags ip options
 # nft add rule t c log flags skuid
 # nft add rule t c log flags ether
 # nft add rule t c log flags all
 # nft add rule t c log flags all group 1
 <cmdline>:1:14-16: Error: flags and group are mutually exclusive
 add rule t c log flags all group 1
              ^^^

Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: another testcase for deleting many set elements
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:53:26 +0000 (13:53 +0100)] 
tests: shell: another testcase for deleting many set elements

This testcase adds and deletes many elements in a set.

We add and delete 65.536 elements in two different nft -f runs.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: testcase for deleting many set elements
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:53:21 +0000 (13:53 +0100)] 
tests: shell: testcase for deleting many set elements

This testcase adds and deletes many elements in a set.

We add and delete 65.536 elements in a same batch of netlink messages,
(single nft -f run).

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: testcase for adding many set elements
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:53:15 +0000 (13:53 +0100)] 
tests: shell: testcase for adding many set elements

This testcase adds many elements in a set.
We add 65.356 elements.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: allow to execute a single testcase
Arturo Borrero Gonzalez [Wed, 16 Nov 2016 12:51:52 +0000 (13:51 +0100)] 
tests: shell: allow to execute a single testcase

Using, for example:
 % sudo ./run-tests.sh testcase/mytest_0

Will result in an execution of this single testcase rather than
the complete suite.

This is useful while working with a concrete testcase.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoinclude: refresh nf_tables.h header
Pablo Neira Ayuso [Thu, 24 Nov 2016 11:09:23 +0000 (12:09 +0100)] 
include: refresh nf_tables.h header

Fetch what we have at 4.9-rc6.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoRevert "tests: py: nft-tests.py: Add function for loading and removing kernel modules"
Florian Westphal [Thu, 17 Nov 2016 16:43:11 +0000 (17:43 +0100)] 
Revert "tests: py: nft-tests.py: Add function for loading and removing kernel modules"

Its not needed at the moment, all tests that need a network interface
(meta iif/oif) use the lo interface.

For iifname/oifname the network device doesn't have to exist.

We can revisit this in case we need it in the future.

(seems commit causes issues on kernels built without dummy module).

Reported-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Manuel Messner <mm@skelett.io>
8 years agomnl: use nftnl_set_elems_nlmsg_build_payload_iter() when deleting elements
Pablo Neira Ayuso [Mon, 14 Nov 2016 21:41:26 +0000 (22:41 +0100)] 
mnl: use nftnl_set_elems_nlmsg_build_payload_iter() when deleting elements

Otherwise, nft crashes when deleting a very large number of elements.

*** stack smashing detected ***: nft terminated
Segmentation fault

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add notrack support
Pablo Neira Ayuso [Mon, 14 Nov 2016 21:19:07 +0000 (22:19 +0100)] 
src: add notrack support

This patch adds the notrack statement, to skip connection tracking for
certain packets.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: missing range conversion in icmpv6
Pablo Neira Ayuso [Mon, 14 Nov 2016 20:50:33 +0000 (21:50 +0100)] 
tests: py: missing range conversion in icmpv6

Use range expression to negate ranges.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: add some testcases for log flags
Pablo Neira Ayuso [Mon, 14 Nov 2016 20:44:33 +0000 (21:44 +0100)] 
tests: py: add some testcases for log flags

Remove null and zero flags from tests, to reduce the noise when running
tests.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add testcases for comments in set elements
Arturo Borrero Gonzalez [Wed, 9 Nov 2016 09:38:26 +0000 (10:38 +0100)] 
tests: shell: add testcases for comments in set elements

This patch adds a several testcases for comments in set elements.
This includes the netfilter bug #1090 about comments in set interval elements.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosegtree: keep element comments in set intervals
Pablo Neira Ayuso [Tue, 8 Nov 2016 23:19:45 +0000 (00:19 +0100)] 
segtree: keep element comments in set intervals

The conversion from the set element range representation to element
intervals doesn't keep the comment information around.

Fixes: https://bugzilla.netfilter.org/show_bug.cgi?id=1090
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Tested-by: Arturo Borrero Gonzalez <arturo@debian.org>
8 years agosrc: add offset attribute for hash expression
Laura Garcia Liebana [Fri, 4 Nov 2016 13:01:12 +0000 (14:01 +0100)] 
src: add offset attribute for hash expression

Add support to add an offset to the hash generator, eg.

 ct mark set hash ip saddr mod 10 offset 100

This will generate marks with series between 100-109.

Signed-off-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: make hash seed attribute optional
Laura Garcia Liebana [Fri, 4 Nov 2016 12:59:31 +0000 (13:59 +0100)] 
src: make hash seed attribute optional

The hash expression requires a seed attribute to call the jhash
operation, eg.

 # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2 \
seed 0xdeadbeef

With this patch the seed attribute is optional and it's generated by a
random function from userspace, eg.

 # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2

The kernel will take care of generate a random seed.

Signed-off-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add a new testcase for ruleset loading bug
Arturo Borrero Gonzalez [Thu, 3 Nov 2016 12:04:47 +0000 (13:04 +0100)] 
tests: shell: add a new testcase for ruleset loading bug

There seems to be a bug that prevent loading a ruleset twice in a row
if the ruleset contains sets with intervals. This seems related to the
nft cache.

By the time of this commit, the bug is not fixed yet.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: introduce the cache testcases directory
Arturo Borrero Gonzalez [Thu, 3 Nov 2016 12:04:42 +0000 (13:04 +0100)] 
tests: shell: introduce the cache testcases directory

This directory is for testcases related to the nft cache.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: delete useless stderr output in testcase
Arturo Borrero Gonzalez [Thu, 3 Nov 2016 12:04:36 +0000 (13:04 +0100)] 
tests: shell: delete useless stderr output in testcase

This stderr output is expected.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoxt: update Arturo Borrero Gonzalez email address
Arturo Borrero Gonzalez [Tue, 18 Oct 2016 08:32:21 +0000 (10:32 +0200)] 
xt: update Arturo Borrero Gonzalez email address

Update email address to a new one in the copyright notice.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agonetlink_linearize: skip set element expression in flow table key
Pablo Neira Ayuso [Mon, 31 Oct 2016 13:29:58 +0000 (14:29 +0100)] 
netlink_linearize: skip set element expression in flow table key

Anders reports that:

 # nft add rule ip6 filter postrouting \
flow table acct_out \{ meta iif . ip6 saddr timeout 600s counter \}

while the opposite doesn't work:

 # nft add rule ip6 filter postrouting \
flow table acct_out \{ ip6 saddr . meta iif timeout 600s counter \}

netlink_gen_flow_stmt() relies on the flow table key, that is expressed
as a set element. Use the set element key instead to skip the set
element wrap, otherwise get_register() abort execution:

 nft: netlink_linearize.c:650: netlink_gen_expr: Assertion `dreg < ctx->reg_low' failed.

Reported-by: Anders K. Pedersen <akp@cohaesio.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: fix synopsis for ct expression
Anders K. Pedersen [Fri, 28 Oct 2016 19:25:30 +0000 (19:25 +0000)] 
doc: fix synopsis for ct expression

The nft man page command synopsis for the ct expression is currently:

       ct {state | direction | status | mark | expiration | helper | label |
          bytes | packets} {original | reply | {l3proto | protocol | saddr |
          daddr | proto-src | proto-dst | bytes | packets}}

which is not correct for the arguments that should be prefixed with
"original" or "reply". Change this to

       ct {state | direction | status | mark | expiration | helper | label |
          l3proto | protocol | bytes | packets}
       ct {original | reply} {l3proto | protocol | saddr | daddr | proto-src |
          proto-dst | bytes | packets}

Signed-off-by: Anders K. Pedersen <akp@cohaesio.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Allow concatenation of rt nexthop etc.
Anders K. Pedersen [Sat, 29 Oct 2016 09:49:09 +0000 (09:49 +0000)] 
evaluate: Allow concatenation of rt nexthop etc.

Concatenations of rt nexthop or ct {orignal | reply} {saddr | daddr} fail
due to

 # nft add rule ip filter postrouting flow table acct \{ ip saddr . rt nexthop counter \}
 <cmdline>:1:61-70: Error: can not use variable sized data types (invalid) in concat expressions
 add rule ip filter postrouting flow table acct { ip saddr . rt nexthop counter }
                                                  ~~~~~~~~~~~^^^^^^^^^^

Fix this by reordering the check for variable size data types in
expr_evaluate_concat() to happen after expr_evaluate() has been called (via
list_member_evaluate()) for the sub expression. This allows
expr_evaluate_[cr]t() to call [cr]t_expr_update_type() and set the data type
before the check.

Signed-off-by: Anders K. Pedersen <akp@cohaesio.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests/py: add missing payload test for numgen offset
Pablo Neira Ayuso [Mon, 31 Oct 2016 12:33:34 +0000 (13:33 +0100)] 
tests/py: add missing payload test for numgen offset

The new cover test for:

ct mark set numgen inc mod 2 offset 100

was lacking the payload file chunk.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agolog: rename the log level "warning" to "warn"
Liping Zhang [Sun, 30 Oct 2016 12:24:27 +0000 (20:24 +0800)] 
log: rename the log level "warning" to "warn"

This is to keep compatibility. The original keyword in grammer is
"warn" instead of "warning".

Fixes: 0423caa91ad2 ("src: don't need keyword for log level")
Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoct: fix "ct l3proto/protocol" syntax broken
Liping Zhang [Sun, 30 Oct 2016 12:36:14 +0000 (20:36 +0800)] 
ct: fix "ct l3proto/protocol" syntax broken

"l3proto" and "protocol" are still keywords in our grammer, they are not
STRING, so if the user input the following rule, nft will complain that
the syntax is error:
  # nft add t c ct l3proto ipv4
  <cmdline>:1:12-18: Error: syntax error, unexpected l3proto, expecting
  string or mark or packets or bytes
  add t c ct l3proto ipv4
             ^^^^^^^

Fixes: c992153402c7 ("ct: allow resolving ct keys at run time")
Signed-off-by: Liping Zhang <zlpnobody@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoCorrect description of -n/--numeric option
Jon Jensen [Sat, 29 Oct 2016 04:18:11 +0000 (22:18 -0600)] 
Correct description of -n/--numeric option

"When used twice" was used twice in the manpage. :)

And as Florian Westphal pointed out, it was also incorrect
for the -nn case.

Update the manpage and built-in help in main.c to match actual behavior.

Signed-off-by: Jon Jensen <jon@endpoint.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoReplace tests/files/expr-rt with Python based tests, and replace ether type
Anders K. Pedersen [Sat, 29 Oct 2016 01:12:41 +0000 (03:12 +0200)] 
Replace tests/files/expr-rt with Python based tests, and replace ether type
with meta nfproto, which generates a bit fewer instructions.

Signed-off-by: Anders K. Pedersen <akp@cohaesio.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agosrc: add fib expression
Florian Westphal [Thu, 15 Sep 2016 15:28:00 +0000 (17:28 +0200)] 
src: add fib expression

This adds the 'fib' expression which can be used to
obtain the output interface from the route table based on either
source or destination address of a packet.

This can be used to e.g. add reverse path filtering:

 # drop if not coming from the same interface packet
 # arrived on
 # nft add rule x prerouting fib saddr . iif oif eq 0 drop

 # accept only if from eth0
 # nft add rule x prerouting fib saddr . iif oif eq "eth0" accept

 # accept if from any valid interface
 # nft add rule x prerouting fib saddr oif accept

Querying of address type is also supported.  This can be used
to e.g. only accept packets to addresses configured in the same
interface:
 # fib daddr . iif type local

Its also possible to use mark and verdict map, e.g.:
 # nft add rule x prerouting meta mark set 0xdead fib daddr . mark type vmap {
   blackhole : drop,
   prohibit : drop,
   unicast : accept
 }

Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agort: introduce routing expression
Anders K. Pedersen [Fri, 28 Oct 2016 05:56:32 +0000 (05:56 +0000)] 
rt: introduce routing expression

Introduce rt expression for routing related data with support for nexthop
(i.e. the directly connected IP address that an outgoing packet is sent
to), which can be used either for matching or accounting, eg.

 # nft add rule filter postrouting \
ip daddr 192.168.1.0/24 rt nexthop != 192.168.0.1 drop

This will drop any traffic to 192.168.1.0/24 that is not routed via
192.168.0.1.

 # nft add rule filter postrouting \
flow table acct { rt nexthop timeout 600s counter }
 # nft add rule ip6 filter postrouting \
flow table acct { rt nexthop timeout 600s counter }

These rules count outgoing traffic per nexthop. Note that the timeout
releases an entry if no traffic is seen for this nexthop within 10 minutes.

 # nft add rule inet filter postrouting \
ether type ip \
flow table acct { rt nexthop timeout 600s counter }
 # nft add rule inet filter postrouting \
ether type ip6 \
flow table acct { rt nexthop timeout 600s counter }

Same as above, but via the inet family, where the ether type must be
specified explicitly.

"rt classid" is also implemented identical to "meta rtclassid", since it
is more logical to have this match in the routing expression going forward.

Signed-off-by: Anders K. Pedersen <akp@cohaesio.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agometa: allow resolving meta keys at run time
Florian Westphal [Wed, 27 Jul 2016 07:42:38 +0000 (09:42 +0200)] 
meta: allow resolving meta keys at run time

use the meta template to translate the textual token to the enum value.
This allows to remove two keywords from the scanner and also means we do
not need to introduce new keywords when more meta keys get added.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoct: allow resolving ct keys at run time
Florian Westphal [Wed, 27 Jul 2016 12:34:53 +0000 (14:34 +0200)] 
ct: allow resolving ct keys at run time

... and remove those keywords we no longer need.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoutils: provide snprintf helper macro
Florian Westphal [Wed, 27 Jul 2016 13:22:25 +0000 (15:22 +0200)] 
utils: provide snprintf helper macro

lifted from libnftnl, except that we will abort on snprintf errors.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser: add offset keyword and parser rule
Pablo Neira Ayuso [Thu, 27 Oct 2016 20:11:40 +0000 (22:11 +0200)] 
parser: add offset keyword and parser rule

This is required by the numgen and jhash expressions.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agonetlink: fix linearize numgen type
Laura Garcia Liebana [Sat, 22 Oct 2016 21:36:47 +0000 (23:36 +0200)] 
netlink: fix linearize numgen type

Avoid to treat numgen type attribute as a register.

Fixes: 345236211715 ("src: add hash expression")
Signed-off-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add offset attribute for numgen expression
Laura Garcia Liebana [Sat, 22 Oct 2016 21:36:07 +0000 (23:36 +0200)] 
src: add offset attribute for numgen expression

Add support to add an offset to the numgen generated value.

Example:

 ct mark set numgen inc mod 2 offset 100

This will generate marks with serie like 100, 101, 100, ...

Signed-off-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agometa: fix pkttype name and add 'other' symbol
Florian Westphal [Thu, 27 Oct 2016 12:31:34 +0000 (14:31 +0200)] 
meta: fix pkttype name and add 'other' symbol

'unicast' doesn't check for unicast packets; it checks for PACKET_HOST,
i.e. a packet coming in for this host.

A unicast address to some other machine (e.g. because nic is
in promisc mode) will have PACKET_OTHER.

So at best this is misleading, so this patch changes it
to 'host'.  The unicast entry is retained for compat purpose.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: don't need keyword for log level
Pablo Neira Ayuso [Fri, 21 Oct 2016 11:06:12 +0000 (12:06 +0100)] 
src: don't need keyword for log level

We can handle log levels without keywords in our grammar, use string
instead.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: update kernel modules to clean
Arturo Borrero Gonzalez [Tue, 18 Oct 2016 08:49:34 +0000 (10:49 +0200)] 
tests: shell: update kernel modules to clean

Let's keep the kernel_cleanup() function updated with latest
kernel changes:

 * added nft_quota, nft_queue, nft_numgen, nft_range
 * rename nft_hash to nft_set_hash
 * keep nft_hash as well
 * rename nft_rbtree to nft_set_rbtree

The idea is to run each test in a clean evironment.

Signed-off-by: Arturo Borrero Gonzalez <arturo@debian.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: allow to use variable to add/create/delete elements
Pablo Neira Ayuso [Fri, 21 Oct 2016 10:17:55 +0000 (11:17 +0100)] 
parser_bison: allow to use variable to add/create/delete elements

Using variable definitions from element command doesn't work, eg.

-test.nft-
 define whitelist_v4 = { 1.1.1.1 }
 table inet filter {
set whitelist_v4 { type ipv4_addr; }
 }
 add element inet filter whitelist_v4 $whitelist_v4
-EOF-

 # nft -f test.nft
 test.nft:7:38-38: Error: syntax error, unexpected '$', expecting '{'
 add element inet filter whitelist_v4 $whitelist_v4
                                      ^

Fix this by using set_block_expr rule for every element command.
This patch also comes with a new regression test.

Reported-by: Leon Merten Lohse <leon@green-side.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agonetlink: fix monitor trace crash with netdev family
Florian Westphal [Thu, 20 Oct 2016 23:10:34 +0000 (01:10 +0200)] 
netlink: fix monitor trace crash with netdev family

nft monitor trace crashes on first packet with:

table netdev filter {
  chain foobar {
    type filter hook ingress device eth0 priority 0;
    udp sport 53 meta nftrace set 1
  }
}

We did not handle netdev family and thus generated bogus payload
statements without data types.

Netfilter Bugzilla: http://bugzilla.netfilter.org/show_bug.cgi?id=1092
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agosrc: support ct l3proto/protocol without direction syntax
Liping Zhang [Thu, 22 Sep 2016 14:34:52 +0000 (22:34 +0800)] 
src: support ct l3proto/protocol without direction syntax

Acctually, ct l3proto and ct protocol are unrelated to direction, so
it's unnecessary that we must specify dir if we want to use them.

Now add support that we can match ct l3proto/protocol without direction:
  # nft add rule filter input ct l3proto ipv4
  # nft add rule filter output ct protocol 17

Note: existing syntax is still preserved, so "ct reply l3proto ipv6"
is still fine.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: use new range expression for != [a,b] intervals
Pablo Neira Ayuso [Tue, 20 Sep 2016 17:25:25 +0000 (19:25 +0200)] 
src: use new range expression for != [a,b] intervals

Use new range expression in the kernel to fix wrong bytecode generation.
This patch also adjust tests so we don't hit problems there.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agometa: permit numeric interface type
Florian Westphal [Sun, 16 Oct 2016 20:08:25 +0000 (22:08 +0200)] 
meta: permit numeric interface type

If we can't translate an interface index back to a name
we just print the number.

This change allows using a number instead of an interface index to
make this symmetric.

If we can't find an interface with the given name check
if its a numeric string and then use it instead.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: fix numgen case failed due to changes in libnftnl
Liping Zhang [Thu, 15 Sep 2016 13:42:49 +0000 (21:42 +0800)] 
tests: py: fix numgen case failed due to changes in libnftnl

In nftnl_expr_ng_snprintf_default, format "(%u)" was changed to
"mod %u", so numgen test case failed:
  ...
  '[ numgen reg 1 = inc(2) ]' mismatches '[ numgen reg 1 = inc mod 2 ]'
  ...
  ip/numgen.t: 3 unit tests, 3 error, 0 warning

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: add more test cases for queue expr
Liping Zhang [Wed, 14 Sep 2016 16:02:09 +0000 (00:02 +0800)] 
tests: py: add more test cases for queue expr

It's necessary to cover more test cases, for example, large queue
range 1-65535, error queue number 65536.

Also add a space before tailing square brackets, this is updated to
keep consistent with other expr.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: fix compile error due to _UNTIL renamed to _MODULUS in libnftnl
Liping Zhang [Mon, 12 Sep 2016 12:19:04 +0000 (20:19 +0800)] 
src: fix compile error due to _UNTIL renamed to _MODULUS in libnftnl

In the latest libnftnl, NFTNL_EXPR_NG_UNTIL was renamed to
NFTNL_EXPR_NG_MODULUS, so compile error happened:
  netlink_linearize.c: In function ‘netlink_gen_numgen’:
  netlink_linearize.c:184:26: error: ‘NFTNL_EXPR_NG_UNTIL’ undeclared
  (first use in this function)

Also update NFTA_NG_UNTIL to NFTA_NG_MODULUS.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: replace "eth0" with "lo" in dup expr tests
Liping Zhang [Sat, 10 Sep 2016 08:14:03 +0000 (16:14 +0800)] 
tests: py: replace "eth0" with "lo" in dup expr tests

This patch follow up on Manuel's commit a8871ba6daa0 ("tests: py: any:
Make tests more generic by using other interfaces"). The ifindex of
"eth0" is not always 1, furthermore, "eth0" maybe not exist on some
systems. So replace it with "lo" will make tests more rubost.

In other test cases, "eth0" is used by iifname or oifname, so there's no
need to convert it to "lo". Even if "eth0" is not exist, test will never
fail.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agopayload: remove byteorder conversion
Florian Westphal [Fri, 9 Sep 2016 12:37:09 +0000 (14:37 +0200)] 
payload: remove byteorder conversion

This is what made ether addresses get formatted correctly with
plain payload expression (ether saddr 00:11 ...) when listing
rules.  Not needed anymore since etheraddr_type is now BIG_ENDIAN.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: catch ordering issue w. ether set
Florian Westphal [Fri, 9 Sep 2016 12:14:16 +0000 (14:14 +0200)] 
tests: catch ordering issue w. ether set

Before previous commit, ether set (payload statement) was reversed on
output:

ether daddr set 00:03:2d:2b:74:ec

would be shown as 'ec:74:2b:2d:03:00'.

With ff:ff:ff ... such bug doesn't appear so use something
where it will show up.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodatatype: ll: use big endian byte ordering
Florian Westphal [Fri, 9 Sep 2016 11:44:50 +0000 (13:44 +0200)] 
datatype: ll: use big endian byte ordering

ether daddr set 00:03:2d:2b:74:ec  is listed as:
ether daddr set ec:74:2b:2d:03:00

(it was fine without 'set' keyword).  Reason is that
ether address was listed as being HOST endian.

The payload expression (unlike statement) path contains
a few conversion call sites for this, i.e.:

if (tmp->byteorder == BYTEORDER_HOST_ENDIAN)
   mpz_switch_byteorder(tmp->value, tmp->len / BITS_PER_BYTE);

... it might make sense to remove those in a followup patch.

Reported-by: Laura Garcia Liebana <nevola@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: payload and conntrack statement
Florian Westphal [Tue, 26 Jul 2016 20:04:53 +0000 (22:04 +0200)] 
doc: payload and conntrack statement

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: update meta expression
Florian Westphal [Tue, 26 Jul 2016 19:06:38 +0000 (21:06 +0200)] 
doc: update meta expression

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: nft: document log, reject, counter, meta, limit, nat and queue statements
Pablo Neira Ayuso [Thu, 8 Sep 2016 21:08:01 +0000 (23:08 +0200)] 
doc: nft: document log, reject, counter, meta, limit, nat and queue statements

This patch adds the missing documentation for the aforementioned
statements.

This is based on original work from Shivani Bhardwaj.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agodoc: nft: add my copyright statement to the manpage
Pablo Neira Ayuso [Thu, 8 Sep 2016 21:06:34 +0000 (23:06 +0200)] 
doc: nft: add my copyright statement to the manpage

Update the manpage to include my copyright statement and credit me as
author of this software.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agonetlink_delinearize: Avoid potential null pointer deref
Pablo Neira Ayuso [Mon, 5 Sep 2016 16:52:43 +0000 (18:52 +0200)] 
netlink_delinearize: Avoid potential null pointer deref

Phil Sutter says:

As netlink_get_register() may return NULL, we must not pass the returned
data unchecked to expr_set_type() as that will dereference it. Since the
parser has failed at that point anyway, by returning early we can skip
the useless statement allocation that follows in
netlink_parse_ct_stmt().

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Acked-by: Phil Sutter <phil@nwl.cc>
8 years agotests: py: any: Remove duplicate tests
Manuel Johannes Messner [Mon, 5 Sep 2016 18:20:14 +0000 (20:20 +0200)] 
tests: py: any: Remove duplicate tests

This commit removes some duplicated tests.

Signed-off-by: Manuel Johannes Messner <manuel.johannes.messner@hs-furtwangen.de>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agotests: py: any: Make tests more generic by using other interfaces
Manuel Johannes Messner [Mon, 5 Sep 2016 18:20:13 +0000 (20:20 +0200)] 
tests: py: any: Make tests more generic by using other interfaces

Some tests use hard coded interface names and interface indexes.
This commit removes these cases by exchanging "eth0" with "dummy0" and
"lo" (depending on the test) in all ifname tests and by using "lo"
instead of "eth0" in all interface index tests (because we can assume
"lo" ifindex is 1).

Signed-off-by: Manuel Johannes Messner <manuel.johannes.messner@hs-furtwangen.de>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agotests: py: nft-tests.py: Add function for loading and removing kernel modules
Manuel Johannes Messner [Mon, 5 Sep 2016 18:20:12 +0000 (20:20 +0200)] 
tests: py: nft-tests.py: Add function for loading and removing kernel modules

Some tests use the dummy kernel module. This commit adds a function to
automatically load that module and remove it afterwards.

Signed-off-by: Manuel Johannes Messner <manuel.johannes.messner@hs-furtwangen.de>
Signed-off-by: Florian Westphal <fw@strlen.de>
8 years agoevaluate: display expression, statement and command name on debug
Pablo Neira Ayuso [Wed, 31 Aug 2016 16:27:13 +0000 (18:27 +0200)] 
evaluate: display expression, statement and command name on debug

Extend debugging knob for evaluation to display the command, the
expression and statement names.

 # nft --debug=eval add rule x y ip saddr 1.1.1.1 counter
 <cmdline>:1:1-37: Evaluate add
 add rule x y ip saddr 1.1.1.1 counter
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 <cmdline>:1:14-29: Evaluate expression
 add rule x y ip saddr 1.1.1.1 counter
              ^^^^^^^^^^^^^^^^
 ip saddr $1.1.1.1

 <cmdline>:1:14-29: Evaluate relational
 add rule x y ip saddr 1.1.1.1 counter
              ^^^^^^^^^^^^^^^^
 ip saddr $1.1.1.1

 <cmdline>:1:14-21: Evaluate payload
 add rule x y ip saddr 1.1.1.1 counter
              ^^^^^^^^
 ip saddr

 <cmdline>:1:23-29: Evaluate symbol
 add rule x y ip saddr 1.1.1.1 counter
                       ^^^^^^^

 <cmdline>:1:23-29: Evaluate value
 add rule x y ip saddr 1.1.1.1 counter
                       ^^^^^^^
 1.1.1.1

 <cmdline>:1:31-37: Evaluate counter
 add rule x y ip saddr 1.1.1.1 counter
                               ^^^^^^^
 counter packets 0 bytes 0

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Avoid undefined behaviour in concat_subtype_id()
Phil Sutter [Tue, 30 Aug 2016 17:39:52 +0000 (19:39 +0200)] 
evaluate: Avoid undefined behaviour in concat_subtype_id()

For the left side of a concat expression, dtype is NULL and therefore
off is 0. In that case the code expects to get a datatype of
TYPE_INVALID, but this is fragile as the output of concat_subtype_id()
is undefined for n > 32 / TYPE_BITS.

To fix this, call datatype_lookup() directly passing the expected
TYPE_INVALID as argument if off is 0.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: reject: Have a generic fix for missing network context
Phil Sutter [Tue, 30 Aug 2016 17:39:51 +0000 (19:39 +0200)] 
evaluate: reject: Have a generic fix for missing network context

Commit 17b495957b29e ("evaluate: reject: fix crash if we have transport
protocol conflict from inet") took care of a crash when using inet or
bridge families, but since then netdev family has been added which also
does not implicitly define the network context. Therefore the crash can
be reproduced again using the following example:

nft add rule netdev filter e1000-ingress \
meta l4proto udp reject with tcp reset

In order to fix this in a more generic way, have stmt_evaluate_reset()
fall back to the generic proto_inet_service irrespective of the actual
proto context.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: Fix datalen checks in expr_evaluate_string()
Phil Sutter [Tue, 30 Aug 2016 17:39:49 +0000 (19:39 +0200)] 
evaluate: Fix datalen checks in expr_evaluate_string()

I have been told that the flex scanner won't return empty strings, so
strlen(data) should always be greater 0. To avoid a hard to debug issue
though, add an assert() to make sure this is always the case before
risking an unsigned variable underrun.

A real issue though is the check for 'datalen - 1 >= 0', which will
never fail due to datalen being unsigned. Fix this by incrementing both
sides by one, hence checking 'datalen >= 1'.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agometa: fix memory leak in tc classid parser
Liping Zhang [Sun, 28 Aug 2016 08:36:22 +0000 (16:36 +0800)] 
meta: fix memory leak in tc classid parser

We forgot to free the str which was allocated by xstrdup,
so memory leak will happen.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: adapt netlink bytecode output of numgen and hash
Pablo Neira Ayuso [Tue, 30 Aug 2016 10:22:47 +0000 (12:22 +0200)] 
tests: py: adapt netlink bytecode output of numgen and hash

Adapt them to the revisited output string now in libnftnl.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: allow variable references in set elements definition
Pablo Neira Ayuso [Mon, 29 Aug 2016 15:16:35 +0000 (17:16 +0200)] 
parser_bison: allow variable references in set elements definition

Andreas reports that he cannot use variables in set definitions:

define s-ext-2-int = 10.10.10.10 . 25, 10.10.10.10 . 143

        set s-ext-2-int {
                type ipv4_addr . inet_service
                elements =  { $s-ext-2-int }
        }

This syntax is not correct though, since the curly braces should be
placed in the variable definition itself, so we have context to handle
this variable as a list of set elements.

The correct syntax that works after this patch is:

define s-ext-2-int = { 10.10.10.10 . 25, 10.10.10.10 . 143 }

table inet forward {
         set s-ext-2-int {
                type ipv4_addr . inet_service
                elements = $s-ext-2-int
        }
}

Reported-by: Andreas Hainke <andreas.hainke@foteviken.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: add variable_expr rule
Pablo Neira Ayuso [Mon, 29 Aug 2016 15:15:47 +0000 (17:15 +0200)] 
parser_bison: add variable_expr rule

This patch adds a rule for variable expression so we can reuse it in a
follow up patch to allow set element initialization from variable.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: validate maximum hash and numgen value
Pablo Neira Ayuso [Mon, 29 Aug 2016 11:20:08 +0000 (13:20 +0200)] 
evaluate: validate maximum hash and numgen value

We can validate that values don't get over the maximum datatype
length, this is expressed in number of bits, so the maximum value
is always power of 2.

However, since we got the hash and numgen expressions, the user should
not set a value higher that what the specified modulus option, which
may not be power of 2. This patch extends the expression context with
a new optional field to store the maximum value.

After this patch, nft bails out if the user specifies non-sense rules
like those below:

 # nft add rule x y jhash ip saddr mod 10 seed 0xa 10
 <cmdline>:1:45-46: Error: Value 10 exceeds valid range 0-9
 add rule x y jhash ip saddr mod 10 seed 0xa 10
                                             ^^

The modulus sets a valid value range of [0, n), so n is out of the valid
value range.

 # nft add rule x y numgen inc mod 10 eq 12
 <cmdline>:1:35-36: Error: Value 12 exceeds valid range 0-9
 add rule x y numgen inc mod 10 eq 12
                                   ^^

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoevaluate: add expr_evaluate_integer()
Pablo Neira Ayuso [Mon, 29 Aug 2016 10:49:35 +0000 (12:49 +0200)] 
evaluate: add expr_evaluate_integer()

Add a helper function to wrap the integer evaluation code.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add hash expression
Pablo Neira Ayuso [Fri, 26 Aug 2016 16:00:00 +0000 (18:00 +0200)] 
src: add hash expression

This is special expression that transforms an input expression into a
32-bit unsigned integer. This expression takes a modulus parameter to
scale the result and the random seed so the hash result becomes harder
to predict.

You can use it to set the packet mark, eg.

 # nft add rule x y meta mark set jhash ip saddr . ip daddr mod 2 seed 0xdeadbeef

You can combine this with maps too, eg.

 # nft add rule x y dnat to jhash ip saddr mod 2 seed 0xdeadbeef map { \
0 : 192.168.20.100, \
1 : 192.168.30.100 \
   }

Currently, this expression implements the jenkins hash implementation
available in the Linux kernel:

 http://lxr.free-electrons.com/source/include/linux/jhash.h

But it should be possible to extend it to support any other hash
function type.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add numgen expression
Pablo Neira Ayuso [Fri, 26 Aug 2016 12:41:41 +0000 (14:41 +0200)] 
src: add numgen expression

This new expression allows us to generate incremental and random numbers
bound to a specified modulus value.

The following rule sets the conntrack mark of 0 to the first packet seen,
then 1 to second packet, then 0 again to the third packet and so on:

 # nft add rule x y ct mark set numgen inc mod 2

A more useful example is a simple load balancing scenario, where you can
also use maps to set the destination NAT address based on this new numgen
expression:

 # nft add rule nat prerouting \
dnat to numgen inc mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 }

So this is distributing new connections in a round-robin fashion between
192.168.10.100 and 192.168.20.200. Don't forget the special NAT chain
semantics: Only the first packet evaluates the rule, follow up packets
rely on conntrack to apply the NAT information.

You can also emulate flow distribution with different backend weights
using intervals:

 # nft add rule nat prerouting \
dnat to numgen inc mod 10 map { 0-5 : 192.168.10.100, 6-9 : 192.168.20.200 }

So 192.168.10.100 gets 60% of the workload, while 192.168.20.200 gets 40%.

We can also be mixed with dynamic sets, thus weight can be updated in
runtime.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add quota statement
Pablo Neira Ayuso [Fri, 26 Aug 2016 09:19:18 +0000 (11:19 +0200)] 
src: add quota statement

This new statement is stateful, so it can be used from flow tables, eg.

 # nft add rule filter input \
        flow table http { ip saddr timeout 60s quota over 50 mbytes } drop

This basically sets a quota per source IP address of 50 mbytes after
which packets are dropped. Note that the timeout releases the entry if
no traffic is seen from this IP after 60 seconds.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: py: adapt it to new add element command semantics
Pablo Neira Ayuso [Mon, 29 Aug 2016 17:50:45 +0000 (19:50 +0200)] 
tests: py: adapt it to new add element command semantics

Since fd33d96 ("src: create element command"), add element doesn't
fail anymore if the element exists, you have to use create instead in
case you want to check if the element already exists.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoinclude: refresh uapi/linux/netfilter/nf_tables.h copy
Pablo Neira Ayuso [Fri, 26 Aug 2016 11:22:00 +0000 (13:22 +0200)] 
include: refresh uapi/linux/netfilter/nf_tables.h copy

Fetch incremental incremental updates on this file.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: cover add and create set command
Pablo Neira Ayuso [Wed, 24 Aug 2016 14:45:07 +0000 (16:45 +0200)] 
tests: shell: cover add and create set command

This patch validates that creation of an already existing element
bails out with EEXIST.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: create element command
Pablo Neira Ayuso [Wed, 24 Aug 2016 14:45:06 +0000 (16:45 +0200)] 
src: create element command

This patch adds the create command, that send the NLM_F_EXCL flag so
nf_tables bails out if the element already exists, eg.

 # nft add element x y { 1.1.1.1 }
 # nft create element x y { 1.1.1.1 }
 <cmdline>:1:1-31: Error: Could not process rule: File exists
 create element x y { 1.1.1.1 }
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This update requires nf_tables kernel patches to honor the NLM_F_EXCL.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: cover add and create set command
Pablo Neira Ayuso [Wed, 24 Aug 2016 14:14:51 +0000 (16:14 +0200)] 
tests: shell: cover add and create set command

This patch validates that creation of an already existing set bails out
with EEXIST.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: add create set command
Pablo Neira Ayuso [Wed, 24 Aug 2016 13:58:57 +0000 (15:58 +0200)] 
src: add create set command

Add support for the 'create' command, we already support this in other
existing objects, so support this for sets too, eg.

 # nft add set x y { type ipv4_addr\; }
 # nft create set x y { type ipv4_addr\; }
 <cmdline>:1:1-35: Error: Could not process rule: File exists
 create set x y { type ipv4_addr; }
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 # nft add set x y { type ipv4_addr\; }
 #

This command sets the NLM_F_EXCL netlink flag, so if the object already
exists, nf_tables returns -EEXIST.

This is changing the existing behaviour of 'nft add set' which was
setting this flag, this is inconsistent with regards to the way other
objects behave.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: explicit indication on export ruleset
Pablo Neira Ayuso [Wed, 27 Jul 2016 10:57:57 +0000 (12:57 +0200)] 
parser_bison: explicit indication on export ruleset

This patch modifies the grammar to explicitly indicate what you want to
export, eg.

 # nft export ruleset json

This leaves room to extend this later on to support other object types,
such as integrating conntrack into nft.

This also leaves the syntax in consistent state wrt. other existing
objects. The existing syntax is still preserved.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: Simplify parser rule_spec tree
Carlos Falgueras García [Tue, 23 Aug 2016 07:40:45 +0000 (09:40 +0200)] 
src: Simplify parser rule_spec tree

This patch separates the rule identification from the rule localization,
so the logic moves from the evaluator to the parser. This allows to
revert the patch "evaluate: improve rule managment checks"
(4176c7d30c2ff1b3f52468fc9c08b8df83f979a8) and saves a lot of code.

Signed-off-by: Carlos Falgueras García <carlosfg@riseup.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoct: display bit number instead of raw value
Florian Westphal [Sun, 21 Aug 2016 22:27:48 +0000 (00:27 +0200)] 
ct: display bit number instead of raw value

... and add test cases for ct label.
Currently this dumped 'label 0x2', now 'label 1' would be shown.

This makes add/list behave the same.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoct: allow numeric conntrack labels
Florian Westphal [Wed, 17 Aug 2016 16:19:26 +0000 (18:19 +0200)] 
ct: allow numeric conntrack labels

When dumping labels in rule list we try to print a symbolic name.
If we don't find one, we print the bit number instead.

This changes nft to also allow use of the number instead of a name
when adding ct label rules so that such dumps can also be restored
again.

This is similar to other cases, e.g. skuid root vs skuid 0 which
are both valid.

Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agotests: shell: add testcase for reject expr
Liping Zhang [Mon, 22 Aug 2016 15:43:53 +0000 (23:43 +0800)] 
tests: shell: add testcase for reject expr

Reject expr is only valid in input/forward/output chain,
and if user can add reject expr in prerouting chain, kernel
panic will happen.

So add a simple test case to cover this situation.

Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: keep snat/dnat existing syntax unchanged
Liping Zhang [Mon, 22 Aug 2016 15:34:15 +0000 (23:34 +0800)] 
parser_bison: keep snat/dnat existing syntax unchanged

We should keep existing syntax unchanged, and this was emphasized
in the commit 850f0a56b6ad ("src: add 'to' for snat and dnat")'s
commit log: "Existing syntax is still preserved, but the listing
shows the one including 'to'."

This problem was found by running shell test:
  # ./run-tests.sh
  [ ... ]
  W: [FAILED] ./testcases/maps/anonymous_snat_map_0
  I: [OK] ./testcases/maps/map_with_flags_0
  W: [FAILED] ./testcases/maps/named_snat_map_0
  [ ... ]

Fixes: 850f0a56b6ad ("src: add 'to' for snat and dnat")
Signed-off-by: Liping Zhang <liping.zhang@spreadtrum.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agoparser_bison: redirect to :port for consistency with nat/masq statement
Pablo Neira Ayuso [Tue, 16 Aug 2016 21:36:54 +0000 (23:36 +0200)] 
parser_bison: redirect to :port for consistency with nat/masq statement

Use the colon port syntax for consistency with other statements.
Existing syntax is still preserved but the output displays the colon.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: meta priority support using tc classid
Pablo Neira Ayuso [Tue, 16 Aug 2016 21:30:18 +0000 (23:30 +0200)] 
src: meta priority support using tc classid

This patch adds the missing bits to scan and parse the meta priority
handle as expressed by tc classid major:minor syntax.

The :minor syntax is not support for two reason: major is always >= 1
and this clashes with port syntax in nat.

Here below, several example on how to match the packet priority field:

   nft add rule filter forward meta priority abcd:0
   nft add rule filter forward meta priority abcd:1234

and to set it, you have to:

   nft add rule filter forward meta priority set abcd:1234

The priority expression in flex looks ahead to restrict the pattern to
avoid problems with mappings:

{classid}/[ \t\n:\-},]

So the following doesn't break:

   ... vmap { 25:accept }
              ^^^^^

The lookahead expression requires a slight change to extend the input
string in one byte.

This patch is conservative as you always have to explicity indicate
major and minor numbers even if zero.

We could consider supporting this shortcut in the future:

abcd:

However, with regards to this:

:abcd

We don't need to support it since major number is assumed to be >= 1.
However, if we ever decide to support this, we'll have problems since
this clashes with our port representation in redirect and mangle.

So let's keep this simple and start with this approach.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
8 years agosrc: simplify classid printing using %x instead of %04x
Pablo Neira Ayuso [Fri, 22 Jul 2016 14:45:57 +0000 (16:45 +0200)] 
src: simplify classid printing using %x instead of %04x

No need to print this in iptables CLASSIFY target format,
eg. 0004:1230, this is innecessarily large.

And always print major and minor numbers.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>