
У меня есть веб-сервер lighttpd, который доставляет веб-страницы, сгенерированные PHP. В настоящее время этот сервер сталкивается с большим трафиком из-за атаки бота DDoS, и я ищу способ заблокировать или смягчить некоторые из них.
Насколько мне известно, lighttpd предлагает возможность блокировать запросы через удаленный IP-адрес, например, поместив
$HTTP["remoteip"] == "12.34.56.0/24" {
url.access-deny = ( "" )
}
в lighttpd.conf
, все запросы, поступающие из диапазона IP-адресов 12.34.56.0 - 12.34.56.255, будут заблокированы.
Однако из-за природы DDoS-атак невозможно блокировать отдельные IP-адреса или диапазоны, поскольку они довольно часто меняются.
Изучив журнал доступа, я обнаружил, что большинство запросов от ботов, по-видимому, используют старый протокол HTTP/1.0, в то время как большая часть легитимного трафика использует HTTP/1.1.
Итак, мой вопрос:Есть ли способ заблокировать/отклонить все запросы, поступающие через HTTP/1.0 (и разрешить запросы через HTTP/1.1) в lighttpd?
Я не смог найти такую возможность в официальномдокументация по конфигурации lighttpd.
Примечания:
- Я знаю, что некоторый легитимный трафик также может использовать HTTP/1.0, но я бы мог заблокировать и его.
- Запросы бота, по-видимому, не используют общий шаблон для пользовательских агентов или HTTP-рефереров, поэтому использование шаблонов с регулярными выражениями не представляется возможным.
решение1
Вместо того, чтобы давать решение lighttpd
, я бы рекомендовал вам использоватьfail2banкоторый присутствует во всех системах на базе Unix. Он отслеживает изменения в файлах журнала и анализирует их в соответствии с правилами регулярных выражений, и в случае соответствия шаблону (HTTP/1.0 в вашем случае) блокирует его на уровне системного брандмауэра, что более эффективно для блокировки нежелательных подключений.
Кроме того, если вы сталкиваетесь с аномальным трафиком, когда вы видите больше вредоносных запросов, чем обычных, вы можете добавить следующее правило брандмауэра, чтобы замедлить DDoS-атаки.
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 127 -j ACCEPT
Если вы все же хотите заблокировать HTTP/1.0 на lighttpd
уровне, попробуйте сопоставить протокол HTTP следующим образом:
env.SERVER_PROTOCOL == "HTTP/1.0" {
url.access-deny = ( "" )
}
(Решение не проверялось, так как я перешел на операционную систему nginx
уже давно, но, на мой взгляд, оно может сработать.)