Nginx - разрешение IP-адреса источника

Nginx поддерживает синтаксис allow и deny для ограничения IP-адресов, например. allow 192.168.1.1;. Но если трафик проходит через обратный прокси, IP будет ссылаться на прокси-IP. Итак, как он может быть настроен на белый список конкретного источника IP и запретить все другие входящие запросы?

Ответ 1

remote_addr будет ссылаться на прокси-сервер, но вы можете настроить прокси-сервер для отправки адреса клиента с полями заголовка X-Real-IP/X-Forwarded-For.

В сочетании с модулем ngx_http_realip вы можете изменить входящий заголовок, чтобы использовать реальный адрес клиента для remote_addr. Я считаю, что это будет работать, как ожидалось, с синтаксисом allow/deny.

Просто пояснить - синтаксис allow/deny должен быть идентичным после включения и настройки модуля. Подставьте свой IP-адрес и ваши прокси-адреса ниже.

Back-end nginx разрешить/запретить:

location / {
    allow <your ip>;
    allow 127.0.0.1;
    deny  all;
}

Конфигурация back-end nginx realip:

set_real_ip_from  <your proxy>;
real_ip_header    X-Forwarded-For;

В вашей конфигурации прокси-сервера nginx:

proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

Если у вас несколько промежуточных прокси-серверов, вам нужно включить дополнительные адреса real_ip_recursive и whitelist с помощью директивы set_real_ip_from.

Ответ 2

Я работал со следующей конфигурацией, используя модуль http_geo:

geo $remote_addr $give_access {
    proxy 172.0.0.0/8; # <-- Private IP range here
    default 0;
    11.22.33.44 1; # <-- Allowed IP here
}


server {

    # more config ... 

    location ^~ /secure_url_here {
        if ($give_access = 0) {
          return 403; 
        }
        try_files $uri $uri/ /index.php?$args; # <-- Your directive here
    }
}

Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html