Ограничение доступа к сайту через Nginx
Как настроить фильтрацию по IP, парольную защиту и блокировку нежелательных запросов.
При работе с веб-сервером важно контролировать, кто и к каким ресурсам имеет доступ. Nginx предоставляет гибкие инструменты для решения этой задачи: от простой блокировки по IP до комбинированной защиты с аутентификацией.
Примечание
На VPS и выделенных серверах вы полностью управляете конфигурацией Nginx и можете применять любые из описанных ниже методов.
1. Ограничение доступа к файлам
Чтобы закрыть доступ к служебным директориям, например .svn:
location ~ /.svn/ {
deny all;
}
2. Разграничение доступа по IP
Директивы allow и deny позволяют задать белый список IP-адресов для конкретного раздела сайта:
location /server-status {
allow 111.111.111.111;
allow 11.11.11.11;
deny all;
}
3. Защита паролем (Basic Auth)
Для закрытых разделов можно включить запрос логина и пароля:
location /admin/ {
auth_basic "Enter password to access";
auth_basic_user_file /etc/nginx/basic.auth;
}
4. Комбинированная защита: IP + пароль
Директива satisfy any позволяет пропускать пользователя, если он прошёл хотя бы одну проверку — либо по IP, либо по паролю:
location /admin/ {
satisfy any;
allow 111.111.111.111;
allow 11.11.11.11;
deny all;
auth_basic "Enter password to access";
auth_basic_user_file /etc/nginx/basic.auth;
}
5. Защита от запросов к несуществующим файлам
Возвращает 404 при обращении к статическим файлам, которые не существуют на диске:
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
6. Перенаправление по IP
Nginx может выполнять редирект в зависимости от IP-адреса посетителя:
location / {
if ($remote_addr != 111.111.111.111) {
return 301 https://$host$request_uri;
}
}
Все посетители, кроме запросов с IP
111.111.111.111, будут перенаправлены наhttps://$host$request_uri.
7. Защита от перебора с помощью iptables
Если количество запросов с одного IP превышает допустимый порог, iptables временно блокирует его:
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW \
-m recent --name bhttp --set
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW \
-m recent --name bhttp --update --seconds 120 \
--hitcount 360 -j DROP
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -j ACCEPT
В данном примере блокируются IP-адреса, с которых поступило более 360 новых соединений за 120 секунд.
Применение изменений
После редактирования конфигурации Nginx необходимо выполнить перезагрузку:
systemctl reload nginx
# или
service nginx reload
Помощь
Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!