public inbox for netdev@vger.kernel.org 
 help / color / mirror / Atom feed
From: Florian Westphal <fw@strlen•de>
To: David Miller <davem@davemloft•net>
Cc: fw@strlen•de, daniel@iogearbox•net, netdev@vger•kernel.org,
	netfilter-devel@vger•kernel.org, alexei.starovoitov@gmail•com
Subject: Re: [PATCH RFC 0/4] net: add bpfilter
Date: Sat, 17 Feb 2018 21:10:15 +0100	[thread overview]
Message-ID: <20180217201015.GA13493@breakpoint.cc> (raw)
In-Reply-To: <20180216.173354.347842978561257782.davem@davemloft.net>

David Miller <davem@davemloft•net> wrote:
> From: Florian Westphal <fw@strlen•de>
> Date: Fri, 16 Feb 2018 17:14:08 +0100
> 
> > Any particular reason why translating iptables rather than nftables
> > (it should be possible to monitor the nftables changes that are
> >  announced by kernel and act on those)?
> 
> As Daniel said, iptables is by far the most deployed of the two
> technologies.  Therefore it provides the largest environment for
> testing and coverage.

Right, but the approach of hooking old blob format comes with
lots of limitations that were meant to be resolved with a netlink based
interface which places kernel in a position to mediate all transactions
to the rule database (which isn't fixable with old setsockopt format).

As all programs call iptables(-restore) or variants translation can
be done in userspace to nftables so api spoken is nfnetlink.
Such a translator already exists and can handle some cases already:

nft flush ruleset
nft list ruleset | wc -l
0
xtables-compat-multi iptables -A INPUT -s 192.168.0.24 -j ACCEPT
xtables-compat-multi iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT
xtables-compat-multi iptables -A INPUT -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
xtables-compat-multi iptables -A INPUT -p icmp -j ACCEPT
xtables-compat-multi iptables -N REJECT_LOG
xtables-compat-multi iptables -A REJECT_LOG -i eth0 -p tcp --tcp-flags SYN,ACK SYN --dport 22:80 -m limit --limit 1/sec -j LOG --log-prefix "RejectTCPConnectReq"
xtables-compat-multi iptables -A REJECT_LOG -j DROP
xtables-compat-multi iptables -A INPUT -j REJECT_LOG

nft list ruleset
table ip filter {
        chain INPUT {
                type filter hook input priority 0; policy accept;
                ip saddr 192.168.0.24 counter packets 0 bytes 0 accept
                ip saddr 192.168.0.0/16 tcp dport 22 counter accept
                iifname "eth0" ct state related,established counter accept
                ip protocol icmp counter packets 0 bytes 0 accept
                counter packets 0 bytes 0 jump REJECT_LOG
        }

        chain FORWARD {
                type filter hook forward priority 0; policy accept;
        }

        chain OUTPUT {
                type filter hook output priority 0; policy accept;
        }

        chain REJECT_LOG {
                iifname "eth0" tcp dport 22-80 tcp flags & (syn | ack) == syn limit rate 1/second burst 5 packets counter packets 0 bytes 0 log prefix "RejectTCPConnectReq"
                counter packets 0 bytes 0 drop
        }
}

and, while 'iptables' rules were added, nft monitor in different terminal:
nft monitor
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy accept; }
add chain ip filter FORWARD { type filter hook forward priority 0; policy accept; }
add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
add rule ip filter INPUT ip saddr 192.168.0.24 counter packets 0 bytes 0 accept
# new generation 9893 by process 7471 (xtables-compat-)
add rule ip filter INPUT ip saddr 192.168.0.0/16 tcp dport 22 counter accept
# new generation 9894 by process 7504 (xtables-compat-)
add rule ip filter INPUT iifname "eth0" ct state related,established counter accept
# new generation 9895 by process 7528 (xtables-compat-)
add rule ip filter INPUT ip protocol icmp counter packets 0 bytes 0 accept
# new generation 9896 by process 7542 (xtables-compat-)
add chain ip filter REJECT_LOG
# new generation 9897 by process 7595 (xtables-compat-)
add rule ip filter REJECT_LOG iifname "eth0" tcp dport 22-80 tcp flags & (syn | ack) == syn limit rate 1/second burst 5 packets counter packets 0 bytes 0 log prefix "RejectTCPConnectReq"
# new generation 9898 by process 7639 (xtables-compat-)
add rule ip filter REJECT_LOG counter packets 0 bytes 0 drop
# new generation 9899 by process 7657 (xtables-compat-)
add rule ip filter INPUT counter packets 0 bytes 0 jump REJECT_LOG
# new generation 9900 by process 7663 (xtables-compat-)

Now, does this work in all cases?

Unfortunately not -- this is still work-in-progress, so I would
not rm /sbin/iptables and replace it with a link to xtables-compat-multi just yet.

(f.e. nftables misses some selinux matches/targets for netlabel so we obviously
can't translate this, same for ipsec sa/policy matching -- but this isn't
impossible to resolve).

