nginx allow|deny $realip_remote_addr
Используя nginx, вы можете разрешить и запретить диапазоны и ips ( https://www.nginx.com/resources/admin-guide/restricting-access/). Используя модуль realip, вы можете изменить IP-адрес, который он использует, на реальный IP после cloudflare. ( http://nginx.org/en/docs/http/ngx_http_realip_module.html)
Теперь вот что, я хочу занести в черный список любой ip, который не является Cloudflare или localhost. Это довольно сложно, я попытался поставить его перед настройкой модуля real_ip, а не сигары.
Это вообще возможно? Это выглядит как недостаток, если пользователь не проходит через cloudflare, он допускает гораздо больше злоупотреблений в отношении определенного vhost.
Существует переменная $ realip_remote_addr, но я не могу найти способ заставить использовать / запретить использование вместо обычного $ remote_addr.
Изменить: Это было доведено до моего сведения, брандмауэр может помочь в этом. К сожалению, я действительно нуждаюсь в этом только для нескольких vhosts.
3 ответа
Такая простота позволяет делать большие вещи.
Умнее использовать $realip_remote_addr == $remote_addr
так как $http_*
может быть подделан клиентом, отправляющим такие запросы. (Указал мне друг)
РЕДАКТИРОВАТЬ: Хорошо, так что с учетом вышесказанного, для этого лучше всего использовать модуль Lua.
Нечто похожее на ниже.
access_by_lua_block {
if ngx.var.remote_addr == ngx.var.realip_remote_addr then
return ngx.redirect("http://somewhere.else.please/");
end
}
Вы можете сделать это легко с геоблоком
geo $realip_remote_addr $giveaccess {
default 0;
IPBLOCK1 1;
IPBLOCK2 1;
…
}
server {
…
location / {
if ($giveaccess = 0){
return 403 "$realip_remote_addr";
#use it for debug
}
}
Я думаю, что вы хотите заблокировать прямой доступ к вашей машине, т.е. через ip вашей машины.
Для этого вы можете использовать http-заголовок, установленный cloudflare. Всякий раз, когда есть запрос через cloudflare, он устанавливает $http_cf_connecting_ip
на IP-адрес машины, доступ к вашей машине.
Таким образом, вы можете написать условие, чтобы отклонить все запросы, которые имеют пустой $http_cf_connecting_ip
,