Сервер Nginx: Как ограничить доступ к сайту по IP адресам

Один из способов уменьшение вектора атаки на веб сайт, это ограничение доступа к служебным страницам по ip адресам (сетям), чтобы, например, ограничить возможности попасть в панель администрирования сайта только с корпоративных сетей. Ниже описан как раз такой модуль для nginx, который позволяет заблокировать доступ с определенных IP адресов или подсетей. Этот модуль называется ngx_http_access_module, именно с помощью него можно разрешать или запрещать доступ с IP адресов. 

Описание синтаксиса 

Настройки, которые определяют, разрешено или запрещено с того или иного IP-адреса получать доступ к сайту, описываются в конфигурации сайтов nginx в секции location, для каждой описанной директории сайта (если в этом есть необходимость). По умолчанию, доступ разрешен всем ip адресам. разрешение или запрет указываются директивами allow (разрешить) и deny (запретить).Обход описанных директив выполнятеся последовательно сверху вниз и первая сработавшая директива будет определять разрешен доступ или нет. Ниже показан пример:

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}


В этом примере, доступ к сайту разрешен только для сетей: 192.168.1.0/24, 10.1.1.0/16 и 2001:0db8::/32, но при этом запрещен доступ для хоста 192.168.1.1 (не смотря на разрешающее правило для сети). Подключения с сетей, которые не описаны разрешающими правилами выше, будут запрещены финальной директивой deny all.

Как заблокировать доступ к сайту для определенных IP

Чтобы заблокировать доступ к сайту для определенных IP адресов или IP сетей, в конфигурации сайтов nginx в секции location необходимо перечислить IP-адреса и сети, для которых необходимо запретить доступ. Например,

location / {
   deny 1.2.3.4;
   deny 5.6.7.0/25;
 }

В этом примере, для 1.2.3.4 и 5.6.7.0/25 доступ к сайту будет запрещен.

Как разрешить доступ к каталогу сайта только с определенных IP

Например, на сайте установлен phpMyAdmin — веб-приложение для администрирования СУБД MySQL, которая доступна по пути /phpMyAdmin. Чтобы не дать возможность злоумешленникам использовать вдруг обнаруженную уязвимость, целесообразно ограничить доступ к каталогу сайта /phpMyAdmin только определенным IP-адресам администраторов. В этом случае, раздел конфигурации location может выглядеть так:

location /phpMyAdmin  {
   allow 9.8.7.6;
   allow 2.3.4.5/28;
   deny all;
 }

 В примере, IP адрес 9.8.7.6 и сеть 2.3.4.5/28 - это адреса только для которых будет разрешен доступ к /phpMyAdmin.

Применение настроек nginx без перезагрузки

Чтобы послать сигнал веб серверу Nginx перечитать и применить актуальную конфигурацию, достаточно в консоли выполнить команду:

nginx -s reload

После выполнения этой команды, новый файл конфигурации будет применен, без перезапуска сервера, при условии, что новый файл конфигурации не содержит ошибок