Mejores prácticas para persistir reglas de nftables

Mejores prácticas para persistir reglas de nftables

Soy nuevo en Ubuntu después de haber pasado del alojamiento en CentOS7 que usaba iptables y me sentía cómodo con la forma en que apf y bfd manejaban (ocultaban) iptables para mí... y estaba funcionando bien.

Entonces, me mudé a Ubuntu (20.04 LSR) y la "forma ubuntu" de hacer un firewall con intentos de prohibición automática de ingresar parece ser nftables y fail2ban.

Utilicé iRedMail para configurar un servidor de correo básico basado en nginx, postfix, dovecot, clamav, roundcube, etc. y configuré fail2ban para observar los registros en busca de intentos de piratear los servicios de correo y ssh, etc., y he visto analiza correctamente mis registros de correo y almacena las ips bloqueadas de fial2ban en la tabla inet f2b-table

Esto sobrevive correctamente al reinicio, pero noté que el archivo /etc/nftables.conf no tiene ninguna de las tablas de fail2ban; tiene mi firewall base que puedo actualizar estáticamente para denegar todos y luego desbloquear los puertos tcp que quiero (básicamente correo y servidor web y ssh)

Pero hasta donde puedo ver, las reglas de fail2ban no están en un archivo de configuración, sino que parecen reconstruirse durante el arranque a partir de entradas en una tabla de fail2ban en una base de datos mysql configurada por iRedMail.

Esto está bien... pero aquí está el dilema: si agrego manualmente una regla al firewall aprovechando la tabla existente para fail2ban, puedo...

nft add element inet f2b-table addr-set-postfix-pregreet { spammer.ip.addr.here }

Aparece y funciona. Lo probé bloqueándome exitosamente y luego lo eliminé a través de la consola local.

Excepto cuando reinicio, toda la tabla se pierde y Fail2ban la reconstruye a partir de las entradas de la tabla (nuevamente, estoy de acuerdo con eso)

Entonces, seguí adelante y agregué mi propia tabla/cosas nuevas.

table inet spammers {
    set blackhole {
            type ipv4_addr
            elements = { sample.ip.addr.here }
    }

    chain spammers-chain {
            type filter hook input priority filter - 2; policy accept;
            ip saddr @blackhole drop
    }
 }

Nuevamente, probé esto y funciona bien, pero para persistir necesito escribirlo en /etc/nftables.conf o configurar ese directorio para leer mis reglas, etc.

Podría hacer esto agregando una inclusión en mi nftables.conf a un directorio de reglas arbitrarias y luego almacenar mi tabla en él cada vez que agrego una dirección, pero esto parece feo e incorrecto.

como si quisiera agregar un nuevo spammer a mi lista, puedo hacerlo

nft add element inet spammers blackhole { new.ip.addr.here }

pero entonces necesitaría... ¿No sé? ¿Persistir en la tabla en mi archivo?

nft list table inet spammers > /etc/nftables.d/spammers.conf

Entonces, esa es una forma en que podría hacerlo, pero he visto a otros hablar sobre netfilter-persist pero eso no es parte de Ubuntu, así que antes de irme, ya sea inventando mi propia rueda o sumergiéndome en la madriguera del conejo netfilter-persist o (no gracias) hacer algo parecido a lo que parece haber hecho fail2ban... (almacenar las IP prohibidas en una base de datos y reconstruir la lista al iniciar sesión)

Se me ocurren varias formas de hacer esto... pero me preguntaba si había una "mejor práctica" "Ubuntu-way" que me falta aquí...

ACTUALIZAR/EDITAR: A menos que reciba una sugerencia mejor, mi "solución" por ahora es

mkdir /etc/nftables.d/
nft list table inet spammers > /etc/nftables.d/spammers.conf

y luego edité mi /etc/nftables.conf para agregar esta línea en la parte inferior

include "/etc/nftables.d/*.conf"

Ahora, cuando agrego un bloque a la tabla, son 2 pasos:

nft add element inet spammers blackhole { some.evildoer.ip.address }
nft list table inet spammers > /etc/nftables.d/spammers.conf

No es el más bonito, pero funciona absolutamente. Por supuesto, podría incluir todo esto en mi propio script personalizado para poder llamar a algo como

banspammer "badguy.ip.addr.here"

y banspammer agregaría el elemento de dirección especificado y guardaría la definición de tabla actualizada...

Nuevamente, esto parece "no ser una buena práctica", de ahí mi pregunta.

EDITAR: 2021-12-22 Está bien, estoy hablando solo, pero como no he recibido ningún comentario, seguí mi idea: está funcionando y escribí este pequeño script banspammer... es crudo y probablemente muy peligroso. - No hice comprobaciones de cordura, como molestarme en comprobar si la ruta del archivo de configuración es válida y no hice ninguna copia de seguridad de dicho archivo, etc.

Dado que la entrada de la tabla es de tipo ipv4_addr, nftables realiza la validación, así que no me preocupo demasiado por eso.

TENGA EN CUENTA que mi configuración particular ya tenía un filtro llamado filtro en la familia inet; agrego esto específicamente como una lista de prioridades ligeramente más baja. También creé el directorio /etc/nftables.d y lo agregué en mi código para que analice el directorio de configuración como lo mencioné arriba

