Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9de920ed authored by Arturo Borrero's avatar Arturo Borrero Committed by Pablo Neira Ayuso
Browse files

netfilter: refactor NAT redirect IPv6 code to use it from nf_tables



This patch refactors the IPv6 code so it can be usable both from xt and
nf_tables.

Signed-off-by: default avatarArturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 8b13eddf
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
#ifndef _NF_NAT_REDIRECT_IPV6_H_
#define _NF_NAT_REDIRECT_IPV6_H_

unsigned int
nf_nat_redirect_ipv6(struct sk_buff *skb, const struct nf_nat_range *range,
		     unsigned int hooknum);

#endif /* _NF_NAT_REDIRECT_IPV6_H_ */
+6 −0
Original line number Original line Diff line number Diff line
@@ -82,6 +82,12 @@ config NF_NAT_MASQUERADE_IPV6
	  This is the kernel functionality to provide NAT in the masquerade
	  This is the kernel functionality to provide NAT in the masquerade
	  flavour (automatic source address selection) for IPv6.
	  flavour (automatic source address selection) for IPv6.


config NF_NAT_REDIRECT_IPV6
	tristate "IPv6 redirect support"
	help
	  This is the kernel functionality to provide NAT in the redirect
	  flavour (redirect packet to local machine) for IPv6.

config NFT_MASQ_IPV6
config NFT_MASQ_IPV6
	tristate "IPv6 masquerade support for nf_tables"
	tristate "IPv6 masquerade support for nf_tables"
	depends on NF_TABLES_IPV6
	depends on NF_TABLES_IPV6
+1 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ obj-$(CONFIG_NF_CONNTRACK_IPV6) += nf_conntrack_ipv6.o
nf_nat_ipv6-y		:= nf_nat_l3proto_ipv6.o nf_nat_proto_icmpv6.o
nf_nat_ipv6-y		:= nf_nat_l3proto_ipv6.o nf_nat_proto_icmpv6.o
obj-$(CONFIG_NF_NAT_IPV6) += nf_nat_ipv6.o
obj-$(CONFIG_NF_NAT_IPV6) += nf_nat_ipv6.o
obj-$(CONFIG_NF_NAT_MASQUERADE_IPV6) += nf_nat_masquerade_ipv6.o
obj-$(CONFIG_NF_NAT_MASQUERADE_IPV6) += nf_nat_masquerade_ipv6.o
obj-$(CONFIG_NF_NAT_REDIRECT_IPV6) += nf_nat_redirect_ipv6.o


# defrag
# defrag
nf_defrag_ipv6-y := nf_defrag_ipv6_hooks.o nf_conntrack_reasm.o
nf_defrag_ipv6-y := nf_defrag_ipv6_hooks.o nf_conntrack_reasm.o
+75 −0
Original line number Original line Diff line number Diff line
/*
 * (C) 1999-2001 Paul `Rusty' Russell
 * (C) 2002-2006 Netfilter Core Team <coreteam@netfilter.org>
 * Copyright (c) 2011 Patrick McHardy <kaber@trash.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Based on Rusty Russell's IPv4 REDIRECT target. Development of IPv6
 * NAT funded by Astaro.
 */

#include <linux/if.h>
#include <linux/inetdevice.h>
#include <linux/ip.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/netfilter.h>
#include <linux/types.h>
#include <linux/netfilter_ipv6.h>
#include <linux/netfilter/x_tables.h>
#include <net/addrconf.h>
#include <net/checksum.h>
#include <net/protocol.h>
#include <net/netfilter/nf_nat.h>
#include <net/netfilter/ipv6/nf_nat_redirect.h>

static const struct in6_addr loopback_addr = IN6ADDR_LOOPBACK_INIT;

unsigned int
nf_nat_redirect_ipv6(struct sk_buff *skb, const struct nf_nat_range *range,
		     unsigned int hooknum)
{
	struct nf_nat_range newrange;
	struct in6_addr newdst;
	enum ip_conntrack_info ctinfo;
	struct nf_conn *ct;

	ct = nf_ct_get(skb, &ctinfo);
	if (hooknum == NF_INET_LOCAL_OUT) {
		newdst = loopback_addr;
	} else {
		struct inet6_dev *idev;
		struct inet6_ifaddr *ifa;
		bool addr = false;

		rcu_read_lock();
		idev = __in6_dev_get(skb->dev);
		if (idev != NULL) {
			list_for_each_entry(ifa, &idev->addr_list, if_list) {
				newdst = ifa->addr;
				addr = true;
				break;
			}
		}
		rcu_read_unlock();

		if (!addr)
			return NF_DROP;
	}

	newrange.flags		= range->flags | NF_NAT_RANGE_MAP_IPS;
	newrange.min_addr.in6	= newdst;
	newrange.max_addr.in6	= newdst;
	newrange.min_proto	= range->min_proto;
	newrange.max_proto	= range->max_proto;

	return nf_nat_setup_info(ct, &newrange, NF_NAT_MANIP_DST);
}
EXPORT_SYMBOL_GPL(nf_nat_redirect_ipv6);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
+1 −0
Original line number Original line Diff line number Diff line
@@ -836,6 +836,7 @@ config NETFILTER_XT_TARGET_REDIRECT
	tristate "REDIRECT target support"
	tristate "REDIRECT target support"
	depends on NF_NAT
	depends on NF_NAT
	select NF_NAT_REDIRECT_IPV4
	select NF_NAT_REDIRECT_IPV4
	select NF_NAT_REDIRECT_IPV6 if IP6_NF_IPTABLES
	---help---
	---help---
	REDIRECT is a special case of NAT: all incoming connections are
	REDIRECT is a special case of NAT: all incoming connections are
	mapped onto the incoming interface's address, causing the packets to
	mapped onto the incoming interface's address, causing the packets to
Loading