Я пытаюсь настроить блокировку Cloudflare с помощью fail2ban, используя это руководство и хотя он правильно блокирует IP-адрес, fail2ban не может разблокировать IP-адрес из Cloudflare ни по истечении времени ожидания, ни с помощью ручной команды оболочки. Он всегда возвращает ошибку 400 Bad Request.
Я делаю что-то неправильно?
Вот соответствующая команда cURL:
actionunban = curl -s -X DELETE "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$( \
curl -s -X GET "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=<ip>&page=1&per_page=1&match=all" \
-H "X-Auth-Email: <cfuser>" \
-H "X-Auth-Key: <cftoken>" \
-H "Content-Type: application/json" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'id'\042/){print $(i+1)}}}' | tr -d '"' | head -n 1)" \
-H "X-Auth-Email: <cfuser>" \
-H "X-Auth-Key: <cftoken>" \
-H "Content-Type: application/json"
Обновление: я могу запускать вышеупомянутые вложенные команды cURL отдельно, и они возвращают правильные ответы.
Похоже, Cloudflare скорректировал свой API для возврата отформатированного JSON (ранее возвращаемый JSON был в одной строке). Вы должны иметь возможность решить проблему, удалив символы новой строки перед подключением к команде awk:
actionunban = curl -s -X DELETE "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$( \
curl -s -X GET "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=<ip>&page=1&per_page=1&match=all" \
-H "X-Auth-Email: <cfuser>" \
-H "X-Auth-Key: <cftoken>" \
-H "Content-Type: application/json" | tr -d '\n' | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'id'\042/){print $(i+1)}}}' | tr -d '"' | head -n 1)" \
-H "X-Auth-Email: <cfuser>" \
-H "X-Auth-Key: <cftoken>" \
-H "Content-Type: application/json"
Вы также можете переключиться на новые фильтры Cloudflare, которые поставляются с Fail2ban 0.10, поскольку они намного лаконичнее:
actionban = curl -s -o /dev/null -X POST -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \
-H 'Content-Type: application/json' -d '{ "mode": "block", "configuration": { "target": "ip", "value": "<ip>" } }' \
https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
actionunban = curl -s -o /dev/null -X DELETE -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \
https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$(curl -s -X GET -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \
'https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=<ip>&page=1&per_page=1' | tr -d '\n' | cut -d'"' -f6)
Спасибо, Джейк Джексон, вы правы!
Я был протестирован, удалив строку из первой пустой строки идентификатора и успешно. В настоящее время я добавляю команду sed в канал с помощью следующей команды:
actionunban = curl -s -X DELETE "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$( \
curl -s -X GET "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=27.78.160.247&page=1&per_page=1&match=all" \
-H "X-Auth-Email: <My's Email>" \
-H "X-Auth-Key: <My's Token Cloudflare>" \
-H "Content-Type: application/json" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'id'\042/){print $(i+1);}}}' | tr -d '"' | sed -e 's/^[ \t]*//' | head -n 1)" \
-H "X-Auth-Email: <My's Email>" \
-H "X-Auth-Key: <My's Token Cloudflare>" \
-H "Content-Type: application/json"
Надеюсь помогу всем!
Думаю, есть проблемы с API Cloudflare. Я попробовал разделить команду unban IP следующим образом:
id_CF=`curl -s -X GET "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=xxx.xxx.xxx.xxx&page=1&per_page=1&match=all" \
-H "X-Auth-Email: <My's Email>" \
-H "X-Auth-Key: <My's Token Cloudflare>" \
-H "Content-Type: application/json" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'id'\042/){print $(i+1);}}}' | tr -d '"' | head -n 1`
curl -s -X DELETE "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$id_CF \
-H "X-Auth-Email: <My's Email>" \
-H "X-Auth-Key: <My's Token Cloudflare>" \
-H "Content-Type: application/json"
Результат: при запуске второй позиции команды затем возвращается ошибка 400 Bad Request, но когда я получаю значение переменной $ id_CF, предположим, что это следующая строка идентификатора: 71eceb59a7b846c6bd2b2692ab438e86 и снова запустите команду второй. Тогда это успех.
curl -s -X DELETE "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/71eceb59a7b846c6bd2b2692ab438e86" \
-H "X-Auth-Email: <My's Email>" \
-H "X-Auth-Key: <My's Token Cloudflare>" \
-H "Content-Type: application/json"
{"результат": ноль, "успех": истина, "ошибки": ноль, "сообщения": ноль}
Я действительно не знаю, откуда именно взялась проблема, но раньше, когда я использовал старый API, этого не было.