This patchset adds support for nf_tables stateful objects. Two object
types are supported at this stage: counters and quotas. Stateful objects
are uniquely identified by a user-defined name and you have to attach
them to tables.
You can create a counter via:
# nft add table filter
# nft add counter filter http-traffic
Then, list existing counters through:
# nft list counters
table ip filter {
counter http-traffic {
packets 0 bytes 0
}
}
The counter and quota stateful object type definitions reside in
nft_counter.c and nft_quota.c respectively, as they share code with
these two stateful expressions. The new object reference (objref)
expression allows us to refer to stateful objects from rules. Assuming
you already have a base chain in place:
# nft add chain filter input { type filter hook input priority 0\; }
You can refer to this counter from rules, eg.
# nft add rule filter input tcp dport 80 counter http-traffic
But adding one rule per object is expensive, so you can instead use our
map infrastructure instead for fast lookups:
The following example shows how to use this through an anonymous map:
# nft add counter filter ftp-traffic
# nft add counter filter ssh-traffic
# nft add rule filter input counter name tcp dport map { \
20 : "ftp-traffic",
21 : "ftp-traffic",
22 : "ssh-traffic",
80 : "http-traffic",
443 : "http-traffic",
8080 : "http-traffic"
}
The rule above update a given counter based on the destination tcp port.
The nf_tables codebase has been extended to add a new NFT_SET_OBJECT set
flag that indicates that the set stores a mapping between any arbitrary
key and an existing stateful object. There is also a new
NFTA_SET_OBJTYPE attribute to indicate the stateful object type. Then,
there is a new NFTA_SET_ELEM_OBJREF that allows us to specific the right
hand side of the mapping using the string that uniquely identify the
stateful object. The objref expression has been extended to take a map
as parameter.
You also refer to stateful object from dynamic maps, eg.
# nft add map filter servers { type ipv4_addr . inet_service : counter \; }
# nft add rule filter input counter name ip daddr . tcp dport map @servers
# nft add counter filter www
# nft add counter filter ftp
# nft add element filter servers { 192.168.2.3 . 80 : "www" }
# nft add element filter servers { 192.168.2.4 . 20 : "ftp" }
# nft add element filter servers { 192.168.2.4 . 21 : "ftp" }
You can also atomically dump-and-reset stateful objects through:
# nft reset counter filter www
table filter {
counter www {
packets 123489 bytes 748374399
}
}
# nft list counter filter www
table filter {
counter www {
packets 0 bytes 0
}
}
As I said, this patch also comes with quota support, this also include
new infrastructure to deliver event notifications to userspace via
netlink whenever the quota has expired.
Comments welcome.
P.S: Limit stateful objects are not covered by this patchset, but it
should be relatively easy to add them later.
Pablo Neira Ayuso (11):
netfilter: nf_tables: add stateful objects
netfilter: nft_counter: add stateful object type
netfilter: nft_quota: add stateful object type
netfilter: nf_tables: add stateful object reference expression
netfilter: nf_tables: atomic dump and reset for stateful objects
netfilter: nf_tables: notify internal updates of stateful objects
netfilter: nft_quota: dump consumed quota
netfilter: nft_quota: add depleted flag for objects
netfilter: nf_tables: add stateful object reference to set elements
netfilter: nft_objref: support for stateful object maps
netfilter: nf_tables: allow to filter stateful object dumps by type
include/net/netfilter/nf_tables.h | 91 +++++
include/uapi/linux/netfilter/nf_tables.h | 67 ++-
net/netfilter/Kconfig | 6 +
net/netfilter/Makefile | 1 +
net/netfilter/nf_tables_api.c | 674 ++++++++++++++++++++++++++++++-
net/netfilter/nft_counter.c | 138 +++++--
net/netfilter/nft_objref.c | 227 +++++++++++
net/netfilter/nft_quota.c | 116 +++++-
8 files changed, 1256 insertions(+), 64 deletions(-)
create mode 100644 net/netfilter/nft_objref.c
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html