]> git.ipfire.org Git - thirdparty/nftables.git/commit
src: support for nat with interval concatenation
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 13 Jul 2021 18:21:01 +0000 (20:21 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 13 Jul 2021 18:33:05 +0000 (20:33 +0200)
commit66746e7dedeb0cdc5d63b388ad923ac35b25a2ca
tree47e15f9be8d4033adf147fd581a6cd3d3405ab9d
parentc68314dd4263575abaed43e052c7e61f6b359040
src: support for nat with interval concatenation

This patch allows you to combine concatenation and interval in NAT
mappings, e.g.

 add rule x y dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }

This generates the following NAT expression:

 [ nat dnat ip addr_min reg 1 addr_max reg 10 proto_min reg 9 proto_max reg 11 ]

which expects to obtain the following tuple:

 IP address (min), source port (min), IP address (max), source port (max)

to be obtained from the map. This representation simplifies the
delinearize path, since the datatype is specified as:

 ipv4_addr . inet_service.

A few more notes on this update:

- alloc_nftnl_setelem() needs a variant netlink_gen_data() to deal with
  the representation of the range on the rhs of the mapping. In contrast
  to interval concatenation in the key side, where the range is expressed
  as two netlink attributes, the data side of the set element mapping
  stores the interval concatenation in a contiguos memory area, see
  __netlink_gen_concat_expand() for reference.

- add range_expr_postprocess() to postprocess the data mapping range.
  If either one single IP address or port is used, then the minimum and
  maximum value in the range is the same value, e.g. to avoid listing
  80-80, this round simplify the range. This also invokes the range
  to prefix conversion routine.

- add concat_elem_expr() helper function to consolidate code to build
  the concatenation expression on the rhs element data side.

This patch also adds tests/py and tests/shell.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c
src/netlink.c
src/netlink_delinearize.c
src/netlink_linearize.c
tests/py/ip/dnat.t
tests/py/ip/dnat.t.payload.ip
tests/py/ip/snat.t
tests/py/ip/snat.t.json
tests/py/ip/snat.t.payload
tests/shell/testcases/sets/0067nat_concat_interval_0 [new file with mode: 0755]
tests/shell/testcases/sets/dumps/0067nat_concat_interval_0.nft [new file with mode: 0644]