nginx · CIDR · Сетевая безопасность

CIDR и IP-фильтрация в nginx: allow, deny, geo-блокировка

CIDR — это способ задать диапазон IP-адресов одной записью вместо сотен строк. Объясняем как читать и считать CIDR-маски, и как использовать их в nginx для ограничения доступа к сайту или панели администратора.

Рассчитать CIDR онлайн →
Калькулятор: CIDR Calculator AuditGuard покажет сетевой адрес, маску, широковещательный адрес и диапазон хостов для любой CIDR-записи.

Что такое CIDR и как читать /24

CIDR (Classless Inter-Domain Routing) — это запись IP-адреса с префиксом длины маски: 192.168.1.0/24. Число после слэша — количество фиксированных битов (сеть). Оставшиеся биты — диапазон хостов.

CIDRМаскаХостовПример диапазона
/32255.255.255.25511.2.3.4 — один адрес
/31255.255.255.25421.2.3.4–1.2.3.5
/30255.255.255.2522 хоста1.2.3.4–1.2.3.7
/29255.255.255.2486 хостов1.2.3.8–1.2.3.15
/28255.255.255.24014 хостов16 адресов
/27255.255.255.22430 хостов32 адреса
/26255.255.255.19262 хоста64 адреса
/25255.255.255.128126 хостов128 адресов
/24255.255.255.0254 хоста192.168.1.0–192.168.1.255
/16255.255.0.065534192.168.0.0–192.168.255.255
/8255.0.0.016M+10.0.0.0–10.255.255.255

Приватные диапазоны (RFC 1918)

Три зарезервированных диапазона для локальных сетей — их никогда не бывает в публичном интернете:

10.0.0.0/8 # Класс A — 16 млн адресов 172.16.0.0/12 # Класс B — 1 млн адресов 192.168.0.0/16 # Класс C — 65536 адресов

Если вы видите такой IP в access_log — запрос пришёл через локальную сеть, Docker, или через прокси который сохраняет оригинальный IP.

IP-фильтрация в nginx: базовые директивы

Модуль ngx_http_access_module работает с директивами allow и deny. Nginx проверяет правила сверху вниз, и применяет первое совпадение.

Whitelist — разрешить только свои IP

location /admin/ { allow 1.2.3.4; # конкретный IP офиса allow 192.168.10.0/24; # вся офисная подсеть allow 127.0.0.1; # localhost deny all; # все остальные — 403 }

Blacklist — заблокировать конкретные IP

location / { deny 185.220.101.0/24; # известная TOR exit node подсеть deny 45.155.205.0/24; # вредоносная подсеть allow all; }
⚠️ Порядок критически важен: если написать allow all; перед deny — блокировка не сработает. Всегда: сначала allow для разрешённых, затем deny all в конце.

Защита панели администратора (/admin, /wp-admin)

location ~* ^/(admin|wp-admin|phpmyadmin|bitrix) { allow 1.2.3.0/24; # офисный диапазон allow 5.6.7.8; # IP удалённого разработчика deny all; # Далее — остальная конфигурация proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; }

Geo-блокировка: фильтрация по стране

Модуль ngx_http_geo_module (встроен в nginx) + MaxMind GeoIP2 (платная БД) или geoip2 модуль позволяют фильтровать по странам:

# В http блоке: geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb { $geoip2_country_code country iso_code; } map $geoip2_country_code $allowed_country { default 0; RU 1; BY 1; KZ 1; } # В server/location блоке: if ($allowed_country = 0) { return 403; }
Альтернатива без MaxMind: используйте готовые CIDR-списки по странам от ipinfo.io или db-ip.com в формате nginx include-файлов. Обновляются ежемесячно.

Защита от брутфорса: limit_req + IP-фильтрация

Комбинация rate limiting и IP-блокировки для login-страниц:

# В http блоке: limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # В server блоке: location /login { # Разрешить только известные офисные подсети allow 1.2.3.0/24; deny all; # Rate limiting для разрешённых limit_req zone=login burst=3 nodelay; limit_req_status 429; proxy_pass http://127.0.0.1:8080; }

Реальный IP за прокси и CDN

Если nginx стоит за Cloudflare или другим прокси — $remote_addr будет IP прокси, а не реального пользователя. Нужен модуль real_ip:

# Диапазоны Cloudflare (обновляйте периодически) set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/13; set_real_ip_from 104.24.0.0/14; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; # IPv6 Cloudflare set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2a06:98c0::/29; set_real_ip_from 2c0f:f248::/32; real_ip_header CF-Connecting-IP;
⚠️ После этой настройки allow/deny в nginx будет работать с реальным IP пользователя, а не с IP Cloudflare — и ваши whitelist/blacklist станут эффективными.

Примеры типовых задач

Закрыть /api/ для внешних пользователей (только внутренняя сеть)

location /api/internal/ { allow 10.0.0.0/8; allow 172.16.0.0/12; allow 192.168.0.0/16; allow 127.0.0.1; deny all; }

Разрешить только российские IP (примерные диапазоны)

# Крупные российские ISP CIDR (неполный список) allow 2.92.0.0/14; # Ростелеком allow 5.188.0.0/16; # Регионы allow 31.163.0.0/16; # Билайн allow 37.29.0.0/16; # МТС allow 46.61.0.0/16; # Билайн allow 77.37.0.0/16; # Ростелеком allow 95.27.0.0/16; # Ростелеком deny all; # ВАЖНО: это иллюстрация — для реальной geo-блокировки используйте GeoIP
Открыть CIDR Calculator →

Часто задаваемые вопросы

Что такое 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+ млн адресов. Число после / — количество фиксированных битов маски. Чем меньше число, тем шире диапазон.