netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thierry Du Tre <thierry@dtsystems.be>
To: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: netfilter-devel@vger.kernel.org, Patrick McHardy <kaber@trash.net>
Subject: Re: [PATCH] netfilter : add NAT support for shifted portmap ranges
Date: Thu, 21 Dec 2017 15:46:27 +0100	[thread overview]
Message-ID: <558e25d6-a76f-56db-5e9e-59b5a87c985e@dtsystems.be> (raw)
In-Reply-To: <20171220221613.4qnsjny2gackyykb@salvia>

Op 20/12/2017 om 23:16 schreef Pablo Neira Ayuso:
> On Wed, Dec 20, 2017 at 01:28:09PM +0100, Thierry Du Tre wrote:
>> This is a patch proposal to support shifted ranges in portmaps.
>> (i.e. tcp/udp incoming port 5000-5100 on WAN redirected to LAN
>> 192.168.1.5:2000-2100)
>>
>> Currently DNAT only works for single port or identical port ranges.
>> (i.e. ports 5000-5100 on WAN interface redirected to a LAN host while
>> original destination port is not altered)
>> When different port ranges are configured, either 'random' mode should be
>> used, or else all incoming connections are mapped onto the first port in the
>> redirect range. (in described example WAN:5000-5100 will all be mapped to
>> 192.168.1.5:2000)
> 
> This behaviour you describe above also applies to the current
> portmapping we do, right?

Yes, I described the current behavior to elaborate on the purpose of 
this patch ; enabling missing functionality in current implementation.

> One more comment below.
> 
>> This patch introduces a new mode indicated by flag NF_NAT_RANGE_PROTO_OFFSET
>> which uses a base port value to calculate an offset with the destination
>> port present in the incoming stream. That offset is then applied as index
>> within the redirect port range (index modulo rangewidth to handle range
>> overflow).
>>
>> In described example the base port would be 5000. An incoming stream with
>> destination port 5004 would result in an offset value 4 which means that the
>> NAT'ed stream will be using destination port 2004.
>>
>> Other possibilities include deterministic mapping of larger or multiple
>> ranges to a smaller range : WAN:5000-5999 -> LAN:5000-5099 (maps WAN port
>> 5*xx to port 51xx)
>>
>> This patch does not change any current behavior. It just adds new NAT proto
>> range functionality which must be selected via the specific flag when
>> intended to use.
>>
>> A patch for iptables (libipt_DNAT.c) will also be proposed which makes this
>> functionality immediately available.
>>
>> Signed-off-by: Thierry Du Tre <thierry@dtsystems.be>
>>
>> ---
>>   include/uapi/linux/netfilter/nf_nat.h | 5 ++++-
>>   net/netfilter/nf_nat_core.c           | 7 ++++---
>>   net/netfilter/nf_nat_proto_common.c   | 5 ++++-
>>   net/netfilter/xt_nat.c                | 1 +
>>   4 files changed, 13 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/uapi/linux/netfilter/nf_nat.h
>> b/include/uapi/linux/netfilter/nf_nat.h
>> index a33000d..5b3952b 100644
>> --- a/include/uapi/linux/netfilter/nf_nat.h
>> +++ b/include/uapi/linux/netfilter/nf_nat.h
>> @@ -10,6 +10,7 @@
>>   #define NF_NAT_RANGE_PROTO_RANDOM		(1 << 2)
>>   #define NF_NAT_RANGE_PERSISTENT			(1 << 3)
>>   #define NF_NAT_RANGE_PROTO_RANDOM_FULLY		(1 << 4)
>> +#define NF_NAT_RANGE_PROTO_OFFSET		(1 << 5)
>>
>>   #define NF_NAT_RANGE_PROTO_RANDOM_ALL		\
>>   	(NF_NAT_RANGE_PROTO_RANDOM | NF_NAT_RANGE_PROTO_RANDOM_FULLY)
>> @@ -17,7 +18,7 @@
>>   #define NF_NAT_RANGE_MASK					\
>>   	(NF_NAT_RANGE_MAP_IPS | NF_NAT_RANGE_PROTO_SPECIFIED |	\
>>   	 NF_NAT_RANGE_PROTO_RANDOM | NF_NAT_RANGE_PERSISTENT |	\
>> -	 NF_NAT_RANGE_PROTO_RANDOM_FULLY)
>> +	 NF_NAT_RANGE_PROTO_RANDOM_FULLY | NF_NAT_RANGE_PROTO_OFFSET)
>>
>>   struct nf_nat_ipv4_range {
>>   	unsigned int			flags;
>> @@ -25,6 +26,7 @@ struct nf_nat_ipv4_range {
>>   	__be32				max_ip;
>>   	union nf_conntrack_man_proto	min;
>>   	union nf_conntrack_man_proto	max;
>> +	union nf_conntrack_man_proto	base;
>>   };
> 
> This one is exposed to userspace, therefore, this will break backward
> compatibility in iptables.
> 
> You will need to add a revision in xt_nat, and some compat code all
> over the place.

That spoils the party I guess. I'm not familiar with the expectations 
regarding changes in uapi, but I'll try to work something out.

      reply	other threads:[~2017-12-21 14:46 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-20 12:28 [PATCH] netfilter : add NAT support for shifted portmap ranges Thierry Du Tre
2017-12-20 22:16 ` Pablo Neira Ayuso
2017-12-21 14:46   ` Thierry Du Tre [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=558e25d6-a76f-56db-5e9e-59b5a87c985e@dtsystems.be \
    --to=thierry@dtsystems.be \
    --cc=kaber@trash.net \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=pablo@netfilter.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).