LINUX.ORG.RU

Bash скрипт для CloudFlare (автоматический активировать DDoS защиту)

 , ,


0

3

Есть VPS (Ubuntu 14.04) сервер который находиться за CloudFlare.

Задача на VPS сервере в случае нагрузки на CPU активировать Режим

 i'm Under Attack! 
после снижение нагрузки вернуть защиту в обратное состояние
 LOW 
то есть отключить.

И так есть скрипт для API CloudFlare работает через Curl который дергаем по крону

crontab -e

*/1 * * * * /root/DDoS/Cloudflare.sh 0 # check every 1 minutes if protection is not enabled
*/20 * * * * /root/DDoS/Cloudflare.sh 1 # check every 20 minutes if protection is enabled

СКРИПТ

 CloudFlare.sh
 #!/bin/bash

# Load average | $1 = 1min, $2 = 5min, $3 = 15min
loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')

# Max load is 10, you can modify if you want more than 10
maxload=10

# Configuration API Cloudflare
api_key=YOUR_API_KEY
email=YOUR_EMAIL
zone_id=ZONE_ID_DOMAIN

attacking=./attacking

# create file attacking if doesn't exist
if [ ! -e $attacking ];
  then
  echo 0 > $attacking
fi

hasattack=$(cat $attacking)

if [ $(echo "$loadavg > $maxload"|bc) -eq 1 ];
then
  if [[ $hasattack = 0 && $1 = 0 ]];
  then
    # Enable Protection
    echo 1 > $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
                  -H "X-Auth-Email: $email" \
                  -H "X-Auth-Key: $api_key" \
                  -H "Content-Type: application/json" \
                  --data '{"value":"under_attack"}'
  fi

else
  if [[ $hasattack = 1 && $1 = 1 ]];
  then
    # Disable Protection
    echo 0 > $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
                  -H "X-Auth-Email: $email" \
                  -H "X-Auth-Key: $api_key" \
                  -H "Content-Type: application/json" \
                  --data '{"value":"low"}'
  fi
fi

exit 0
 

Если я Правильно понял то если загрузка ЦП будет более 10% тогда мы переходим в режим Under Attack!

если же ЦП разгружен ниже 10% то через 20 минут мы вернем защиту в прежнее состояние.

скрипт почему то не работает. нагружал процессор до 10% + и более

но почему то код не срабатывает и также не переводит в параметр low (даже если нет нагрузки на ЦП)

Хотелось бы сразу разобрать код:

cat /proc/loadavg|awk '{printf "%f", $1}'

что это за параметр это нагрузка на ЦП? maxload=10 получается 10% ?

сами API точно работает так как побывал дергать кодом: тогда срабатывает UnderAttack!

#!/bin/bash

# Configuration API Cloudflare
api_key=YOUR_API_KEY
email=YOUR_EMAIL
zone_id=ZONE_ID_DOMAIN


    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
                  -H "X-Auth-Email: $email" \
                  -H "X-Auth-Key: $api_key" \
                  -H "Content-Type: application/json" \
                  --data '{"value":"under_attack"}'
 fi
 

С полного скрипта не срабатывает не Первый параметр не второй в случае если нет нагрузки:

Где тут Ошибка помогите разобраться.

при нагрузке на ЦП более 50+%

смотрю через SSH

 cat /proc/loadavg|awk '{printf "%f", $1}' 

показывает вообще данные в консоле 0,41 не понятно что за параметр чего 0,41 ?

shrmvl ()
Ответ на: комментарий от shrmvl

что за параметр чего 0,41

сто раз задавался вопросом что показывает load - в инструкции написано нагрузку за последние 1,5,15 минут, одна цифра это наверно за последнюю минуту, 0.41 это хер знает что такое - у меня бывает 8.00 кажет при сильных нагрузках

amd_amd ()
Ответ на: комментарий от shrmvl

