98% загрузка ЦП на сервере Ubuntu, работающем под Apache, сайт не отвечает
Я запускаю сервер с apache2 на коробке с Ubuntu. Это крипто-майнинг пул. Все работало нормально, даже при большом количестве людей, заходящих на наш сайт. Тогда из ниоткуда наше использование процессора на всех 8 ядрах составляет от 98 до 100%
Я использую обратный прокси-сервер перед сервером, чтобы помочь смягчить DDOS-атаки, но я никогда не сталкивался с этим раньше.
netstat -an | grep: 80 | grep SYN | wc -l выдает 100+, пока это происходит.
Уничтожение apache немедленно снижает нагрузку до нормального уровня и позволяет моим клиентам продолжать использовать другие службы на сервере. Но нам нужно, чтобы наш интерфейс работал.
Я пробовал несколько правил iptables, но они не работают. Я изменил свой sysctl в соответствии с некоторыми предложениями:
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 128000 200000 262144
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 1800000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 1
vm.swappiness = 5
net.ipv4.tcp_syncookies = 1
но это, кажется, не смягчает проблему.
Я в своем уме и мне нужно, чтобы сайт снова заработал и заработал.
ЛЮБЫЕ и все предложения будут оценены.
Спасибо.
2 ответа
Вы можете найти число 10 лучших (или других) текущих TCP-соединений на IP с помощью netstat -tan| grep -v 'LISTEN'| awk '{print $5}'| grep -v 'and' |grep -v 'Address' |cut -d':' -f1 |sort -n | uniq -c | sort -rn | head -n10
А также 10 лучших IP-адресов в лог-файлах Apache с cd /var/log/apache2; for i in ./access.log*; do echo $i; cat $i | awk '{print $1}'| sort -n | uniq -c | sort -rn | head -n10; done
Как только вы определили оскорбительные IP-адреса, вы можете заблокировать их с помощью iptables -A INPUT -s 1.2.3.4 -j DROP
,
Вы также можете ограничить скорость соединений с помощью iptables, например, если вы не хотите более 20 соединений в минуту из источника:
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP
Ваш вопрос слишком общий для ответа, но у меня есть несколько предложений:
Во-первых, используйте файл hosts.deny, чтобы разрешить только хороших парней или исключить избранных плохих парней Не забудьте поместить свои локальные сети в файл hosts.allow, который имеет приоритет. Вы можете найти плохих парней в своем журнале Apache или сделать это (реальный пример из сегодняшнего журнала)
# BADGUYS=(`grep "authentication failure.*rhost=" /var/log/auth.log | \
sed 's/.*rhost=\(\S*\).*/\1/' | \
sort -u`)
# echo ${BADGUYS[0]}
109.228.29.199
а теперь заблокируйте их
# for GUY in ${BADGUYS[*]}; do
> echo "ALL: $GUY" >> /etc/hosts.deny
> done
Это может помочь достаточно, чтобы все работало, пока вы выбираете лучший протокол брандмауэра. Отказ от ответственности: приведенный выше фрагмент является образцом, а не полным обсуждением или решением. Как показано, он, вероятно, заблокирует некоторых законных пользователей, которые только что столкнулись с трудностями при вводе своего пароля, поэтому проверьте результаты. Вот почему вы хотите, чтобы ваши локальные сети в hosts.allow
,
Во-вторых, установить DenyHosts
или же fail2ban
, которые делают вышеуказанное автоматически. У меня больше опыта работы с DenyHosts, но, похоже, он выходит из строя. Он нацелен на хосты, которые атакуют ваш ssh-сервис, но может блокировать все сервисы.
В-третьих, решить проблему правил iptables. Ubuntu не загружает (или не загружает) правила по умолчанию, но есть несколько способов сделать их постоянными. Проверьте iptables-persistent
пакет.