Esperamos que alguien encuentre esto útil.

Todavía estaría interesado en una forma más "Ubuntu" si existiera tal cosa.

#!/usr/bin/sh

################################################################################
# banspammer                         2021-12-22                 DigitalSorceress
#  
# SUMMARY
# This script adds an ip or range of Ips (see element adding) to nftables
# specifically to my spammer blackhole
# it also persists it out to /etc/nftables.d/spammers.conf
#
# put this somewhere like /root/tandautils
# then go to /user/local/sbin and ln -s /root/tandautils/banspammer.sh banspammer
#
################################################################################

# Handle command line args
COMMAND=$1
ADDRESS=$2


# the location of the ssh daemon config file
# default for CentOS is CONFIG_FILE=/etc/ssh/sshd_config
#
CONFIG_FILE=/etc/nftables.d/spammers.conf



# Here are the subroutines for individual actions
ban_spammer () {
    # Issue the basic command to ban the spammer 
    echo "adding spammer to blackhole ..."
    
    nft add element inet spammers blackhole { ${ADDRESS} }
    BAN_SPAMMER_RESULT=$?
    if [ $BAN_SPAMMER_RESULT -eq 0 ] 
    then
        echo "  DONE: ${ADDRESS} added to spammer table"
    fi
    echo ""
}

unban_spammer () {
    # Issue the basic command to ban the spammer 
    echo "removing spammer from blackhole ..."
    
    nft delete element inet spammers blackhole { ${ADDRESS} }

    UNBAN_SPAMMER_RESULT=$?
    if [ $UNBAN_SPAMMER_RESULT -eq 0 ] 
    then
        echo "  DONE: ${ADDRESS} removed from table"
    fi
    echo ""
}

persist_spamtable () {
    echo "persisting out spamtable to ${CONFIG_FILE}..."
    # we need to persist out the spam table to the config
    nft list table inet spammers > ${CONFIG_FILE}
    if [ $? -eq 0 ]
    then
      echo "  done.. showing table..."
      echo ""
      nft list table inet spammers
    else
      echo "error persisting table.. "
    fi
    echo ""
}

list_spamtable () {
    echo "listing out spamtable"
    echo ""
    nft list table inet spammers
    echo ""
}

kill_spamtable () {
    echo "resetting /creating blank spamtable ${CONFIG_FILE}..."

    #rm -f /etc/nftables.d/spammers.conf
    tee /etc/nftables.d/spammers.conf <<EOF
table inet spammers {
    set blackhole {
        type ipv4_addr
    }

    chain spammers-chain {
        type filter hook input priority filter - 2; policy accept;
        ip saddr @blackhole drop
    }
}
EOF
    echo ""
    if [ $? -eq 0 ]
    then
        echo "success.. here's the new file:"
        echo ""
        cat /etc/hftables.d/spammers.conf
    else
        echo "error writing file... "
    fi
    
    echo ""
}

help_me () {
  echo "This is a tool to simplify blocking of IP addesses of spammers                  "
  echo "                                                                                "
  echo "banspammer                          2021-12-22                  DigitalSorceress" 
  echo "                                                                                "
  echo "SUMMARY                                                                         "
  echo " This script is used to simplify the act of adding/removing spammers from       "
  echo " a spammers table in the nftables ruleset                                       "
  echo "                                                                                "
  echo "                                                                                "
  echo "usage: $0 banspammer command [address]                                          "
  echo "                                                                                "
  echo " command options:                                                               "
  echo "           ban address                                                          "
  echo "             bans the target address; can be a singe IP or comma sep list       "
  echo "                                                                                "
  echo "           unban address                                                        "
  echo "             removes the target address can be a singe IP or comma sep list     "
  echo "                                                                                "
  echo "           reset                                                                "
  echo "             clears all entries from the spammers table                         "
  echo "             note this can be used to create a new empty table                  "
  echo "                                                                                "
  echo "           show                                                                 "
  echo "             shows the current spam table list                                  "
  echo "                                                                                "
  echo "           help                                                                 "
  echo "             Displays this help dialog                                          "
}



# Here is where we do the actual work based on the passed command
case "$COMMAND" in
  ban)
    if [ $# -eq 2 ] 
    then
        echo "banning address: ${ADDRESS}"
        ban_spammer ${ADDRESS}
      if [ $BAN_SPAMMER_RESULT -eq 0 ]
      then
        persist_spamtable
      fi
    else
        echo "ban command requires a single IP or comma separated list of IPs "
    fi
    ;;
  unban)
    if [ $# -eq 2 ] 
    then
      echo "unbanning address: ${ADDRESS}"
      unban_spammer ${ADDRESS}
      if [ $UNBAN_SPAMMER_RESULT -eq 0 ]
      then
        persist_spamtable
      fi
    fi
    ;;
  show)
      list_spamtable
      ;;
  reset)
      kill_spamtable
      ;;
  help)
    help_me
    ;;
  *)
      echo "Usage: $0 ban|unban comma-separated-ip-list  or $0 show|reset"
      exit 1
esac

Respuesta1

Si apt-get install iptables-persistentlo desea, netfilter-persistent¿cuál parece ser lo que estaba buscando para mantener sus reglas de netfilter?

información relacionada