Рекомендации по сохранению правил nftables

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

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

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

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

. Правила 2ban не находятся в конфигурационном файле, но, кажется, восстанавливаются при загрузке из записей в таблице 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 или настроить этот каталог для чтения в моих правилах и т.д..

Я мог бы сделать это, добавив в моем 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-way», которую мне здесь не хватает ...

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

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"

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

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

РЕДАКТИРОВАТЬ: 2021-12-22 Итак, я как бы разговариваю сам с собой, но, поскольку я не получил никакой обратной связи, я согласился со своей идеей - она ​​работает, и я написал этот небольшой скрипт для банспама... он сырой и, вероятно, очень опасный - я не был в здравом уме. проверяет, например, проверяет, является ли путь к файлу конфигурации действительным, и не делал резервную копию указанного файла и т. д.

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

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

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

Я все еще был бы заинтересован в более «убунту-способе», если бы такая вещь существовала.

#!/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
0
задан 23 December 2021 в 07:37

0 ответов

Другие вопросы по тегам:

Похожие вопросы: