[ANNOUNCE] nftables 0.8 release

Pablo Neira Ayuso pablo at netfilter.org
Fri Oct 13 01:49:41 CEST 2017


Hi!

The Netfilter project proudly presents:

        nftables 0.8

This release contains new features available up to the (upcoming)
Linux 4.14 kernel release:

* Support for stateful objects, these objects are uniquely identified by
  a user-defined name, you can refer to them from rules, and there is a
  well established interface to operate with them, eg.

     # nft add counter filter test

  This creates a quota object whose name is 'test'.

     # nft list counters
     table ip filter {
            counter test {
                     packets 0 bytes 0
            }

  You can then refer to these objects from maps:

     # nft add table filter
     # nft add chain filter input { type filter hook input priority 0\; }
     # nft add map filter badguys { type ipv4_addr : counter \; }
     # nft add rule filter input counter name ip saddr map @badguys
     # nft add counter filter badguy1
     # nft add counter filter badguy2
     # nft add element filter badguys { 192.168.2.3 : "badguy1" }
     # nft add element filter badguys { 192.168.2.4 : "badguy2" }

  Implicit map definitions are supported too:

     table ip filter {
            counter http-traffic {
                    packets 8 bytes 672
            }

            chain input {
                    type filter hook input priority 0; policy accept;
                    counter name tcp dport map { 80 : "http-traffic", 443 : "http-traffic"}
            }
     }

  You can atomically dump and reset these objects:

     # nft reset counter ip filter badguy1
     counter test {
            packets 1024 bytes 100000
     }
     # nft reset counter ip filter badguy1
     counter test {
            packets 0 bytes 0
     }

  Currently: counters, quota and limit are supported. Note: limit is
  available starting 4.14-rc.

* Sort set elements when listing them, from lower to largest, eg.

     # nft add table x
     # nft add set x y { type ipv4_addr\; }
     # nft add element x y { 192.168.1.2, 192.168.1.1, 192.168.1.4, 192.168.1.3 }
     # nft list ruleset
     table ip x {
            set y {
                    type ipv4_addr
                    elements = { 192.168.1.1, 192.168.1.2,
                                 192.168.1.3, 192.168.1.4 }
            }
     }

  When listing very large sets, nft takes almost the same time as
  before, so impact of this new feature is negligible.

* TCP option matching and mangling support. This includes TCP maximum
  segment size mangling, eg.

    # nft add rule mangle forward tcp flags syn tcp option maxseg size set rt mtu

  People that own routers with ppp interfaces, you have no excuses to
  migrate to nftables, this is your replacement for the TCPMSS target ;-)