Hopefully this does show that at least some commonly used features work
and that we've come a long way to make seamless nftables transition happen.

  parent reply	other threads:[~2018-02-17 20:13 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-16 13:40 [PATCH RFC 0/4] net: add bpfilter Daniel Borkmann
2018-02-16 13:40 ` [PATCH RFC 1/4] modules: allow insmod load regular elf binaries Daniel Borkmann
2018-02-16 13:40 ` [PATCH RFC 2/4] bpf: introduce bpfilter commands Daniel Borkmann
2018-02-16 13:40 ` [PATCH RFC 3/4] net: initial bpfilter skeleton Daniel Borkmann
2018-02-16 13:40 ` [PATCH RFC 4/4] bpf: rough bpfilter codegen example hack Daniel Borkmann
2018-02-16 14:57 ` [PATCH RFC 0/4] net: add bpfilter Florian Westphal
2018-02-16 16:14   ` Florian Westphal
2018-02-16 20:44     ` Daniel Borkmann
2018-02-17 12:33       ` Harald Welte
2018-02-17 19:18       ` Florian Westphal
2018-02-16 22:33     ` David Miller
2018-02-17 12:21       ` Harald Welte
2018-02-17 20:10       ` Florian Westphal [this message]
2018-02-17 22:38         ` Florian Westphal
2018-02-16 16:53   ` Daniel Borkmann
2018-02-16 22:32   ` David Miller
2018-02-17 12:11 ` Harald Welte
2018-02-18  0:35   ` Florian Westphal
2018-02-19 12:03   ` Daniel Borkmann
2018-02-19 12:52     ` Harald Welte
2018-02-19 14:44       ` David Miller
2018-02-19 14:53         ` Florian Westphal
2018-02-19 15:07           ` David Miller
2018-02-19 15:20             ` Florian Westphal
2018-02-19 15:28               ` David Miller
2018-02-19 15:23         ` Harald Welte
2018-02-19 15:32           ` David Miller
2018-02-19 15:37             ` Jan Engelhardt
2018-02-19 15:43               ` David Miller
2018-02-19 15:36           ` David Miller
2018-02-19 17:20             ` Harald Welte
2018-02-19 17:29               ` David Miller
2018-02-19 18:37                 ` Harald Welte
2018-02-19 18:47                   ` David Miller
2018-02-19 17:40             ` Arturo Borrero Gonzalez
2018-02-19 18:06             ` Arturo Borrero Gonzalez
2018-02-19 18:43               ` David Miller
2018-02-19 15:00     ` David Miller
2018-02-19 14:59       ` Florian Westphal
2018-02-19 15:13         ` David Miller
2018-02-19 15:15           ` Florian Westphal
2018-02-19 15:27             ` David Miller
2018-02-19 15:38               ` Harald Welte
2018-02-19 15:44                 ` David Miller
2018-02-19 17:14                   ` Phil Sutter
2018-02-19 17:22                     ` David Miller
2018-02-19 18:05                       ` Phil Sutter
2018-02-19 18:41                         ` David Miller
2018-02-19 20:41                           ` Phil Sutter
2018-02-19 21:13                       ` Florian Westphal
2018-02-20 10:44                       ` Pablo Neira Ayuso
2018-02-20 14:07                         ` Daniel Borkmann
2018-02-20 14:55                         ` David Miller
2018-02-21  1:52                         ` Alexei Starovoitov
2018-02-21 12:01                           ` Pablo Neira Ayuso
2018-02-21 12:13                             ` Florian Westphal
2018-02-22  2:20                               ` nft/bpf interpreters and spectre2. Was: " Alexei Starovoitov
2018-02-22 11:39                                 ` Pablo Neira Ayuso
2018-02-22 17:06                                   ` Alexei Starovoitov
2018-02-22 18:47                                     ` Jann Horn
2018-02-19 17:41               ` Arturo Borrero Gonzalez
2018-02-19 21:30             ` Jozsef Kadlecsik
2018-02-19 15:27           ` Harald Welte
2018-02-19 15:31             ` David Miller
2018-02-19 17:09               ` Phil Sutter
2018-02-19 17:15                 ` David Miller
2018-02-20 13:05                   ` Phil Sutter
2018-02-20  9:35                 ` Michal Kubecek
2018-02-20 18:10                   ` Phil Sutter
2018-02-19 17:32               ` Harald Welte
2018-02-19 17:41               ` Arturo Borrero Gonzalez
2018-02-19 21:42   ` Willem de Bruijn
2018-02-18 23:35 ` Florian Westphal

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=20180217201015.GA13493@breakpoint.cc \
    --to=fw@strlen$(echo .)de \
    --cc=alexei.starovoitov@gmail$(echo .)com \
    --cc=daniel@iogearbox$(echo .)net \
    --cc=davem@davemloft$(echo .)net \
    --cc=netdev@vger$(echo .)kernel.org \
    --cc=netfilter-devel@vger$(echo .)kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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