Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 May 2018 08:43:33 -0700 (PDT)
From:      "Rodney W. Grimes" <freebsd-rwg@pdx.rh.CN85.dnsmgr.net>
To:        Mark Raynsford <list+org.freebsd.net@io7m.com>
Cc:        freebsd-net@freebsd.org
Subject:   Re: pf: Efficiently specifying discontinuous IPv6 ranges
Message-ID:  <201805111543.w4BFhXTS076071@pdx.rh.CN85.dnsmgr.net>
In-Reply-To: <20180511162809.4b59ef02@almond.int.arc7.info>

next in thread | previous in thread | raw e-mail | index | archive | help
> Hello.
> 
> Let's say I have a host and I want to restrict access to that host to a
> discontinuous range of IPv6 addresses. For example, let's say I want to
> allow access to a host from addresses [2a00:1450:400c::,
> 2a00:1450:400c::1000], [2a04:4e42:600::200, 2a04:4e42:600::400], and
> individually 2001:1900:2254:206a::50:0, 2001:19f0:5:61d:f000::, and
> 2001:4998:58:1836::10.
> 
> I could try this:
> 
> good_0 = "2a00:1450:400c:: - 2a00:1450:400c::1000"
> good_1 = "2a04:4e42:600::200 - 2a04:4e42:600::400"
> good_2 = 2001:1900:2254:206a::50:0
> good_3 = 2001:19f0:5:61d:f000::
> good_4 = 2001:4998:58:1836::10
> 
> table <good_users> = { \
>   $good_0, \
>   $good_1, \
>   $good_2, \
>   $good_3, \
>   $good_4  \
> }
> 
> pass in from <good_users> to me ...
> 
> This, however, won't work because IPv6 address ranges are not allowed
> in tables.
> 
> I could try this:
> 
> good_0 = 2a00:1450:400c:: - 2a00:1450:400c::1000
> good_1 = 2a04:4e42:600::200 - 2a04:4e42:600::400
> good_2 = 2001:1900:2254:206a::50:0
> good_3 = 2001:19f0:5:61d:f000::
> good_4 = 2001:4998:58:1836::10
> 
> good_users = "{ \
>   $good_0, \
>   $good_1, \
>   $good_2, \
>   $good_3, \
>   $good_4  \
> }"
> 
> pass in from $good_users> to me ...
> 
> This won't work either, because macros can't be nested like that: The
> $good_0, $good_1 references won't be expanded.
> 
> I could perhaps insert all of the addresses into a persistent table
> one-by-one outside of the pf.conf file (with pfctl -T add), but I'm wary
> of doing this because the real range of addresses I want to allow would
> result in billions of addresses being inserted. That sounds like a bad
> idea.
> 
> I could also manually write one pf rule per address and range of
> addresses, but this would be painful and a serious maintenance burden.
> 
> Is there no way to specify a set of ranges and individual addresses
> without having to write one pf rule for each?

I am not sure what is processing the above syntax, but for /bin/sh
you would need to code this as:
#!/bin/sh
good_0="2a00:1450:400c::-2a00:1450:400c::1000"
good_1="2a04:4e42:600::200-2a04:4e42:600::400"
good_2="2001:1900:2254:206a::50:0"
good_3="2001:19f0:5:61d:f000::"
good_4="2001:4998:58:1836::10"

echo ${good_0}
echo ${good_1}
echo ${good_2}
echo ${good_3}

good_users="${good_0},${good_1},${good_2},${good_3},${good_4}"

echo ${good_users}

To stop nasties like spaces around -'s being token seperators,
same for ,'s when you try to glue good_X togeather, as that
well end up as 4 seperate tokens, which pf may not like.

I see now pf has its own processor, and says it does not
expand macros inside quotes, so perhaps one needs to write

good_users=${good_0},${good_1},${good_2},${good_3},${good_4}

to get the desired effect?
It probably also does not like me sh syntax of ${VARAIBE},
over $VARAIBLE.

Sad it doesnt to use an already well established
standard syntax for these types of things.

> -- 
> Mark Raynsford | http://www.io7m.com

-- 
Rod Grimes                                                 rgrimes@freebsd.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805111543.w4BFhXTS076071>