Я новичок в 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)
Но, насколько я вижу, правила fail2ban не находятся в файле конфигурации, а, кажется, восстанавливаются при загрузке из записей в таблице fail2ban в базе данных mysql, настроенной iRedMail.
Это хорошо .. но вот дилемма:
если я вручную добавлю правило в брандмауэр, используя существующую таблицу для fail2ban, я смогу...
nft добавить элемент inet f2b-table addr-set-postfix-pregreet { spammer.ip.addr.here }
Он появляется и работает. Я проверил, успешно заблокировав себя, а затем удалил через локальную консоль.
За исключением случаев, когда я перезагружаюсь, вся эта таблица теряется и восстанавливается с помощью fail2ban из записей таблицы (опять же, я не против)
Итак, я пошел дальше и добавил свою новую таблицу/материал
таблица инет спамеров {
установить черную дыру {
введите ipv4_addr
элементы = {sample.ip.addr.here}
}
цепочка спамеров-цепочка {
тип фильтра хук входной фильтр приоритета - 2; политика принять;
ip saddr @blackhole капля
}
}
Опять же, протестировал это, и оно работает хорошо, но для сохранения этого мне нужно записать его в /etc/nftables.conf или настроить этот каталог для чтения в моих правилах и т. д..
Я мог бы сделать это, добавив в моем nftables.conf каталог произвольных правил, а затем сохранять в нем свою таблицу каждый раз, когда я добавляю адрес, но это кажется уродливым и неправильным.
например, если я хочу добавить нового спамера в свой список, я могу это сделать
nft добавить элемент 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, добавив эту строку внизу
включить "/etc/nftables.d/*.conf"
Теперь, когда я добавляю блок в таблицу, это 2 шага:
nft добавить элемент инет спамеры blackhole {some.evildoer.ip.address}
nft list table inet spammers > /etc/nftables.d/spammers.conf
Это не самое красивое, но оно абсолютно работает. Я, конечно, мог бы обернуть все это в свой собственный сценарий, чтобы я мог просто вызвать что-то вроде
банспаммер "badguy.ip.addr.здесь"
и банспамер добавит указанный элемент адреса и сохранит обновленную таблицу def...
опять же, это просто похоже на «не лучшую практику», отсюда и мой вопрос.
РЕДАКТИРОВАТЬ: 22 декабря 2021 г.
Итак, я как бы разговариваю сам с собой, но, поскольку я не получил никакой обратной связи, я согласился со своей идеей - она работает, и я написал этот небольшой скрипт для бан-спама...это необработанный и, вероятно, очень опасный - я не проводил проверки работоспособности, например, не пытался проверить, действителен ли путь к файлу конфигурации, и не делал никаких резервных копий указанного файла и т. д.
Поскольку запись в таблице имеет тип ipv4_addr, nftables выполняет проверку, поэтому я не слишком беспокоюсь об этом.
Обратите внимание, что в моей конкретной установке уже был фильтр с именем fileter в семействе inet — я специально добавляю его как список с немного более низким приоритетом. Я также создал каталог /etc/nftables.d и добавил в свой код, чтобы он анализировал каталог конфигурации как я упоминал выше
здесь надеюсь, что кто-то найдет это полезным.
Я все еще был бы заинтересован в более «Ubuntu-способе», если бы такая вещь существовала.
#!/usr/бин/ш
################################################### ###############################
#банспаммер 22.12.2021 DigitalSorceress
#
# РЕЗЮМЕ
# Этот скрипт добавляет ip или диапазон ips (см. добавление элемента) в nftables
# специально для моей спамерской черной дыры
# он также сохраняет его в /etc/nftables.d/spammers.conf
#
# поместите это куда-нибудь, например /root/tandautils
# затем перейдите в /user/local/sbin и введите ln -s /root/tandautils/banspammer.sh banspammer
#
################################################### ###############################
# Обработка аргументов командной строки
КОМАНДА=$1
АДРЕС=$2
# расположение конфигурационного файла демона ssh
# по умолчанию для CentOS это CONFIG_FILE=/etc/ssh/sshd_config
#
CONFIG_FILE=/etc/nftables.d/spammers.conf
# Вот подпрограммы для отдельных действий
бан_спаммер () {
# Выполните основную команду для блокировки спамера
echo "добавление спамера в блэкхол..."
nft добавить элемент inet spammers blackhole { ${ADDRESS} }
BAN_SPAMMER_RESULT=$?
если [ $BAN_SPAMMER_RESULT -eq 0 ]
тогда
echo "ГОТОВО: ${ADDRESS} добавлен в таблицу спамеров"
фи
эхо ""
}
разбан_спаммер () {
# Выполните основную команду для блокировки спамера
echo "удаление спамера из blackhole..."
nft удалить элемент inet spammers blackhole { ${ADDRESS} }
UNBAN_SPAMMER_RESULT=$?
если [ $UNBAN_SPAMMER_RESULT -eq 0 ]
тогда
echo "ГОТОВО: ${ADDRESS} удален из таблицы"
фи
эхо ""
}
persist_spamtable () {
echo "Сохранение спама в ${CONFIG_FILE}..."
# нам нужно сохранить таблицу спама в конфиге
nft list table inet spammers > ${CONFIG_FILE}
если [$? -экв 0]
тогда
echo "готово.. показывает таблицу..."
эхо ""
nft список спамеров инет таблицы
еще
echo "Ошибка сохранения таблицы.."
фи
эхо ""
}
list_spamtable () {
echo "список спама"
эхо ""
nft список спамеров инет таблицы
эхо ""
}
kill_spamtable () {
echo "сброс/создание пустой таблицы спама ${CONFIG_FILE}..."
#rm -f /etc/nftables.d/spammers.conf
тройник /etc/nftables.d/spammers.conf <<EOF
таблица инет спамеров {
установить черную дыру {
введите ipv4_addr
}
цепочка спамеров-цепочка {
тип фильтра хук входной фильтр приоритета - 2; политика принять;
ip saddr @blackhole капля
}
}
EOF
эхо ""
если [$? -экв 0]
тогда
echo "успех... вот новый файл:"
эхо ""
кот /etc/hftables.d/spammers.conf
еще
echo "Ошибка записи файла..."
фи
эхо ""
}
Помоги мне () {
echo "Это инструмент для упрощения блокировки IP-адресов спамеров"
эхо " "
echo "банспаммер 2021-12-22 DigitalSorceress"
эхо " "
эхо "РЕЗЮМЕ"
echo " Этот скрипт используется для упрощения процесса добавления/удаления спамеров из "
echo "таблица спамеров в наборе правил nftables"
эхо " "
эхо " "
echo "использование: $0 команда банспаммера [адрес] "
эхо " "
эхо " параметры команды: "
эхо "адрес бана"
echo "запрещает целевой адрес; может быть один IP-адрес или список с разделителями-запятыми"
эхо " "
echo "адрес разблокировки"
echo "удаляет целевой адрес, может быть один IP-адрес или список разделителей с запятыми"
эхо " "
эхо "сброс"
echo "удаляет все записи из таблицы спамеров"
echo "обратите внимание, что это можно использовать для создания новой пустой таблицы"
эхо " "
эхо "показать"
echo "показывает текущий список таблицы спама"
эхо " "
эхо "помогите"
echo "Отображает это диалоговое окно справки"
}
# Здесь мы выполняем реальную работу на основе переданной команды
case "$COMMAND" в
бан)
если [ $# -eq 2 ]
тогда
echo "адрес блокировки: ${ADDRESS}"
ban_spammer ${АДРЕС}
если [ $BAN_SPAMMER_RESULT -eq 0 ]
тогда
persist_spamtable
фи
еще
echo "для команды ban требуется один IP-адрес или список IP-адресов, разделенных запятыми"
фи
;;
разбан)
если [ $# -eq 2 ]
тогда
echo "Адрес для разблокировки: ${ADDRESS}"
unban_spammer ${АДРЕС}
если [ $UNBAN_SPAMMER_RESULT -eq 0 ]
тогда
persist_spamtable
фи
фи
;;
показать)
list_spamtable
;;
перезагрузить)
kill_spamtable
;;
помощь)
Помоги мне
;;
*)
echo "Использование: $0 бан|разблокировать список IP-адресов, разделенных запятыми, или $0 показать|сбросить"
выход 1
эсак