Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp581608ybh; Sat, 3 Aug 2019 05:36:18 -0700 (PDT) X-Google-Smtp-Source: APXvYqzWkIq8jLxxzyJeu4D1CsrKL00espuiC9a7bJ2kFvzneP8kOd9S2feULNAzH/rJtvoBd3FB X-Received: by 2002:a62:5c3:: with SMTP id 186mr18436714pff.144.1564835778511; Sat, 03 Aug 2019 05:36:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564835778; cv=none; d=google.com; s=arc-20160816; b=aBkvwPgMzQOeLZUo7ICn5wwzjuuQNjihvNDeJyPHnALOoaTH6GJefGhn+T7lHfiYYB +frjW8qYa0rI/MGyY95ZPCZWncVxYIjjYe7A0n1nqoUZVQfbdb1LFXcvD42UMPYWWtVP K5Cfre1AxARKLsyxkpvG3hMywIhuccp6/OKVSSyczcrteomvL2eEpk5LFjkehGW4L64g pY1F3iP93TA0wWAd+IMBmlgg9MIsqRjKZj/Yco3EintGWAQTMQ1I2nDR607OcMpCNTaK K5jScVg3PpYKgjN6k5kD/g01tYL+340WBIuSJvC+8DwzEw+2/C3u4p/FfEh5SIoBiGwz ObHQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Hv3jXSqcK6aJHKhdLvQf3Z1UfT1+lvaNlp0CSj+bPl8=; b=U/6CzZzDrI8ahpn87u+yofE8JsuewHYMrYAgd+50l6t24C8n8OPwHVbWV30SnLOVck FeznV+AjU33wqvA2E1zrncv76un/lfxVd5i7qlbd0NeRq/CzPHqN35Jg3gITX8+p337z AvvLYXFbg9M1mDMpFWMDWWHKCrnpj9QQlOkZgkYOYQrE8awHQiy3nQE3Z4pgcl/AhhZu Fe+7BUtHNOVR7Y2S/sAPhE5ItFZVlD0h6DvzYWERx3bJ/8p0+q3FVj9LH7ifsDha6Xl6 /BTiKLAMqPr71nKjVBk8ubuOtarU6hoMnHbWk3j/qf6dT2FlFOJoRbNFZx5uIf13cRQT 0m7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=MAYaRKE6; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f34si9143748pgb.527.2019.08.03.05.36.02; Sat, 03 Aug 2019 05:36:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=MAYaRKE6; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405600AbfHBNdv (ORCPT + 99 others); Fri, 2 Aug 2019 09:33:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:33678 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2393902AbfHBNXH (ORCPT ); Fri, 2 Aug 2019 09:23:07 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2F3D621841; Fri, 2 Aug 2019 13:23:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564752187; bh=7WIf34cST46uvpdgsEeIiMoiWhc4fBAvjeuIenOGkxg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MAYaRKE6EQ9CTjSxiDSzXyXWgc8RAZANqERWEifuOOj41LPQ5O6/RtQOEUkeQ8pVr yW52jpNUT0qFXCRaDzYsM1p8eK4NpQCVO0GzRnEuL3j6S3E4/id3pvBIVpqOxoTvnU Dan95/5rW9QFjjBm8v+s5I/WPICQk9F36xXnvDfc= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Miaohe Lin , Pablo Neira Ayuso , Sasha Levin , netfilter-devel@vger.kernel.org, coreteam@netfilter.org, netdev@vger.kernel.org Subject: [PATCH AUTOSEL 4.19 03/42] netfilter: Fix rpfilter dropping vrf packets by mistake Date: Fri, 2 Aug 2019 09:22:23 -0400 Message-Id: <20190802132302.13537-3-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190802132302.13537-1-sashal@kernel.org> References: <20190802132302.13537-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Miaohe Lin [ Upstream commit b575b24b8eee37f10484e951b62ce2a31c579775 ] When firewalld is enabled with ipv4/ipv6 rpfilter, vrf ipv4/ipv6 packets will be dropped. Vrf device will pass through netfilter hook twice. One with enslaved device and another one with l3 master device. So in device may dismatch witch out device because out device is always enslaved device.So failed with the check of the rpfilter and drop the packets by mistake. Signed-off-by: Miaohe Lin Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- net/ipv4/netfilter/ipt_rpfilter.c | 1 + net/ipv6/netfilter/ip6t_rpfilter.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/net/ipv4/netfilter/ipt_rpfilter.c b/net/ipv4/netfilter/ipt_rpfilter.c index 12843c9ef1421..74b19a5c572e9 100644 --- a/net/ipv4/netfilter/ipt_rpfilter.c +++ b/net/ipv4/netfilter/ipt_rpfilter.c @@ -96,6 +96,7 @@ static bool rpfilter_mt(const struct sk_buff *skb, struct xt_action_param *par) flow.flowi4_mark = info->flags & XT_RPFILTER_VALID_MARK ? skb->mark : 0; flow.flowi4_tos = RT_TOS(iph->tos); flow.flowi4_scope = RT_SCOPE_UNIVERSE; + flow.flowi4_oif = l3mdev_master_ifindex_rcu(xt_in(par)); return rpfilter_lookup_reverse(xt_net(par), &flow, xt_in(par), info->flags) ^ invert; } diff --git a/net/ipv6/netfilter/ip6t_rpfilter.c b/net/ipv6/netfilter/ip6t_rpfilter.c index c3c6b09acdc4f..0f3407f2851ed 100644 --- a/net/ipv6/netfilter/ip6t_rpfilter.c +++ b/net/ipv6/netfilter/ip6t_rpfilter.c @@ -58,7 +58,9 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb, if (rpfilter_addr_linklocal(&iph->saddr)) { lookup_flags |= RT6_LOOKUP_F_IFACE; fl6.flowi6_oif = dev->ifindex; - } else if ((flags & XT_RPFILTER_LOOSE) == 0) + /* Set flowi6_oif for vrf devices to lookup route in l3mdev domain. */ + } else if (netif_is_l3_master(dev) || netif_is_l3_slave(dev) || + (flags & XT_RPFILTER_LOOSE) == 0) fl6.flowi6_oif = dev->ifindex; rt = (void *)ip6_route_lookup(net, &fl6, skb, lookup_flags); @@ -73,7 +75,9 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb, goto out; } - if (rt->rt6i_idev->dev == dev || (flags & XT_RPFILTER_LOOSE)) + if (rt->rt6i_idev->dev == dev || + l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) == dev->ifindex || + (flags & XT_RPFILTER_LOOSE)) ret = true; out: ip6_rt_put(rt); -- 2.20.1