Блокирование или разрешение доступа к сайту с помощью Nginx

С помощью Nginx вы можете легко разрешать или запрещать определенным ip-адресам доступ к определенным разделам сайта. Это удобный механизм, который позволяет реализовать ограничение трафика без необходимости задействовать файрвол операционной системы.

Данный механизм нельзя рассматривать как безопасный в сетях, где возможна подмена ip. Кроме того, обычно для защиты трафика и ограничения доступа этот метод должен комбинироваться с дополнительными механизмами, такими как базовая аутентификация HTTP и использование безопасного протокола HTTPS.

Если вы интересуетесь защитой блога WordPress, читайте отдельную статью о том, как это сделать.

Рассмотрим настройку механизма черных и белых списков с помощью Nginx. Для реализации существует две команды — allow и deny. Команды могут применяться в контексте конфигурационных секций http, server, location, limit_except. Чаще всего, команды применяются в разделе server и location.

Черный список

При реализации черного списка структура списка выглядит как:

deny 1.2.3.4;
deny 5.6.7.0/24;
...
allow all;

что позволяет указывать запрещаемые элементы вверху списка, в конце же списка присутствует элемент allow all, который разрешает все прочие адреса.

Обратите внимание, что вы можете использовать

  • индивидуальный ip4 (1.2.3.4) ;
  • сеть ip4 (5.6.7.0/24);
  • индивидуальный ip6 (2001:67c:20dc:1c00:1c00:a9ff:fe00:2e0);
  • сеть ip6 (2001:0db8::/32).

Белый список

Белый список формируется иным образом:

allow 1.2.3.4;
allow 5.6.7.0/24;
...
deny all;

Большой список

Если у вас используются большие списки, то их удобнее реализовывать в отдельном файле с включением по требуемому месту. Например, в случае с черным списком настройка будет выглядеть следующим образом:

location / {
        include /etc/nginx/blacklist.conf;
        allow all;
}

Применение изменений

Для применения изменений необходимо выполнить следующие действия:

# проверим корректность конфигурации после изменений
$ sudo nginx -t

# перезапускаем nginx (Ubuntu)
$ sudo service nginx restart

# перезапускаем nginx (CentOS)
$ sudo systemctl restart nginx

Большой список ip-адресов

В том случае, если список ip-адресов включает в себя сотни или тысячи адресов, лучше воспользоваться:

  • расширением функциональность Nginx скриптом на Lua, который взаимодействует с базой ip-адресов, хранимой в Redis (Ubuntu, Debian, CentOS 7);
  • расширением ipset для iptables, а не инструментами Nginx.