Способ не нов, но я совсем недавно про это узнал !
Да есть ботнеты, которые могут моделировать поведение посетителя, но не у всех дудосеров такие ботнеты, также немногие стрессеры как понимаю могут обходить предложенной в этой теме способ ! :)
Итак смысл:
Мы проверяем всех посетителей на возможность принимать куки, если посетитель не может принять наш кук, то скорей-всего это бот и блокируем доступ к сайту ! :)
Как сделать это средствами nginx !
На самом деле ничего такого сложного нет, расписываю всё по шагам (Будем считать что вы поставили чистый nginx с офф. сайта):
1)Установка модуля
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
. в nginx:К сожалению, в офф. сборке нет этого модуля, поэтому сделаем всё как реальные пацаны, а именно соберём модуль из исходников и динамически подключим его !
Как это сделать:
Ставим Nginx из репозитория с офсайта.
Проверяем его версию:
Код:
nginx -V 2>&1|grep "nginx version"
nginx version: nginx/1.9.12
Код:
nginx -V
Код:
cd /usr/src
git clone https://github.com/kyprizel/testcookie-nginx-module.git
Код:
apt-get install -y libxml2-dev libxslt-dev libgd2-xpm-dev libgeoip-dev
Собираем модуль (Версия нужна nginx, та-которая установлена на нашем сервере, т.е. не-та которая в примере):
cd /usr/src
wget '
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
'tar -xzvf nginx-1.9.12.tar.gz
cd nginx-1.9.12/
# configure параметры берем из выдачи nginx -V выше, не забудьте добавить
--add-dynamic-module=/usr/src/testcookie-nginx-module
(ХОТЯ МОЖНО И ЭТИ,ТО-ЧТО НИЖЕ, ЕСЛИ БУДЕТ ОШИБКА)
./configure --add-dynamic-module=/usr/src/testcookie-nginx-module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/etc/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,--as-needed' --with-ipv6
Собираем:
Код:
make
Код:
mkdir /etc/nginx/modules
cp ./objs/ngx_http_testcookie_access_module.so /etc/nginx/modules
Код:
load_module "modules/ngx_http_testcookie_access_module.so";
Перезагружаем nginx и всё далее идём настраивать!
2)Настройка нашего модуля:
Основная настройка сводится к правке nginx.conf, где особое внимание уделяется параметрам testcookie_secret и testcookie_arg. Генерируем значения самостоятельно. Входные строки можно брать любые, главное получить на выходе славный набор символов.
Код:
# echo label |md5sum
41cc0e4945e162021cfdd993f4c1104d -
# echo defcon |md5sum
15dbedaeabc7f0c09f0fe834e4a3b46a -
Полученные значения подставляем в качестве аргументов для testcookie_secret и testcookie_arg.
значение для testcookie_name также можно установить произвольное.
Код:
# vi /etc/nginx/nginx.conf
http {
...
testcookie off;
testcookie_name XSAE;
testcookie_secret 15dbedaeabc7f0c09f0fe834e4a3b46a;
testcookie_session $remote_addr;
testcookie_arg label_41cc0e4945e162021cfdd993f4c1104d;
testcookie_max_attempts 3;
testcookie_get_only on;
testcookie_internal off;
# используем белые списки
include /etc/nginx/testcookie_whitelist.conf;
...
}
Создаем движок rewrite'ов в /etc/nginx/testcookie.conf
Cуть в следующем, необходимо делать реврайт конечного урла, но не делать это так чтобы светился параметр редиректа (?label_*)
Код:
# vi /etc/nginx/testcookie.conf
set $do_rewrite 0;
# проверяем наличие выданной куки
if ($http_cookie ~ "XSAE=[0-9a-f]+") {
set $do_rewrite 1;
}
# если в аргументах присуствует метка выданная модулем, выкусываем её
if ($args ~ "^((.*)(label_41cc0e4945e162021cfdd993f4c1104d=1&|&label_41cc0e4945e162021cfdd993f4c1104d=1(.*))|label_41cc0e4945e162021cfdd993f4c1104d=1)$") {
set $target "$2$4";
set $do_rewrite "1${do_rewrite}";
}
# делаем правильный реврайт, подставляем только урл и другие возможные параметры (без метки)
if ($do_rewrite = 11) {
set $args $target;
rewrite ^.*$ http://$host$uri break;
}
Белый список (для краткости сократил до двух адресов)
Код:
# vi /etc/nginx/testcookie_whitelist.conf
testcookie_whitelist {
# Yandex
77.88.0.0/18;
87.250.224.0/19;
}
Изменения в /etc/nginx/proxy_headers.conf
Код:
# vi /etc/nginx/proxy_headers.conf
testcookie on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Затем в каждый из конфигурационных файлов виртуальных хостов прописываем в начало секции server. Таким образом в каждом виртуальном хосте мы подгружаем rewrite-движок, и белые списки. Сам механизм testcookie будет работать в случаях когда запросы проксируются на бэкенды и подгружается proxy_headers.conf
Код:
server {
...
include /etc/nginx/testcookie.conf;
include /etc/nginx/testcookie_whitelist.conf;
...
# пример локейшена
location / {
include /etc/nginx/proxy_headers.conf;
proxy_pass http://upstream;
}
Перезапускаем.
Код:
# nginx -t -c /etc/nginx/nginx.conf
# /etc/init.d/nginx restart
Также прилагаю во вложении конфиги + белый список поисковых систем (файл testcookie_whitelist.conf), рекомендую туда добавить также айпи своего сервера и монеторинг ! :)
Вложения
Последнее редактирование: