Я запускаю сайт WordPress на сервере CentOS 7. У меня установлен и работает fail2ban, и я убедился, что он добавляет IP-адреса в iptables. Я только что добавил Cloudflare на сайт, и теперь пытаюсь заставить fail2ban работать с Cloudflare v4 API. Я последовал этому руководству , чтобы получить файлы fail2ban и конфиги. Вроде все работает, но fail2ban не может отправить забаненный IP в Cloudflare. Но я могу запустить ту же команду curl сам, и Cloudflare заблокирует IP. Мой гугл-фу меня подводит, поскольку все, что я обнаружил, касается сбоев при снятии бана IP.
Вот что происходит:
Это команда, которую я выполняю. Если я запустил это из командной строки, IP-адрес отобразится на сайте Cloudflare как заблокированный.
curl -s -o /dev/null -X POST -H 'X-Auth-Email: me@email.com' -H 'X-Auth-Key: xxxx' \
-H 'Content-Type: application/json' -d '{ "mode": "block", "configuration": { "target": "ip", "value": "1.2.3.4" } }' \
https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
Когда fail2ban пытается выполнить ту же команду, это результат (журналы отладки включены):
2020-02-29 01:42:01,129 fail2ban.actions [25495]: NOTICE [wordpress-hard] Ban 1.2.3.4
2020-02-29 01:42:01,129 fail2ban.action [25495]: DEBUG curl -s -o /dev/null -X POST -H 'X-Auth-Email: me@email.com' -H 'X-Auth-Key: XXXX' \
-H 'Content-Type: application/json' -d '{ "mode": "block", "configuration": { "target": "ip", "value": "1.2.3.4" } }' \
https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
2020-02-29 01:42:01,153 fail2ban.utils [25495]: ERROR 7f35e1c815b0 -- exec: curl -s -o /dev/null -X POST -H 'X-Auth-Email: me@email.com' -H 'X-Auth-Key: XXXX' \
-H 'Content-Type: application/json' -d '{ "mode": "block", "configuration": { "target": "ip", "value": "1.2.3.4" } }' \
https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
2020-02-29 01:42:01,153 fail2ban.utils [25495]: ERROR 7f35e1c815b0 -- returned 7
2020-02-29 01:42:01,153 fail2ban.actions [25495]: ERROR Failed to execute ban jail 'wordpress-hard' action 'cloudflare' info 'ActionInfo({'ip': '1.2.3.4', 'fid': <function <lambda> at 0x7f35e23f9a28>, 'family': 'inet4', 'raw-ticket': <function <lambda> at 0x7f35e23f9ed8>})': Error banning 1.2.3.4
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/fail2ban/server/actions.py", line 458, in __checkBan
action.ban(aInfo)
File "/usr/lib/python2.7/site-packages/fail2ban/server/action.py", line 540, in ban
raise RuntimeError("Error banning %(ip)s" % aInfo)
RuntimeError: Error banning 1.2.3.4
Что мне не хватает? Я нашел одну страницу, на которой говорилось об ошибке «7f35e1c815b0 - вернул 7» как части ограничения скорости Cloudflare, но я далек от этого предела.
Оказывается, SELinux блокировал fail2ban от использования curl. Я отследил это и исправил, добавив новый пакет политик, следуя этому руководству: Возня с политиками SELinux . Теперь fail2ban правильно обновляет Cloudflare.
Примечание для тех, кто найдет это в Google в будущем: мне пришлось назвать новую политику fail2ban-mod, чтобы она установилась. Назвать его fail2ban не получится, хотя некоторые интернет-руководства говорят, что это должно быть.