Ограничение доступа к сайту через 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

Помощь

Если у вас возникли вопросы или требуется помощь, пожалуйста, свяжитесь с нами через систему тикетов — мы обязательно вам поможем!

Обновлено:
Нужна помощь?Наши инженеры бесплатно помогут с любым вопросом за считанные минутыНаписать нам