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,

Другие вопросы по тегам