Лучшие практики для сохранения правил nftables

Лучшие практики для сохранения правил nftables

Я новичок в Ubuntu, перейдя с хостинга на CentOS7, где использовался iptables, и мне было удобно, как apf и bfd обрабатывали (скрывали) iptables от меня... и все работало хорошо.

Итак, я перешел на Ubuntu (20.04 LSR) и «способ Ubuntu» сделать брандмауэр с автоматическим запретом попыток взлома, похоже, это nftables и fail2ban.

Я использовал iRedMail для настройки простого почтового сервера на базе nginx, postfix, dovecot, clamav, roundcube и т. д. и настроил fail2ban для отслеживания журналов попыток взлома почтовых служб, ssh и т. д. и я видел, как он правильно анализировал мои почтовые журналы и сохранял заблокированные fial2ban IP-адреса в таблице inet f2b-table.

Это нормально переживает перезагрузку, но я заметил, что в файле /etc/nftables.conf нет ни одной таблицы fail2ban - в нем есть мой базовый брандмауэр, который я могу статически обновить, чтобы запретить, а затем разблокировать все нужные мне порты TCP (в основном почта, веб-сервер и ssh).

Но насколько я могу судить, правила fail2ban не находятся в файле конфигурации, а, похоже, восстанавливаются при загрузке из записей в таблице fail2ban в базе данных MySQL, настроенной iRedMail.

Это хорошо... но вот дилемма: если я вручную добавлю правило в брандмауэр, используя существующую таблицу для fail2ban, я смогу...

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

Он появляется и работает. Я проверил, успешно заблокировав себя, а затем удалил через локальную консоль.

За исключением случаев, когда я перезагружаюсь, вся эта таблица теряется и перестраивается fail2ban из записей таблицы (опять же, меня это устраивает)

Итак, я пошёл дальше и добавил свою собственную новую таблицу/материалы.

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

Опять же, я проверил это, и это работает хорошо, но для того, чтобы это сохранилось, мне нужно записать это в /etc/nftables.conf или настроить этот каталог для чтения моих правил и т. д.

Я мог бы сделать это, добавив include в мой nftables.conf в каталог произвольных правил, а затем сохранять там мою таблицу каждый раз, когда я добавляю адрес, но это кажется уродливым и неправильным.

например, если я хочу добавить нового спамера в свой список, я могу сделать это

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

но тогда нужно будет .. я не знаю? сохранить таблицу в моем файле?

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

Итак, это один из способов, которым я мог бы это сделать, но я видел, как другие говорили о netfilter-persist, но это не часть Ubuntu, поэтому прежде чем я начну изобретать свой собственный велосипед или нырну в кроличью нору netfilter-persist или (нет, спасибо) сделаю что-то похожее на то, что, похоже, сделал fail2ban... (сохранение заблокированных IP-адресов в базе данных и восстановление списка при входе в систему)

Я могу предложить несколько способов сделать это, но мне было интересно, есть ли какой-то «лучший способ» «Ubuntu», который я здесь упускаю...

ОБНОВЛЕНИЕ/РЕДАКТИРОВАНИЕ: Если я не получу лучшего предложения, мое «решение» на данный момент следующее:

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

и затем я отредактировал свой /etc/nftables.conf, добавив эту строку в конец

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

Теперь, когда я добавляю блок в таблицу, это происходит в 2 шага:

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

Это не самый красивый вариант, но он абсолютно рабочий. Конечно, я мог бы обернуть все это в свой собственный скрипт, чтобы я мог просто вызывать что-то вроде

banspammer "badguy.ip.addr.here"

и banspammer добавит указанный элемент адреса и сохранит обновленное определение таблицы...

опять же, это просто кажется «не лучшей практикой», отсюда и мой вопрос.

EDIT: 2021-12-22 Ладно, я как бы разговариваю сам с собой, но поскольку я не получил никакой обратной связи, я пошел дальше — она работает, и я написал этот небольшой скрипт для запрета спама... он сырой и, вероятно, очень опасный — я не провел проверки на работоспособность, например, не проверил правильность пути к файлу конфигурации, не сделал резервную копию указанного файла и т. д.

Поскольку запись в таблице имеет тип ipv4_addr, проверку выполняет nftables, поэтому я не слишком беспокоюсь об этом.

ОБРАТИТЕ ВНИМАНИЕ, что в моей конкретной настройке уже был фильтр с именем filter в семействе inet - я специально добавил его как список с немного более низким приоритетом. Я также создал каталог /etc/nftables.d и добавил в свой код, чтобы он анализировал каталог config, как я упоминал выше.

Надеюсь, кто-то найдет это полезным.

Мне все равно было бы интересно что-то более «в стиле Ubuntu», если бы такое существовало.

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

решение1

Если вы apt-get install iptables-persistentего втянете, netfilter-persistentто, что, по-видимому, вы искали, чтобы сохранить правила сетевого фильтра?

Связанный контент