Nginx 403: access forbidden by rule (allow/deny) — Устранение
Клиент получает ошибку 403 Forbidden при попытке доступа к админ-панели, API или служебным URL. В системном логе /var/log/nginx/error.log фиксируется срабатывание правил безопасности: access forbidden by rule, client: 198.51.100.42, server: admin.example.com, request: "GET /admin HTTP/1.1".
| Директива | Порядок применения | Результат для клиента |
|---|---|---|
allow 10.0.0.0/8; | Проверяется сверху вниз | Разрешает доступ указанной подсети |
deny all; | Финальное правило | Блокирует всех клиентов, не попавших в allow (код 403) |
set_real_ip_from | Модуль Real IP | Определяет реальный IP клиента за CDN/Load Balancer |
- Администратор не может попасть в защищенный раздел сайта при смене своего IP или подключении через VPN.
- При работе через Cloudflare все запросы блокируются, так как Nginx видит IP-адрес прокси Cloudflare вместо оригинального IP клиента.
- Найдите блокирующие директивы
denyв конфигурации Nginx:grep -rn "deny" /etc/nginx/ - Добавьте ваш актуальный публичный IP-адрес или офисную подсеть перед директивой
deny all;:location /admin/ { # Разрешенные IP-адреса: allow 198.51.100.42; allow 203.0.113.0/24; # Запретить всем остальным: deny all; proxy_pass http://backend; } - Если сайт работает через CDN / Cloudflare / WAF, обязательно настройте модуль
ngx_http_realip_module, чтобы директивыallow/denyпроверяли реальный IP посетителя:# В блоке http: set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; # (добавьте все диапазоны Cloudflare) real_ip_header CF-Connecting-IP; # или X-Forwarded-For real_ip_recursive on; - Проверьте конфигурацию на ошибки и выполните перезагрузку:
sudo nginx -t sudo systemctl reload nginx
ngx_http_access_module проверяются строго в порядке их объявления до первого совпадения. Если поместить deny all; перед allow <IP>;, доступ будет закрыт абсолютно для всех без исключения!Частые вопросы (FAQ)
Как разрешить доступ только локальному серверу?
Используйте комбинацию: allow 127.0.0.1; allow ::1; deny all; внутри целевого блока location.
Почему allow не работает при проксировании через HAProxy / Nginx Ingress?
Без настройки модуля real_ip Nginx видит IP-адрес балансировщика, а не клиента. Настройте директивы set_real_ip_from и real_ip_header X-Forwarded-For.
Можно ли вернуть 404 Not Found вместо 403 при срабатывании deny all?
Да, для скрытия существования админки используйте директиву error_page 403 =404 /404.html; внутри защищаемого location.
Как заблокировать доступ к скрытым файлам (.git, .env) во всех сайтах?
Добавьте в server блок: location ~ /\. { deny all; access_log off; log_not_found off; }.