Март прошел, коты остались. Обострение.
Про Load Averages на хабре есть статейка https://habrahabr.ru/company/mailru/blog/335326/
А вот про то что не стоит копипастить чужой код бездумно, даже не прочитав что там написано (а там в комментариях все написано, но нет же мы лучше скопипастим на лор и нам наверное переведут), за это надо в «шнобели» отправлять

anc ★★★★★ ()

Т.е. сервер усерается от нагрузки, а ты его еще и скриптами со считалками тыркаешь?

loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')

Ты бы еще питоновый скрипт для парсинга воткнул. Есть же cut -d" " -f 1 < /proc/loadavg .

if [ $(echo "$loadavg > $maxload"|bc) -eq 1 ];

ЧЕГО?! if [[ $loadavg > $maxload ]]

В любом случае LA не показатель для DDOS. Оно может расти по множеству причин. Я бы подобные подпорки запускал на стороннем сервере, проверяя время отклика основного. Вполне можно упереться в какой-нибудь лимит, например, на количество открытых файлов, и словить ошибку.

Еще я не вижу проверки выполнения запроса к API.

Radjah ★★★★★ ()
Последнее исправление: Radjah (всего исправлений: 1)
Ответ на: комментарий от Radjah

Я бы подобные подпорки запускал на стороннем сервере, проверяя время отклика основного.

и что ты проверишь со стороннего сервера? при DDoS не всегда грузят канал. а

 post,get 
запросами просто съедают процессор и ОЗУ.

ping остается стабильным.

на сервере не бывает огромных нагрузок лично у меня. только при ДдоС атткаке и показатель съедание ресурсов пока сервер не уйдет в DOWN ничего не определить по PING (он стабилен во всяком случае на OVH так).

предложи вариант как ты мониторишь такую ситуацию если у тебя (CloudFlare)

shrmvl ()
Ответ на: комментарий от shrmvl

предложи вариант как ты мониторишь такую ситуацию если у тебя (CloudFlare)

Вы мониторите то не знаю что, не зная чем? Потрясающий мониторинг.
Надеюсь стену найдете.

anc ★★★★★ ()
Ответ на: комментарий от Radjah

я пишу о ситуации тут так как не владею информацией. не спорить пришел кто умнее а выслушать варианты и советы.

если вы владеете информацией и можете дать дельный совет я буду рад выслушать и конечно за ранее спасибо.

shrmvl ()
Ответ на: комментарий от shrmvl

Тебе уже минимум двое написали, что ты пытаешься мониторить погоду на Марсе.

Если тебе важна отзывчивость web-сервера, то проверяй отзывчивость web-сервера, а не погоду на Марсе.

Radjah ★★★★★ ()
Ответ на: комментарий от shrmvl

а выслушать варианты и советы.

Что бы продать что-то «нафиг не нужное», изначально надо купить что-то «нафиг не нужное»
Это я к тому что если хотите получить помощь, то грамотно формулируйте вопрос. А не вида у меня «LA столько, я вообще не знаю что такое LA, памагите»
В правильно составленном вопросе, в большей вероятности уже присутствует ответ.

anc ★★★★★ ()
Ответ на: почитай, тут ответ на твой вопрос от dada

что показывает я примерно знаю, меня интересовало почему на одинаковых системах и задачах какой нибудь лажовый athlon64 выше 2.0 не прыгает, а топовый i7-3770 выше десятки лезет, хотя отрабатывает конечно намного быстрее... получается надо учитывать количество процессоров - в данном случае ядер

amd_amd ()
Ответ на: комментарий от Radjah

Можно добавить sed, чтобы выпилить точку. Хотя всё равно те же яйца получатся, только в профиль.

Вот именно, по ресурсам уж действительно лучше bc, чем sed вызывать. Получается такая фигня, что может даже awk проще.

[[ $(bc <<< "$(cut -d ' ' -f 1 /proc/loadavg) > $maxload") -eq  1 ]] && ...

vs

if awk "{exit (\$1<$maxload)}" < /proc/loadavg; then ...

vodz ★★★ ()
Последнее исправление: vodz (всего исправлений: 1)