* Add new `-s' option for listings without stateful information:

     # nft -s list ruleset
     table ip filter {
            chain output {
                    type filter hook output priority 0; policy accept;
                    tcp dport https counter
                    tcp dport https quota 25 mbytes
            }
     }

* Add new -c/--check option for nft, to tests if your ruleset loads fine,
  into the kernel, this is a dry run mode, eg.

     # nft -c ruleset.nft

  You can also use it in incremental rule updates scenarios:

     # nft -c add rule x y counter

* Connection tracking helper support, eg.

     table ip filter {
             ct helper ftp-standard {
                    type "ftp" protocol tcp
             }

             chain y {
                    tcp dport ftp ct helper set "ftp-standard"
             }
     }

  Note for iptables users: In nftables, you have to specify what helper
  you want to enable specifically, then set it from rules, given the
  former automatic helper assignment approach is deprecated, see for
  more info: https://home.regit.org/netfilter-en/secure-use-of-helpers/

* Add --echo option, to print the handle that the kernel allocates to
  uniquely identify rules, eg.

     # nft --echo --handle add rule ip t c tcp dport {22, 80} accept
     add rule ip t c tcp dport { ssh, http } accept # handle 2

* Conntrack zone support, eg.

     table raw {
            chain pre {
                   type filter hook prerouting priority -300;
                   iif eth3 ct zone set 23
            }
            chain out {
                   type filter hook output priority -300;
                   oif eth3 ct zone set 23
            }
     }

* Symmetric hash support, eg.

     # nft add rule ip nat prerouting ct mark set symhash mod 2

* Add support to include directories from nft natives scripts, files are
  loaded in alphanumerical order, eg.

     include "/foo/*.nft"

  Assuming the following content on such folder:

        /foo
        /foo/02_rules.nft
        /foo/01_rules.nft

  "01_rules.nft" is loaded before "02_rules.nft".

* Allow to check if IPv6 extension header or TCP option exists or is
  missing, eg.

     # nft add rule ip6 x y exthdr frag exists drop
     # nft add rule inet x y tcp option window missing drop

  Same for fib lookups, eg.

     # nft add rule x y fib daddr oif exists accept

* Extend quota support to display wasted bytes, eg.

    table ip x {
            chain y {
                    type filter hook forward priority 0; policy accept;
                    quota over 200 mbytes used 1143 kbytes drop
            }
    }

  This is useful to restore quota between reboots.

* Add ct average matching, to match average bytes per packet a connection has
  transferred so far, to map the existing feature available in the
  iptables connbytes match.

   eg. match average pkt in both directions:
     # nft add rule x y ct avgpkt gt 100

   eg. match avgpkt in original direction:
     # nft add rule x y ct original avgpkt gt 200

* Allow to flush maps and flow tables, eg.

     # nft flush map filter map1
     # nft flush flow table filter ft-https

* Allow to embed set definition into an existing set, eg.

     # nft -f ruleset.nft
     define myset = {
           1.1.1.0,
           2.2.2.0,
     }
     add rule ip saddr { $myset, 3.3.3.0 }

  And scripting like now works too:

     define dnat_ports      = { 1234-1567 }
     define port_allow      = {
            53,             # dns
            $dnat_ports,    # dnat
     }

* Slightly better error reporting when ruleset loaded via nft -f, eg.

     # nft -f /home/test/x
     /home/test/x:4:17-70: Error: Could not process rule: No such file or directory
                    ip saddr { 1.1.1.1, 2.2.2.2, 3.3.3.3, 4.4.4.4 } jump x
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  In the example above, the chain 'x' that this jump refers to does not exist.
  We can still do better and make it even more fine grain...

* Don't wraparound set elements when listing, eg.

    % nft list ruleset -nnn
    table ip t {
            set s {
                    type inet_service
                    elements = { 1, 2, 3, 4, 10,
                                 432, 433, 434, 435, 436,
                                 437, 438, 439, 440, 441,
                                 442, 443, 444, 445, 446,
                                 447, 448, 449, 450, 12345 }
            }
    }

  Current approach is rather simple, improvable since the number of
  elements to fit in is not calculated based of the number of terminal
  columns, but we can make it at some point.

* Allow to list sets in a table, eg.

     # nft list sets table inet filter

* Conntrack event filtering support via rule, eg.

     # nft add rule x y ct event new counter

... lots of bugfixes too:

* Fix wrong bytecode generation for IPv6 that may result in mismatching
  packets due to extensions placed before the transport header.
* Always print range expressions numerically. This has been a problem
  with network services, where character '-' is possible as part of the
  name.
* Replace getaddrinfo() by inet_service internal lookup table, we don't
  rely on /etc/services anymore, so we have a predictable input from the
  parser side.
* Do not round consumed quota bytes when listing then.
* Fix print of ip dnat address.
* Fix icmp matching in inet tables.
* Fix display of set keys with host byte endian byteorder.
* Fix nested set merge size adjustment, eg.

     # nft add rule ip saddr { { 1.1.1.0/24, 3.3.3.0/24 }, 2.2.2.0/24 }

* Fix missing seed option in hash expression in listings.
* Generate a random seed in hash expression if seed option is empty, eg.

     # nft add rule x y ct mark set jhash ip saddr mod 2

  generates a random seed internally, that is not displayed. If you want
  an explicit seed, you have to specify it.
* Allow to match ICMPv6 packets from IPv4, this is a firewall software so
  we should allow to match even things that don't make sense.
* Fix printing of range elements in named sets in monitor mode.
* Fix printing of optional attributes 'flags', 'gc-interval' and
  'timeout' in set declarations.
* Fix parsing of IPv4-Mapped IPv6 addresses.
* Fix lots of memory leaks.

... and lots of documentation updates! and regression tests!

Resources
=========

The nftables code can be obtained from:

* http://netfilter.org/projects/nftables/downloads.html
* ftp://ftp.netfilter.org/pub/nftables
* git://git.netfilter.org/nftables

To build the code, libnftnl 1.0.8 and libmnl >= 1.0.2 are required:

* http://netfilter.org/projects/libnftnl/index.html
* http://netfilter.org/projects/libmnl/index.html

Visit our wikipage for user documentation at:

* http://wiki.nftables.org

For the manpage reference, check man(8) nft.

In case of bugs and feature request, file them via:

* https://bugzilla.netfilter.org

Make sure you create no duplicates already, thanks!

Happy firewalling!
-------------- next part --------------
Anatole Denis (2):
      scanner: fix search_in_include_path test
      erec: Fix input descriptors for included files

Anders K. Pedersen (1):
      netlink_linearize: skip set element expression in set statement key

Arturo Borrero Gonzalez (5):
      payload: explicit network ctx assignment for icmp/icmp6 in special families
      expression: print sets and maps in pretty format
      evaluate: avoid reference to multiple src data in statements which set values
      monitor: add debug messages
      monitor: Fix printing of range elements in named sets

Bertrand Bonnefoy-Claudet (1):
      doc: Fix typo in manpage

Daniel Kahn Gillmor (1):
      man: use https for wiki link

Duncan Roe (3):
      datatype: printf format warnings on 32-bit build
      doc: nft.8 add chain synopsis
      doc: nft.8 Document rule replace

Elise Lennion (27):
      src: sort set elements in netlink_get_setelems()
      tests: shell: add maps tests
      src: Allow to list ruleset without stateful information
      doc: Include stateless option
      tests: py: Use stateless option on tests
      tests: shell: Add test for set element leak bug
      src: Honor obligatory stateless printing of flow tables
      tests: shell: Add test for flush bug on sets with size
      src: Allow reset single stateful object
      src: Allow list single stateful object
      evaluate: Evaluate table name before reset stateful objects in a table
      src: Allow list stateful objects in a table
      tests: py: Add suport for stateful objects in python tests
      tests: py: Add tests for stateful objects
      main: Validate the number of numeric options
      src: Always print range expressions numerically
      configure: Require newer version of libxtables
      datatype: Replace getaddrinfo() by internal lookup table
      doc: Document stateful objects
      doc: Document sets
      statement: Avoid rounding bytes in get_rate()
      doc: Document maps
      parser_bison: Allow flushing flow tables
      parser_bison: Allow flushing maps
      doc: Document add / delete element operations of sets and maps
      src: Make flush command selective of the set structure type
      tests: Add test for flush command selectiveness on sets

Eric Leblond (12):
      src: fix memory leak when listing rules
      parser: fix memory leak in set creation
      parser: fix bison warnings
      parser: error if needed at EOF
      evaluate: fix build with clang
      scanner: free filename when destroying scanner
      cli: fix heap buffer overflow
      mnl: fix error handling in mnl_batch_talk
      src: add nft_ctx_new() and nft_ctx_free()
      src: add nft_run_cmd_*() functions
      src: release caches from nft_ctx_free() path
      src: add flags fo nft_ctx_new

Florian Westphal (75):
      parser_bison: remove obsolete tokens
      evaluate: fix export length and data corruption
      statement: fix print of ip dnat address
      payload: insert implicit meta tcp dependency when matching tcp options
      src: add conntrack zone support
      ct: refactor print function so it can be re-used for ct statement
      src: support zone set statement with optional direction
      tests: add test entries for conntrack zones
      netlink: BUG when object type is unknown
      doc: ct zone set support
      files: provide 'raw' table equivalent
      doc: fix ct mark set example
      src: add initial ct helper support
      evaluate: refactor CMD_OBJ_QUOTA/COUNTER handling
      src: allow listing all ct helpers
      src: implement add/create/delete for ct helper objects
      tests: py: add ct helper tests
      tests: add insert-failure test
      doc: ct helper objects and helper set support
      exthdr: avoid crash with older kernels
      src: fix build warning on i686
      ct: add conntrack event mask support
      parser: allow listing sets in one table
      netlink_delinearize: don't kill dependencies accross statements
      tests: don't kill dependencies accross statements
      netlink_delink_delinearize: don't store dependency unless relop checks is eq check
      src: add a comment wrt. reject dependency insertion
      netlink_delinearize: reject: remove dependency for tcp-resets
      tests: add ip reject with tcp and check for mark too
      payload: split ll proto dependency into helper
      src: allow update of net base w. meta l4proto icmpv6
      src: ipv6: switch implicit dependencies to meta l4proto
      payload: enforce ip/ip6 protocol depending on icmp or icmpv6
      tests: fix up meta l4proto change for ip6 family
      src: ip: switch implicit dependencies to meta l4proto too
      tests: fix up meta l4proto change for ip family
      Merge branch 'meta_l4_dependency'
      ct: fix inet/bridge/netdev family handling for saddr/daddr
      meta: permit meta nfproto ip in ip family
      parser: allow ct eventmask set new,related
      netlink_delinearize: prefer ct event set foo,bar over 'set foo|bar'
      src: rename ct eventmask to event
      tests: restrict ct saddr test to inet family
      tests: remove two non-sensical rules
      tests: restrict meta nfproto test cases to inet family
      evaluate: reject meta nfproto outside of inet family
      tcpopt: make tcptopt structs static
      exhtdr: pacify compiler warning
      parser: compact list of rhs keyword expressions
      rename struct ct to ct_helper
      tests: fix arp chain test
      evaluate: shift immediate value when adjusting size for csum fixup
      tests: add test case for ttl/protocol set
      src: add tcp options set support
      rt: add path mtu support
      tests: add tcp option set support / tcp mss mangling test cases
      files: add arp filter and add in/output to nat skeleton
      evaluate: convert expr_rt byteorder when evaluating statment arg
      evaluate: prepare to store expr key rather than datatype
      src: store expression as set key instead of data type
      src: ct: remove unused functions
      src: prepare for future ct timeout policy support
      src: parser_bison: rename ct_block to ct_helper_block
      bison: permit keywords in list_stmt_expressions
      src: add alternate syntax for ct saddr
      src: ct: store proto base of ct key, if any
      src: ct: add eval part to inject dependencies for ct saddr/daddr
      src: unifiy meta and ct postprocessing
      tests: update inet/bridge icmp test case
      src: ct: print nfproto name for some header fields
      tests: ct: adjust test case commands
      src: rt: add keyword distinction for nexthop vs nexthop6
      tests: rt: fix test cases
      doc: update man page
      Merge branch 'ct_rt_syntax_06'

Harsha Sharma (5):
      INSTALL: Update dependency list and configure with libxtables support
      test: shell: execute shell/run-tests.sh from any directory
      tests: shell: add testcases for named objects
      test: shell: update shell/run-tests.sh to refer to relative path of testcase
      nftables: make pointers in string arrays constant

Ismo Puustinen (8):
      scanner: add support for include directories
      tests: test include directories
      scanner: add files in include dirs in alphabetical order.
      man: add include directory documentation.
      tests: added tests for ordering files in include dirs.
      scanner: support for wildcards in include statements.
      tests: update include directory tests to support wildcard syntax.
      man: add include statement documentation.

JingPiao Chen (1):
      include: remove outdated comment

Laura Garcia Liebana (2):
      src: hash: support of symmetric hash
      src: hash: fix seed attribute not listed

Liping Zhang (4):
      ct: add average bytes per packet counter support
      src: fix crash when inputting an incomplete set add command
      hash: generate a random seed if seed option is empty
      src: delete the old cache when dumping is interrupted

Manuel Messner (7):
      evaluate: fix typo
      include: linux: netfilter: nf_tables: copy file from nf-next
      exthdr: prepare for tcp support
      exthdr: prepare exthdr_gen_dependency for tcp support
      src: add TCP option matching
      payload: automatically kill dependencies for exthdr and tcpopt
      tests: py: Add basic tests for ip, ip6 and inet

Oleksandr Natalenko (2):
      utils: provide array allocation wrapper
      segtree: allocate memory for arrays on heap

Pablo M. Bermudo Garay (5):
      src: add new generic context structure nft_ctx
      src: add --check option flag
      parser: fix typo
      src: add stateful object support for limit
      tests: py: add tests for limit stateful object

Pablo Neira Ayuso (65):
      include: fetch nf_tables.h updates
      src: remove SET_F_* flag definitions
      src: add used quota support
      src: listing of stateful objects
      src: add/create/delete stateful objects
      src: reset internal stateful objects
      parser_bison: allow RESET token from rhs
      src: add stateful object reference expression
      src: add support for stateful object maps
      src: support for stateful object monitoring
      mnl: use nftnl_nlmsg_build_hdr()
      tests: shell: cover cache flush on flush ruleset
      netlink: don't bail out on dump errors
      rule: check for errors from cache_init_objects() for stateful objects
      tests: shell: validate set size
      include: refresh linux/netfilter/nf_tables.h
      tests: shell: remove nft_set_bitmap on each run
      include: add tcpopt.h to Makefile.am
      evaluate: store byteorder for set keys
      netlink: store set byteorder in NFTA_SET_USERDATA
      netlink_delinearize: remove integer_type_postprocess()
      tests: py: fix incorrect bytecode in numgen and hash mappings
      datatype: add DTYPE_F_CLONE flag
      evaluate: set byteorder as lhs expression context in stmt_evaluate_arg()
      src: rename set_keytype_alloc() to set_datatype_alloc()
      netlink: rework NFTNL_SET_USERDATA to accomodate new attributes
      src: store byteorder for set data
      src: revisit tcp options support
      netlink: use nftnl_udata_put_u32()/nftnl_udata_get_u32()
      tests: shell: test comments with small sets
      doc: revisit fib examples
      tests: shell: delete element and chain in transaction
      rule: adjust set expression size accordingly with intervals
      segtree: reset element size counter before adding intervals to set
      netlink: add size description for constant sets
      tests: py: flush stdout on each test run
      expression: don't trim off unary expression on delinearization
      src: remove global nftnl_batch structure in mnl layer
      doc: nft: describe -I override behaviour when path starts by ./ and /
      src: display default directory for file inclusion in -h/--help
      src: error reporting for nested ruleset representation
      evaluate: merge nested set flags
      evaluate: Better error reporting for bad set references
      include: Pass nf_sock where needed as parameter
      src: handle rule tracing as an monitor object
      src: make netlink sequence number non-static
      rule: remove sequence number from struct eval_ctx
      src: add include_paths to struct nft_ctx
      src: add maximum number of parser errors to struct nft_ctx
      src: remove ifdef DEBUG pollution
      src: add struct mnl_ctx
      mnl: pass struct netlink_ctx to mnl_nft_socket_sendmsg()
      src: add debugging mask to context structure
      src: call nft_init() and nft_exit() from context routines
      src: move nf_sock into nft_ctx structure
      netlink: remove nfsock_open()
      src: add nft_ctx_netlink_init()
      mnl: do not set NLM_F_CREATE in deletion requests
      parser_bison: consolidate stmt_expr rule
      parser_bison: use keywords in ct expression
      parser_bison: allow helper keyword in ct object kind
      mnl: fix broken sequence number allocation
      parser_bison: allow to used named limit from dictionaries too
      scanner: IPv4-Mapped IPv6 addresses support
      configure: Bump version to v0.8

Phil Sutter (56):
      Introduce boolean datatype and boolean expression
      exthdr: Add support for exthdr specific flags
      exthdr: Implement existence check
      fib: Support existence check
      tests: Adjust for changed exthdr debug output
      doc: Document boolean type and applications
      proto: Add some exotic ICMPv6 types
      doc: Describe ICMP(v6) expression and types
      evaluate: set: Allow for set elems to be sets
      evaluate: set: Fix nested set merge size adjustment
      tests: Add test cases for nested anonymous sets
      tests: shell: netns/0003many_0: Fix cleanup after error
      sets: Fix for missing space after last element
      nft.8: Enhance NAT documentation
      segtree: Fix expr_value_cmp()
      src: Allow passing the parent set to set_expr_alloc()
      segtree: Introduce flag for half-open range elements
      tests: Add basic monitor testing framework
      monitor: Print NEWGEN events
      tests/monitor: Ignore newgen messages in output
      tests/monitor: Add a small README
      monitor: Fix printing of set declarations
      tests/monitor: Simplify testcases
      tests/monitor: Clear ruleset after testing
      mnl: Consolidate mnl_batch_talk() parameters
      netlink: Pass nlmsg flags from rule.c
      Implement --echo option
      tests: Add a simple test suite for --echo option
      nft.8: Document operations on ruleset
      nft.8: Describe conntrack types
      nft.8: Review reject statement description
      nft.8: Add note about supported hooks for bridge family
      nft.8: Describe base chain details
      nft.8: Complete short description of arp family
      mnl: Drop --echo support for non-batch calls
      netlink: Fix segfault when using --echo flag
      tests: Merge monitor and echo test suites
      echo: Fix for added delays in rule updates
      src: Keep cache in struct nft_ctx
      src: Fix debug_proto_ctx()
      scanner: Fix for memleak due to unclosed file pointer
      scanner: Fix for wrong parameter type of scanner_destroy()
      scanner: Make use of yylex_init_extra()
      parser: Fix for memleak when commands fail
      parser: Fix memleaks for STRING token (and derived ones)
      doc: nft: Fix and enhance synopsis section
      main: Fix for return of uninitialized variable in nft_run_cmd_from_filename()
      monitor: Fix for incorrect debug_mask
      rule: Use C99-style initializer in cache_init()
      exthdr: Simplify tcp option printing a bit
      erec_print: Pass output FILE pointer to netlink_dump_expr()
      rule: Refactor chain_print_declaration()
      src: get rid of printf
      main: Flush output from nft_gmp_print()
      main: Drop stdout hack to expose nft_print() implementation issues
      evaluate: Fix debug output

Shyam Saini (4):
      tests: py: Add test for ambiguity while setting the value
      tests: shell: Add test for incomplete set add set command
      tests: shell: Test input descriptors for included files
      tests: py: Fail test forcefully when bug is not fixed

Timothy Redaelli (1):
      tests: py: fix some typos in README

Tobias Klauser (1):
      build: add missing backslash to list of CFLAGS

Varsha Rao (18):
      src: Remove expire information from list stateless ruleset.
      src: Pass stateless, numeric, ip2name and handle variables as structure members.
      include: Remove datatype_register().
      src: Remove __init and __exit macro definitions.
      src: netlink: Remove variable nf_mon_sock.
      src: nft monitor ruleset
      man: Document nft monitor ruleset.
      src: netlink: Subscribe nft monitor and nft monitor trace to respective groups.
      src: introduce struct nft_cache
      man: Fix typo.
      src: Remove xt_stmt_() functions.
      src: gmputil: Remove mpz_get_be64() function.
      src: cli: Remove cli_display() function.
      src: netlink: Remove unused functions.
      src: mnl: Remove unused functions.
      src: Initialize struct stmt in _match and _target functions.
      tests: shell: Add tests for chain rename.
      tests: files: Remove old tests for chain rename.



More information about the netfilter-announce mailing list