Лучшие практики для сохранения правил 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)
Но, насколько я вижу, правила 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 или настроить этот каталог для чтения в моих правилах и т. д..
Я мог бы сделать это, добавив в моем 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 выполняет проверку, поэтому я не слишком беспокоюсь об этом.
Обратите внимание, что в моей конкретной установке уже был фильтр с именем fileter в семействе inet — я специально добавляю его как список с немного более низким приоритетом. Я также создал каталог /etc/nftables.d и добавил в свой код, чтобы он анализировал каталог конфигурации как я упоминал выше
здесь надеюсь, что кто-то найдет это полезным.
Я все еще был бы заинтересован в более «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
что, кажется, было тем, что вы искали, чтобы сохранить свои правила сетевого фильтра?