FastNetMon

Thursday 7 January 2010

Защита Nginx от DoS ботов, не передающих хидер host

За свою практику очень часто сталкивался с ботами, которые долбят сервер по IP не передавая какой-либо конкретный виртуальный хост (host заголовок http запроса).

Nginx разумеется, их обслуживает как честных клиентов, посылая в ответ им 400й код, тратя на это ресурсы. Для того, чтобы сэкономить и эти ресурсы, у Nginx есть специальный код ответа - 444, который делает следующее:


Nginx understands that if you want to send the client the 444 error code (only 400-417 and 500-505 are allowed by RFC) then Nginx should just close the connection to the client. Just dropping the connection and sending an empty TCP reset packet to the client will deny scanner information about the server and _may_ confuse them.


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

Вот этот сервер необходимо добавить в конфиг файл nginx.conf самым первым.
server {
listen 80;
server_name _; #default
# access_log /var/log/nginx/localhost.access.log;
return 444;
}


И после этого сделать reload Nginx у:

/etc/init.d/nginx reload


источник: https://calomel.org/nginx.html

10 comments :

  1. Сударь, большое спасибо Вам! Раньше ддосерам 403 отдавал, а 444 выгоднее ))

    ReplyDelete
  2. Всегда пожалуйста ):

    ReplyDelete
  3. Вообще этот конфиг не будет работать как надо.
    С пустым или отсутствующим Host -- будет отдаваться 400, с любым другим 444.

    ReplyDelete
  4. Это не так, с чего Вы взяли? Скорее всего, у вас иная конфигурация, но у меня на ряде ддосо-подверженных серверов именно так и в логах точно видно, что всем, кому не надо выдается 444.

    ReplyDelete
  5. может так лучше

    server {
    listen *:80 default_server;
    server_name localhost "";
    return 444;
    }

    ReplyDelete
  6. вернее так

    server {
    listen *:80 default;
    server_name _ "";
    return 444;
    }

    у меня 0.7 версия

    ReplyDelete
  7. Вобще не пойму в server_name должно быть hostname ?
    а на другие домены это будет распространятся?
    server_name site.ru "";

    ReplyDelete
  8. В примерах конфигурации серверов, обрабатывающих все запросы, встречается странное имя “_”:

    server {
    listen 80 default_server;
    server_name _;
    return 444;
    }
    Оно не является каким-то особенным, это просто одно из множества некорректных доменных имён, которые никогда не пересекутся ни с одним из реальных имён. С тем же успехом можно использовать имена типа “--” и “!@#”.


    Что это значит? Что server_name _; не работает?

    ReplyDelete
  9. чего-то я вообще ничего не пойму...
    написал php скрипт, там подменил header host на пустой и ошибка 400
    получается не работает

    прописал что-то левое. работает... даже просто тире в header host и то работает... и зачем вобще тогда это делать? я думаю написать ботов которые в header host генерят что-нить вобще не проблема

    ReplyDelete
    Replies
    1. Естественно, это легко. Если хотите универсальные решения, то в ddos-protection.ru/qrator.net - прямая дорога.

      Delete

Note: only a member of this blog may post a comment.