Melhores práticas para regras nftables persistentes

Melhores práticas para regras nftables persistentes

Sou novo no Ubuntu, mudei da hospedagem no CentOS7 que usava iptables e estava confortável com a forma como o apf e o bfd manipularam (esconderam) o iptables de mim .. e estava funcionando bem

Então, mudei para o Ubuntu (20.04 LSR) e o "modo ubuntu" de fazer firewall com banimento automático de tentativas de invasão parece ser nftables e fail2ban

Eu usei o iRedMail para configurar um servidor de e-mail básico baseado em nginx, postfix, dovecot, clamav, roundcube etc. e ele configurou o fail2ban para observar os logs de tentativas de hackear os serviços de e-mail e ssh etc. ele analisa corretamente meus logs de e-mail e armazena os ips bloqueados fial2ban na tabela inet f2b-table

Isso sobrevive corretamente à reinicialização, mas notei que o arquivo /etc/nftables.conf não contém nenhuma das tabelas fail2ban - ele tem meu firewall básico que posso atualizar estaticamente para negar todas as portas tcp que desejo (basicamente mail e servidor web e ssh)

Mas até onde posso ver, as regras do fail2ban não estão em um arquivo de configuração, mas parecem ser reconstruídas na inicialização a partir de entradas em uma tabela fail2ban em um banco de dados mysql configurado pelo iRedMail

Tudo bem..mas aqui está o dilema: se eu adicionar manualmente uma regra ao firewall aproveitando a tabela existente para fail2ban eu posso..

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

Ele aparece e funciona. Eu testei bloqueando-me com sucesso e depois removi através do console local.

Exceto quando eu reinicio, toda a tabela é perdida e reconstruída pelo fail2ban a partir das entradas da tabela (novamente, estou bem com isso)

Então, fui em frente e adicionei minha própria mesa/coisas novas

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
    }
 }

Novamente, testei isso e funciona bem, mas para persistir, preciso escrevê-lo em /etc/nftables.conf ou configurar esse diretório para ler minhas regras, etc.

Eu poderia fazer isso adicionando um include em meu nftables.conf a um diretório de regras arbitrárias e, em seguida, armazenando minha tabela nele toda vez que adicionar um endereço, mas isso parece feio e errado

como se eu quisesse adicionar um novo spammer à minha lista, posso fazer

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

mas então precisaria.. não sei? persistir a tabela no meu arquivo?

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

Então, essa é uma maneira de fazer isso, mas já vi outros falarem sobre a persistência do netfilter, mas isso não faz parte do Ubuntu, então antes de eu inventar minha própria roda ou cair na toca do coelho da persistência do netfilter ou (não, obrigado) faça algo parecido com o que o fail2ban parece ter feito... (armazenando os IPs banidos em um banco de dados e reconstruindo a lista no login)

Posso encontrar várias maneiras de fazer isso .. mas queria saber se havia uma "melhor prática" "maneira do Ubuntu" que estou faltando aqui ...

ATUALIZAÇÃO/EDIÇÃO: A menos que eu receba uma sugestão melhor, minha "solução" por enquanto é

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

e então editei meu /etc/nftables.conf para adicionar esta linha na parte inferior

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

Agora, quando adiciono um bloco à tabela, são 2 etapas:

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

Não é o mais bonito, mas funciona perfeitamente. É claro que eu poderia agrupar tudo isso em meu próprio script personalizado para poder chamar algo como

banspammer "badguy.ip.addr.here"

e o banspammer adicionaria o elemento de endereço especificado e salvaria a tabela atualizada def...

novamente, isso parece "não ser uma prática recomendada", daí a minha pergunta.

EDIT: 2021-12-22 OK, então estou falando sozinho, mas como não recebi nenhum feedback, segui com minha ideia - está funcionando e escrevi este pequeno script de banspammer... é bruto e provavelmente altamente perigoso - Não fiz verificações de integridade, como me preocupar em verificar se o caminho do arquivo de configuração é válido e não fiz nenhum backup do referido arquivo, etc.

Como a entrada da tabela é do tipo ipv4_addr, o nftables faz validação, então não me preocupo muito com isso

OBSERVE que minha configuração específica já tinha um filtro chamado filter na família inet - eu adiciono isso especificamente como uma lista de prioridade um pouco mais baixa. Também criei o diretório /etc/nftables.d e adicionei em meu código para que ele analisasse o diretório de configuração como Eu mencionei acima

espero que alguém ache isso útil.

Eu ainda estaria interessado em um "jeito Ubuntu" se existisse tal coisa.

#!/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

Responder1

Se você apt-get install iptables-persistentconseguir, netfilter-persistento que parece ser o que você estava procurando para persistir suas regras do netfilter?

informação relacionada