CIDR и IP-фильтрация в nginx: allow, deny, geo-блокировка
CIDR — это способ задать диапазон IP-адресов одной записью вместо сотен строк. Объясняем как читать и считать CIDR-маски, и как использовать их в nginx для ограничения доступа к сайту или панели администратора.
Рассчитать CIDR онлайн →Что такое CIDR и как читать /24
CIDR (Classless Inter-Domain Routing) — это запись IP-адреса с префиксом длины маски: 192.168.1.0/24. Число после слэша — количество фиксированных битов (сеть). Оставшиеся биты — диапазон хостов.
| CIDR | Маска | Хостов | Пример диапазона |
|---|---|---|---|
/32 | 255.255.255.255 | 1 | 1.2.3.4 — один адрес |
/31 | 255.255.255.254 | 2 | 1.2.3.4–1.2.3.5 |
/30 | 255.255.255.252 | 2 хоста | 1.2.3.4–1.2.3.7 |
/29 | 255.255.255.248 | 6 хостов | 1.2.3.8–1.2.3.15 |
/28 | 255.255.255.240 | 14 хостов | 16 адресов |
/27 | 255.255.255.224 | 30 хостов | 32 адреса |
/26 | 255.255.255.192 | 62 хоста | 64 адреса |
/25 | 255.255.255.128 | 126 хостов | 128 адресов |
/24 | 255.255.255.0 | 254 хоста | 192.168.1.0–192.168.1.255 |
/16 | 255.255.0.0 | 65534 | 192.168.0.0–192.168.255.255 |
/8 | 255.0.0.0 | 16M+ | 10.0.0.0–10.255.255.255 |
Приватные диапазоны (RFC 1918)
Три зарезервированных диапазона для локальных сетей — их никогда не бывает в публичном интернете:
Если вы видите такой IP в access_log — запрос пришёл через локальную сеть, Docker, или через прокси который сохраняет оригинальный IP.
IP-фильтрация в nginx: базовые директивы
Модуль ngx_http_access_module работает с директивами allow и deny. Nginx проверяет правила сверху вниз, и применяет первое совпадение.
Whitelist — разрешить только свои IP
Blacklist — заблокировать конкретные IP
allow all; перед deny — блокировка не сработает. Всегда: сначала allow для разрешённых, затем deny all в конце.Защита панели администратора (/admin, /wp-admin)
Geo-блокировка: фильтрация по стране
Модуль ngx_http_geo_module (встроен в nginx) + MaxMind GeoIP2 (платная БД) или geoip2 модуль позволяют фильтровать по странам:
Защита от брутфорса: limit_req + IP-фильтрация
Комбинация rate limiting и IP-блокировки для login-страниц:
Реальный IP за прокси и CDN
Если nginx стоит за Cloudflare или другим прокси — $remote_addr будет IP прокси, а не реального пользователя. Нужен модуль real_ip:
allow/deny в nginx будет работать с реальным IP пользователя, а не с IP Cloudflare — и ваши whitelist/blacklist станут эффективными.Примеры типовых задач
Закрыть /api/ для внешних пользователей (только внутренняя сеть)
Разрешить только российские IP (примерные диапазоны)
Часто задаваемые вопросы
Что такое CIDR и зачем он нужен в nginx?
CIDR (Classless Inter-Domain Routing) — способ записать диапазон IP-адресов: 192.168.1.0/24 означает 256 адресов от 192.168.1.0 до 192.168.1.255. В nginx CIDR используется в директивах allow/deny для ограничения доступа по IP-диапазонам — например, разрешить только офисную подсеть или заблокировать вредоносный хостинг.
Как заблокировать все IP кроме своего в nginx?
Добавьте в блок location или server: allow 1.2.3.4; (ваш IP), allow 10.0.0.0/8; (если есть локальная сеть), deny all;. Nginx проверяет правила сверху вниз — первое совпадение побеждает. allow должен быть до deny all.
Как работает /24 и /32 в CIDR?
/32 — ровно один IP-адрес. /24 — 256 адресов (стандартная подсеть). /16 — 65536 адресов. /8 — 16+ млн адресов. Число после / — количество фиксированных битов маски. Чем меньше число, тем шире диапазон.