Userspace nft parser limitations / suggestions / help

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Good morning,

I've recently switched to using nftables for one of our customer
environments that we manage, and there were a few limitations that I
have seem to run into, so I'd like to bring them up here for
discussion (since I could just be missing something and it may be
available and I just don't know it).

Also, in my particular use case, we're managing large sets of
whitelists/blacklists, so keeping that in mind might help...

1) Matching selectors in one rule with an OR

In one scenario, I have a large set of whitelisted IP addresses. To
accept these, I have to write two rules:

ip saddr @whitelist accept
ip daddr @whitelist accept

Ideally, I would like to efficiently write these as one rule, so I
intuitively tried this:

ip {saddr, daddr} @whitelist accept

I additionally had a scenario where I needed to match against TCP or
UDP ports, so I tried something like:

{tcp, udp} {dport, sport} 51 accept

But, that didn't work.  I think there should probably be some way to
match in an or-like fashion, and this might be a nice intuitive syntax
we might be able to use.

Thoughts?

2) Using elements from a set in a rule

In this scenario, I have a large set of IPs and Ports I need to
accept.  So, my set and elements looked something like:

add set traffic exceptions { type ipv4_addr . inet_service . inet_protocol ; }
add element traffic exceptions { 1.2.3.4 . 80 . tcp }
add element traffic exceptions { 1.2.3.4 . 443 . tcp }
add element traffic exceptions { 1.2.3.4 . 53 . udp }
add element traffic exceptions { 1.2.3.4 . 123 . udp }

However, when writing the rule, there was no way for me to to use the
inet_protocol listed in the set to select the protocol type. My
example rule might be:

add rule traffic forward ip daddr . tcp dport . inet_protocol @whitelist accept

I'm not sure this syntax is ideal, but I think it shows what I'm
trying to do, which is _use_ the information in the set to match
against a TCP or UDP port, depending on the element.

I think doing it this way is more ideal than doing an OR for TCP/UDP
(as discussed in #1; {tcp, udp}) because I'm specifically accepting
the packet I want to accept.

3) Complex Real-World Use Cases

Alright, well, here's where it gets complicated.  My gut is telling me
I just need to figure out a way to represent my rulesets properly with
the data I have, so please let me know...

As discussed earlier, I'm mainly dealing with a large list of
"exceptions", or items in a whitelist.  Here are some example of an
exception:
TCP: 0.0.0.0/0:0-65635 --> 192.168.1.100:80, 443 : accept (let anyone
talk to TCP 80, 443)
UDP: 0.0.0.0/0:0-65635 --> 192.168.1.101:53 : accept (let anyone talk
to UDP DNS)
UDP: 0.0.0.0/0:0-65635 --> 192.168.1.102:123 : accept (let anyone talk
to UDP NTP)
TCP: 192.168.1.100:1024-65635 --> 157.240.18.35:443 : accept (let this
one machine talk to Facebook)

Now I can't figure out how to represent those "rules" efficiently in
nft.  Since I'm dealing with a list of a few thousand exceptions, I
thought I would need a set.  But it doesn't look like I'm able to
because I need a range of ports to allow.

What am I missing here?

Thanks,
Fran
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux