Code Monkey home page Code Monkey logo

Comments (7)

stapelberg avatar stapelberg commented on May 14, 2024

Hey! Here’s a few pointers:

  1. You can work in a network namespace to play around with nft without any consequences for your host system:
# ip netns add nattest
# ip netns exec nattest /bin/bash
  1. You can use nft’s --debug all flag to get a bunch more details about what’s going on. For this particular case:
# nft --debug all add rule nat postrouting ip saddr 192.168.69.2 masquerade
[…]
ip nat postrouting 
  [ payload load 4b @ network header + 12 => reg 1 ]
  [ cmp eq reg 1 0x0245a8c0 ]
  [ masq ]
[…]

These are the expressions you’ll need to model with your Go code.

  1. Check out
    func TestConfigureNAT(t *testing.T) {
    — you’ll want to duplicate that, run nft through strace, stuff the resulting byte slices into the test and then work on the Go portion until it matches. I’ve done this to verify that all the building blocks are in place, and will commit it for illustration purposes in a sec.

Hope that helps,

from nftables.

twitchyliquid64 avatar twitchyliquid64 commented on May 14, 2024

Thank you so much!

Would you be open to a PR where I implement an abstraction for building these rules? Something like:

builder := nftables.ExprBuilder{Chain: chain}
if err := builder.FilterSourceAddr(srcIP); err != nil {
  // ... Errors such as ipv6 address /w ipv4 table family
}
builder.ActionCounter(&counter)
builder.ActionMasquerade()
conn.AddRule(&Rule{ ... Exprs: builder.Expr() ... })

from nftables.

stapelberg avatar stapelberg commented on May 14, 2024

Disclaimer: I haven’t thought much about how a good abstraction layer would look like.

To me, an important question that I can’t answer yet, is whether the ideal abstraction would implement nft(8)’s config/command line syntax (and how stable those are), or whether something else makes more sense.

Intuitively, I’d gravitate towards implementing nft’s syntax: that way, users could just copy their already-existing configuration files. What do you think?

from nftables.

twitchyliquid64 avatar twitchyliquid64 commented on May 14, 2024

For the sake of minimizing the learning curve, I agree we should keep the concepts as similar to nft & nft's representation as possible.

However, I do think the abstraction needs to be embodied in types; any approach which does string parsing is probably re-inventing the wheel, and loosing the benefits of a type system.

Maybe:

builder.Table(Table{
  Name: ...
  Family: ...
  Chain: &Chain{
    ...
    Rules: []builder.Rules{
      builder.FilterSaddr(saddr),
      builder.Masquerade(),
    },
  },
}).Build()

Thoughts?

from nftables.

stapelberg avatar stapelberg commented on May 14, 2024

However, I do think the abstraction needs to be embodied in types; any approach which does string parsing is probably re-inventing the wheel, and loosing the benefits of a type system.

I’m not sure about that — neither for nor against, I just can’t tell. Given that, I think the best course of action is to develop your abstraction in a separate repository and see how well it works out in practice.

from nftables.

twitchyliquid64 avatar twitchyliquid64 commented on May 14, 2024

I'll give it a try and report back.

from nftables.

twitchyliquid64 avatar twitchyliquid64 commented on May 14, 2024

I tried a few things but complexity always crept in to the stage where the APIs were roughly equivalent.

The best thing we can do is probably a bunch of examples & maybe a paragraph on using nft --debug all to work out what to do.

from nftables.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.