"banned_" можна змінювати, а "inet4" і "inet6" краще залишити, це дозволить створити спільний для різних IP-set наборів файл ipset-multi.conf (див. нижче).
Також, створимо набір для ручного запису групи адрес (є такі боти, які чередують IP як 81.30.107.*)
ipsetcreatemanual_blockhash:netfamilyinet-exist
Додавати туди так:
ipsetaddmanual_block81.30.107.0/24
Одноразово включаємо цей набір в iptables:
І зберігаємо:
Дивимось:
3. Підтримка IPv6
Якщо сервер підтримує IPv6, то пропиши "allowipv6 = yes" у /etc/fail2ban/fail2ban.conf:
Інакше буде вилазити попередження: "WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'"
Щоб fail2ban автоматично додавав IP у набори ipset (banned_inet4 / banned_inet6) створимо спільний для них action: /etc/fail2ban/action.d/ipset-multi.conf
і цей action треба буде прописати у конфіг /etc/fail2ban/jail.local:
4. netfilter-persistent + ipset
За замовчуванням netfilter-persistent обробляє тільки iptables і ip6tables. Щоб інтегрувати ipset, створюємо плагін:
netfilter-persistent зберігає/відновлює ipset разом з iptables.
Таймер ipset-save.timer раз на годину о :40 хв. додатково зберігає ipset у файл /etc/iptables/ipsets.
Після перезавантаження всі правила і бан-листи повертаються автоматично.
DELETE DELETE DELETE DELETE DELETE DELETE
Створюємо сервіс для відновлення ipset при старті системи.
Спочатку збережемо активні набори у файл (наприклад /etc/ipset.conf):
(якщо працюємо через sudo: sudo sh -c 'ipset save > /etc/ipset.conf' )
Активуємо сервіс
Тепер при кожному старті системи ipset автоматично відновлюватиметься ще до запуску iptables/netfilter-persistent.
Створюю три файли:
сервіс (який виконує команду збереження) - ipset-save.service,
таймер (який запускає цей сервіс раз на 30 хв) - ipset-save.timer і
сервіс, який буде перед вимкненням/перезавантаженням зберігати актуальний стан ipset у /etc/ipset.conf. Це дає гарантію, що навіть при форсованому ребуті список не загубиться..
iptables -I INPUT -m set --match-set manual_block src -j DROP
netfilter-persistent save
ipset list -name
manual_block
banned_inet4
banned_inet6
# Option: allowipv6
# Notes.: Allows IPv6 interface:
# Default: auto
# Values: [ auto yes (on, true, 1) no (off, false, 0) ] Default: auto
allowipv6 = yes
nano /etc/fail2ban/action.d/ipset-multi.conf
[Definition]
# Додає/видаляє IP у правильний ipset залежно від типу адреси
# При старті jail створюємо набори (якщо їх ще нема)
actionstart = ipset create banned_inet4 hash:ip family inet -exist
ipset create banned_inet6 hash:ip family inet6 -exist
# При зупинці jail не видаляємо набори, тільки очищаємо
actionstop = ipset flush banned_inet4
ipset flush banned_inet6
# Перевірка наявності наборів
actioncheck = ipset list banned_inet4
ipset list banned_inet6
# Додаємо IP у набір IPv4/6
actionban = ipset add banned_<family> <ip> -exist
# Видаляємо IP з набору IPv4/6
actionunban = ipset del banned_<family> <ip> -exist
# fail2ban підставляє замість <family> автоматично: "inet4" для IPv4, "inet6" для IPv6
[Init]
# Ніяких додаткових параметрів не треба
[DEFAULT]
...
banaction = ipset-multi
#!/bin/sh
set -e
IPSET_SAVE="/etc/iptables/ipsets"
case "$1" in
start)
[ -f "$IPSET_SAVE" ] && ipset restore < "$IPSET_SAVE" || true
;;
save)
ipset save > "$IPSET_SAVE"
;;
flush)
ipset flush
;;
stop)
# нічого не робимо при stop
;;
esac