From: Pablo Neira Ayuso <pablo@netfilter.org> Date: 2021-06-10 16:55:08
Hi,
The following patchset contains Netfilter fixes for net:
1) Fix a crash when stateful expression with its own gc callback
is used in a set definition.
2) Skip IPv6 packets from any link-local address in IPv6 fib expression.
Add a selftest for this scenario, from Florian Westphal.
Please, pull these changes from:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git
Thank you!
----------------------------------------------------------------
The following changes since commit f2386cf7c5f4ff5d7b584f5d92014edd7df6c676:
net: lantiq: disable interrupt before sheduling NAPI (2021-06-08 19:16:32 -0700)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git HEAD
for you to fetch changes up to 12f36e9bf678a81d030ca1b693dcda62b55af7c5:
netfilter: nft_fib_ipv6: skip ipv6 packets from any to link-local (2021-06-09 21:11:03 +0200)
----------------------------------------------------------------
Florian Westphal (2):
selftests: netfilter: add fib test case
netfilter: nft_fib_ipv6: skip ipv6 packets from any to link-local
Pablo Neira Ayuso (1):
netfilter: nf_tables: initialize set before expression setup
net/ipv6/netfilter/nft_fib_ipv6.c | 22 ++-
net/netfilter/nf_tables_api.c | 85 ++++++-----
tools/testing/selftests/netfilter/Makefile | 2 +-
tools/testing/selftests/netfilter/nft_fib.sh | 221 +++++++++++++++++++++++++++
4 files changed, 283 insertions(+), 47 deletions(-)
create mode 100755 tools/testing/selftests/netfilter/nft_fib.sh
From: Pablo Neira Ayuso <pablo@netfilter.org> Date: 2021-06-10 16:55:10
From: Florian Westphal <fw@strlen.de>
The ip6tables rpfilter match has an extra check to skip packets with
"::" source address.
Extend this to ipv6 fib expression. Else ipv6 duplicate address detection
packets will fail rpf route check -- lookup returns -ENETUNREACH.
While at it, extend the prerouting check to also cover the ingress hook.
Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1543
Fixes: f6d0cbcf09c5 ("netfilter: nf_tables: add fib expression")
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/ipv6/netfilter/nft_fib_ipv6.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
From: Pablo Neira Ayuso <pablo@netfilter.org> Date: 2021-06-10 16:55:10
From: Florian Westphal <fw@strlen.de>
There is a bug report on netfilter.org bugzilla pointing to fib
expression dropping ipv6 DAD packets.
Add a test case that demonstrates this problem.
Next patch excludes icmpv6 packets coming from any to linklocal.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
tools/testing/selftests/netfilter/Makefile | 2 +-
tools/testing/selftests/netfilter/nft_fib.sh | 221 +++++++++++++++++++
2 files changed, 222 insertions(+), 1 deletion(-)
create mode 100755 tools/testing/selftests/netfilter/nft_fib.sh
@@ -0,0 +1,221 @@+#!/bin/bash+#+# This tests the fib expression.+#+# Kselftest framework requirement - SKIP code is 4.+ksft_skip=4+ret=0++sfx=$(mktemp-u"XXXXXXXX")+ns1="ns1-$sfx"+ns2="ns2-$sfx"+nsrouter="nsrouter-$sfx"+timeout=4++log_netns=$(sysctl-nnet.netfilter.nf_log_all_netns)++cleanup()+{+ipnetnsdel${ns1}+ipnetnsdel${ns2}+ipnetnsdel${nsrouter}++[$log_netns-eq0]&&sysctl-qnet.netfilter.nf_log_all_netns=$log_netns+}++nft--version>/dev/null2>&1+if[$?-ne0];then+echo"SKIP: Could not run test without nft tool"+exit$ksft_skip+fi++ip-Version>/dev/null2>&1+if[$?-ne0];then+echo"SKIP: Could not run test without ip tool"+exit$ksft_skip+fi++ipnetnsadd${nsrouter}+if[$?-ne0];then+echo"SKIP: Could not create net namespace"+exit$ksft_skip+fi++trapcleanupEXIT++dmesg|grep-q' nft_rpfilter: '+if[$?-eq0];then+dmesg-c|grep' nft_rpfilter: '+echo"WARN: a previous test run has failed"1>&2+fi++sysctl-qnet.netfilter.nf_log_all_netns=1+ipnetnsadd${ns1}+ipnetnsadd${ns2}++load_ruleset(){+localnetns=$1++ipnetnsexec${netns}nft-f/dev/stdin<<EOF+tableinetfilter{+chainprerouting{+typefilterhookpreroutingpriority0;policyaccept;+fibsaddr.iifoifmissingcounterlogprefix"$netns nft_rpfilter: "drop+}+}+EOF+}++load_ruleset_count(){+localnetns=$1++ipnetnsexec${netns}nft-f/dev/stdin<<EOF+tableinetfilter{+chainprerouting{+typefilterhookpreroutingpriority0;policyaccept;+ipdaddr1.1.1.1fibsaddr.iifoifmissingcounterdrop+ip6daddr1c3::c01dfibsaddr.iifoifmissingcounterdrop+}+}+EOF+}++check_drops(){+dmesg|grep-q' nft_rpfilter: '+if[$?-eq0];then+dmesg|grep' nft_rpfilter: '+echo"FAIL: rpfilter did drop packets"+return1+fi++return0+}++check_fib_counter(){+localwant=$1+localns=$2+localaddress=$3++line=$(ipnetnsexec${ns}nftlisttableinetfilter|grep'fib saddr . iif'|grep$address|grep"packets $want")+ret=$?++if[$ret-ne0];then+echo"Netns $ns fib counter doesn't match expected packet count of $want for $address"1>&2+ipnetnsexec${ns}nftlisttableinetfilter+return1+fi++if[$want-gt0];then+echo"PASS: fib expression did drop packets for $address"+fi++return0+}++load_ruleset${nsrouter}+load_ruleset${ns1}+load_ruleset${ns2}++iplinkaddveth0netns${nsrouter}typevethpeernameeth0netns${ns1}>/dev/null2>&1+if[$?-ne0];then+echo"SKIP: No virtual ethernet pair device support in kernel"+exit$ksft_skip+fi+iplinkaddveth1netns${nsrouter}typevethpeernameeth0netns${ns2}++ip-net${nsrouter}linksetloup+ip-net${nsrouter}linksetveth0up+ip-net${nsrouter}addradd10.0.1.1/24devveth0+ip-net${nsrouter}addradddead:1::1/64devveth0++ip-net${nsrouter}linksetveth1up+ip-net${nsrouter}addradd10.0.2.1/24devveth1+ip-net${nsrouter}addradddead:2::1/64devveth1++ip-net${ns1}linksetloup+ip-net${ns1}linkseteth0up++ip-net${ns2}linksetloup+ip-net${ns2}linkseteth0up++ip-net${ns1}addradd10.0.1.99/24deveth0+ip-net${ns1}addradddead:1::99/64deveth0+ip-net${ns1}routeadddefaultvia10.0.1.1+ip-net${ns1}routeadddefaultviadead:1::1++ip-net${ns2}addradd10.0.2.99/24deveth0+ip-net${ns2}addradddead:2::99/64deveth0+ip-net${ns2}routeadddefaultvia10.0.2.1+ip-net${ns2}routeadddefaultviadead:2::1++test_ping(){+localdaddr4=$1+localdaddr6=$2++ipnetnsexec${ns1}ping-c1-q$daddr4>/dev/null+ret=$?+if[$ret-ne0];then+check_drops+echo"FAIL: ${ns1} cannot reach $daddr4, ret $ret"1>&2+return1+fi++ipnetnsexec${ns1}ping-c3-q$daddr6>/dev/null+ret=$?+if[$ret-ne0];then+check_drops+echo"FAIL: ${ns1} cannot reach $daddr6, ret $ret"1>&2+return1+fi++return0+}++ipnetnsexec${nsrouter}sysctlnet.ipv6.conf.all.forwarding=1>/dev/null+ipnetnsexec${nsrouter}sysctlnet.ipv4.conf.veth0.forwarding=1>/dev/null+ipnetnsexec${nsrouter}sysctlnet.ipv4.conf.veth1.forwarding=1>/dev/null++sleep3++test_ping10.0.2.1dead:2::1||exit1+check_drops||exit1++test_ping10.0.2.99dead:2::99||exit1+check_drops||exit1++echo"PASS: fib expression did not cause unwanted packet drops"++ipnetnsexec${nsrouter}nftflushtableinetfilter++ip-net${ns1}routedeldefault+ip-net${ns1}-6routedeldefault++ip-net${ns1}addrdel10.0.1.99/24deveth0+ip-net${ns1}addrdeldead:1::99/64deveth0++ip-net${ns1}addradd10.0.2.99/24deveth0+ip-net${ns1}addradddead:2::99/64deveth0++ip-net${ns1}routeadddefaultvia10.0.2.1+ip-net${ns1}-6routeadddefaultviadead:2::1++ip-net${nsrouter}addradddead:2::1/64devveth0++# switch to ruleset that doesn't log, this time+# its expected that this does drop the packets.+load_ruleset_count${nsrouter}++# ns1 has a default route, but nsrouter does not.+# must not check return value, ping to 1.1.1.1 will+# fail.+check_fib_counter0${nsrouter}1.1.1.1||exit1+check_fib_counter0${nsrouter}1c3::c01d||exit1++ipnetnsexec${ns1}ping-c1-W1-q1.1.1.1>/dev/null+check_fib_counter1${nsrouter}1.1.1.1||exit1++sleep2+ipnetnsexec${ns1}ping-c3-q1c3::c01d>/dev/null+check_fib_counter3${nsrouter}1c3::c01d||exit1++exit0