All of lore.kernel.org
 help / color / mirror / Atom feed
* Expressive limitation: (daddr,dport) <--> (daddr',dport')
@ 2020-06-07  5:08 Rick van Rein
  2020-06-07 22:08 ` Pablo Neira Ayuso
  0 siblings, 1 reply; 6+ messages in thread
From: Rick van Rein @ 2020-06-07  5:08 UTC (permalink / raw)
  To: netfilter-devel

Hello,

I seem to be running into an expressive limitation of nft while trying
to do stateless translation.  I prefer statelessness because it it is
clearer for bidirectionality / peering, and saves lookup times.

After nat64, I have a small set of IPv6 addresses and I would like to
map their (daddr,dport) or better even (daddr,proto,dport) tuples to
outgoing (daddr',dport').  Effectively, port forwarding for IPv6.

Individual rules work, like this one side of a bidir portmap:

nft add rule ip6 raw prerouting \
   ip6 daddr $PREFIX::64:75 \
   tcp dport 8080 \
   ip6 daddr set $PREFIX::100:20 \
   tcp dport set 80 \
   notrack

I have problems doing this with the map construct, presumably because it
does not atomically replace (daddr,dport) by (daddr',dport') but instead
does two assignments with intermediate alterede state.  This is bound to
work in many cases, but it can give undesired crossover behaviours
[namely between incoming IPs if they map to the same daddr' while coming
from the same dport]:

nft add rule ip6 raw prerouting \
   ip6 daddr set \
      ip6 daddr . tcp dport \
         map { $PREFIX::64:75 . 8080 : $PREFIX::100:20 } \
   tcp dport set \
      ip6 daddr . tcp dport \
         map { $PREFIX::100:20 . 8080 : 80 } \
   notrack

So now I am wondering,

 0. Is there a way to use maps as atomic setter for (daddr,dport)?
 1. Can I reach back to the original value of a just-modified value?
 2. Is there a variable, or stack, to prepare with the old value?

Without this, I need to work around an expressive limitation,

 * Fan out from a few IPv6 to many first to minimise rule clashes
 * Make separate maps and rules and maps for each of the IPv6 addresses

Both sound to me like a lack of expressiveness, or that I missed how.

Thanks!
 -Rick

^ permalink raw reply	[flat|nested] 6+ messages in thread
* Expressive limitation: (daddr,dport) <--> (daddr',dport')
@ 2020-06-01 16:08 Rick van Rein
  0 siblings, 0 replies; 6+ messages in thread
From: Rick van Rein @ 2020-06-01 16:08 UTC (permalink / raw)
  To: netfilter

Hello,

I seem to be running into an expressive limitation of nft while trying
to do stateless translation.  I prefer statelessness because it has no
direction, and should support of peer-to-peer mechanisms better than
stateful dnat/snat.  I also suspect it is more efficient.

After nat64, I have a small set of IPv6 addresses and I would like to
map their (daddr,dport) or better even (daddr,proto,dport) tuples to
outgoing (daddr',dport').  Effectively, this is port forwarding.

If I specify single rules for single mappings (one direction only for
now) I can see the expected response to the connection attempt:

nft add rule ip6 raw prerouting \
   ip6 daddr $PREFIX::64:75 \
   tcp dport 8080 \
   ip6 daddr set $PREFIX::100:20 \
   tcp dport set 80 \
   notrack

I have problems doing this with the map construct, presumably because it
does not atomically replace (daddr,dport) by (daddr',dport') but instead
does two assignments with intermediate alterede state.  This is bound to
work in many cases, but it can give undesired crossover behaviours
[namely between incoming IPs if they map to the same daddr' while coming
from the same dport]:

nft add rule ip6 raw prerouting \
   ip6 daddr set \
      ip6 daddr . tcp dport \
         map { $PREFIX::64:75 . 8080 : $PREFIX::100:20 } \
   tcp dport set \
      ip6 daddr . tcp dport \
         map { $PREFIX::100:20 . 8080 : 80 } \
   notrack

So now I am wondering,

 0. Is there a way to use maps as atomic setter for (daddr,dport)?
 1. Can I reach back to the original value of a just-modified value?

If this won't work, I can still make separate rules for each of the few
values for daddr, but I wanted to ask just to be sure that this is
something that cannot be expressed by nft.

That aside, I am making the switch, and I am pleased by the logic of
nft; just the syntax takes some getting used to; I've seen ":" between
actions, and wondered if that could be an atomic composer?


Thanks!
 -Rick

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-06-08 11:01 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-07  5:08 Expressive limitation: (daddr,dport) <--> (daddr',dport') Rick van Rein
2020-06-07 22:08 ` Pablo Neira Ayuso
2020-06-08 10:02   ` Rick van Rein
2020-06-08 10:31     ` Pablo Neira Ayuso
2020-06-08 11:01       ` Rick van Rein
  -- strict thread matches above, loose matches on Subject: below --
2020-06-01 16:08 Rick van Rein

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.