Я новичок в 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
то, что, по-видимому, вы искали, чтобы сохранить правила сетевого фильтра?