Файл, используемый для блокировки, не имеет значения, сценарий использует $0
, поскольку известно, что этот файл существует.
Порядок получения блокировок будет более или менее случайным, в зависимости от того, насколько быстро ваша машина сможет запустить две задачи.
Вы можете использовать любой файловый дескриптор, не обязательно 0. Блокировка удерживается на файле, открытом для файлового дескриптора, а не на самом дескрипторе.
( flock -x 9 || exit 1
echo 'Locking for 5 secs'; sleep 5; echo 'Done' ) 9>/tmp/lock &
ipset
был разработан для решения этой проблемы. Вы можете создать набор IP-адресов или подсетей :
ipset create bannedv4 hash:net family ipv4 comment
ipset create bannedv6 hash:net family ipv6 comment
Добавьте одно правило iptables, подобное этому:
iptables -A INPUT -m set --match-set bannedv4 src -j DROP
ip6tables -A INPUT -m set --match-set bannedv6 src -j DROP
Затем вы можете добавить много записей в запрещенные наборы. Я не знаю, как настроить fail2ban для его использования. Для меня уже есть действия ipset, определенные в /etc/fail2ban/action.d
, но это, вероятно, зависит от дистрибутива.
ipset add bannedv4 1.2.3.4/16 comment "SSH bot"
ipset add bannedv6 64:ff9b::1.2.3.4/112 comment "SSH bot"
Также возможно наличие записей с истекающим сроком действия. Когда вы создаете набор, просто добавьте опцию timeout 604800
, чтобы запретить их только на неделю. Вы можете переопределить этот тайм-аут по умолчанию, передав ту же опцию в ipset add
. Вы, вероятно, также захотите сохранить наборы из своих сценариев инициализации, как вы сохраняете свои правила iptables. Обратите внимание, что вы должны восстановить наборы перед правилами iptables.
ipset save > /var/lib/firewall/ipset
ipset restore < /var/lib/firewall/ipset