On Sat, 2022-12-03 at 21:45 +0100, fail2ban--- via Fail2ban-users wrote:
> Hi Andre.
> 
> Why the distinguishing between ipv4 and ipv6 in our script when inet 
> sets up firewall for both in one line ? (the nice thing about nft)
> 
> Regards,
> Finn

Thanks for the question, Finn.

I use nftables sets to store the IP addresses, but even with nftables, I found 
no way to create a set that would contain
both IPv4 and IPv6 addresses.

Kind regards,
André

> 
> Den 03-12-2022 kl. 20:02 skrev Andre Rodier:
> > Hello,
> > 
> > I wanted to use fail2ban with nftables, and I was surprise by the tool, not 
> > really using nftables features, like
> > sets,
> > for instance.
> > 
> > I had a look at the configuration, and I ended up using a simple wrapper 
> > script, to keep the configuration file
> > readable.
> > 
> > ====================================================================================================================
> > ====
> > # Fail2Ban configuration file
> > #
> > # Author: Andre Rodier
> > # fail2ban action using nftable sets
> > #
> > 
> > [INCLUDES]
> > 
> > 
> > [Definition]
> > 
> > # Option:  actionstart
> > # Notes.:  command executed on demand at the first ban
> > # (or at the start of Fail2Ban if actionstart_on_demand is set to false).
> > # Values:  CMD
> > #
> > actionstart = /usr/local/sbin/fail2ban-nft-helper start '<name>'
> > 
> > # Option:  actionstop
> > # Notes.:  command executed at the stop of jail (or at the end of Fail2Ban)
> > # Values:  CMD
> > #
> > actionstop = /usr/local/sbin/fail2ban-nft-helper stop '<name>' '<port>'
> > 
> > # Option:  actioncheck
> > # Notes.:  command executed once before each actionban command
> > # Values:  CMD
> > #
> > actioncheck = /usr/local/sbin/fail2ban-nft-helper check '<name>' '<port>'
> > 
> > # Option:  actionban
> > # Notes.:  command executed when banning an IP. Take care that the
> > #          command is executed with Fail2Ban user rights.
> > # Tags:    See jail.conf(5) man page
> > # Values:  CMD
> > #
> > actionban = /usr/local/sbin/fail2ban-nft-helper ban '<name>' '<ip>' 
> > '<blocktype>'
> > 
> > # Option:  actionunban
> > # Notes.:  command executed when unbanning an IP. Take care that the
> > #          command is executed with Fail2Ban user rights.
> > # Tags:    See jail.conf(5) man page
> > # Values:  CMD
> > #
> > actionunban = /usr/local/sbin/fail2ban-nft-helper unban '<name>' '<ip>' 
> > '<blocktype>'
> > 
> > [Init]
> > ====================================================================================================================
> > ====
> > 
> > 
> > 
> > Then, the script itself is using nftables features. It is simple and 
> > quickly written, but it is working:
> > 
> > ====================================================================================================================
> > ====
> > #!/bin/sh
> > #
> > 
> > action=$1
> > 
> > if [ "$action" = "start" ]; then
> > 
> >      name=$2
> > 
> >      # Create the fail2ban filter if not existing,
> >      # with a priority of -10 to run just before fitlers
> >      nft 'add chain inet filter fail2ban { type filter hook input priority 
> > -10 ; }'
> > 
> >      nft add set inet filter "f2b-${name}-ipv4" '{ type ipv4_addr ; }'
> >      nft add set inet filter "f2b-${name}-ipv6" '{ type ipv6_addr ; }'
> > 
> >      nft inet filter fail2ban ip saddr "@f2b-${name}-ipv4" counter reject
> >      nft inet filter fail2ban ip6 saddr "@f2b-${name}-ipv6" counter reject
> > 
> >      exit
> > fi
> > 
> > if [ "$action" = "stop" ]; then
> > 
> >      name=$2
> >      port=$3
> > 
> >      ipv4_handle=$(nft -a list ruleset | sed -En 
> > "s/.*@f2b-${name}-ipv4.*handle ([0-9]+)/\\1/p")
> >      ipv6_handle=$(nft -a list ruleset | sed -En 
> > "s/.*@f2b-${name}-ipv6.*handle ([0-9]+)/\\1/p")
> > 
> >      if [ "$ipv4_handle" != "" ]; then
> >          nft delete rule inet filter fail2ban handle "$ipv4_handle"
> >      elif [ "$ipv6_handle" != "" ]; then
> >          nft delete rule inet filter fail2ban handle "$ipv6_handle"
> >      else
> >          echo "$0: rule handle not found for '$name'."
> >      fi
> > 
> >      exit
> > fi
> > 
> > if [ "$action" = "check" ]; then
> > 
> >      name=$2
> >      port=$3
> > 
> >      nft list set inet filter "f2b-$name-ipv4"
> >      nft list set inet filter "f2b-$name-ipv6"
> > 
> >      exit
> > fi
> > 
> > if [ "$action" = "ban" ]; then
> > 
> >      name=$2
> >      ip=$3
> >      type=$4
> > 
> >      if echo "$ip" | grep -P '^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$'; 
> > then
> >          nft add element inet filter "f2b-$name-ipv4" "{ $ip }"
> >      else
> >          nft add element inet filter "f2b-$name-ipv6" "{ $ip }"
> >      fi
> > 
> >      exit
> > fi
> > 
> > if [ "$action" = "unban" ]; then
> > 
> >      name=$2
> >      ip=$3
> >      type=$4
> > 
> >      if echo "$ip" | grep -P '^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$'; 
> > then
> >          nft delete element inet filter "f2b-$name-ipv4" "{ $ip }"
> >      else
> >          nft delete element inet filter "f2b-$name-ipv6" "{ $ip }"
> >      fi
> > 
> >      exit
> > fi
> > 
> > ====================================================================================================================
> > ====
> > 
> > Any thought or remark ?
> > 
> > Kind regards,
> > André
> > 
> > 
> > 
> > _______________________________________________
> > Fail2ban-users mailing list
> > Fail2ban-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/fail2ban-users
> 




_______________________________________________
Fail2ban-users mailing list
Fail2ban-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/fail2ban-users

Reply via email to