Назад | Перейти на главную страницу

Как мне отклонить все запросы не от cloudflare?

Недавно я получил атаки типа «отказ в обслуживании» от нескольких IP-адресов прокси, поэтому для предотвращения этого я установил cloudflare. Затем я начал замечать, что они обходят облачную вспышку, подключаясь напрямую к IP-адресу сервера и подделывая заголовок хоста.

Каков наиболее эффективный способ вернуть 403 для подключений, которые не относятся к 18 IP-адресам, используемым cloudflare?
Я попытался denyвсе тогда явно allowips облачной вспышки, но это не работает, так как я настроил ее так, чтобы CF-Connecting-IP устанавливает ip allow тесты для.

Я использую nginx 1.6.0.

Как описано здесь, вы можете разрешить IP-адреса только из cloudflare.

https://erichelgeson.github.io/blog/2014/01/18/whitelisting-cloudflare-in-nginx/

# https://www.cloudflare.com/ips
# IPv4
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 104.16.0.0/12;
allow 108.162.192.0/18;
allow 131.0.72.0/22;
allow 141.101.64.0/18;
allow 162.158.0.0/15;
allow 172.64.0.0/13;
allow 173.245.48.0/20;
allow 188.114.96.0/20;
allow 190.93.240.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;

# IPv6
allow 2400:cb00::/32;
allow 2405:b500::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2c0f:f248::/32;
allow 2a06:98c0::/29;

deny all; # deny all remaining ips

Обратите внимание, что вам придется обновлять эту конфигурацию время от времени, поскольку диапазоны IP-адресов Cloudflare могут измениться. Для автогенерации этой конфигурации вы можете использовать этот сценарий

Самый эффективный способ - это аппаратный брандмауэр перед сервером. Или обратитесь к вашему центру обработки данных / вышестоящему провайдеру за помощью в борьбе с атаками.

Блокируйте все, что он на веб-сервере, или iptables может помочь, но по-прежнему использует полосу пропускания и системные ресурсы, поэтому DoS-атаки все еще возможны. Вы хотите заблокировать трафик как можно дальше вверх по течению, чтобы трафик никогда не доходил до вашего сервера и не перенаправлял вашу ссылку на остальной мир. Аппаратный брандмауэр может фильтровать трафик намного быстрее, чем ваш веб-сервер, и не использует серверные ресурсы. Вы захотите, чтобы они разрешили трафик от Cloudflare, а также от вашего офиса или других серверов, когда вам нужно подключиться напрямую.

Также может помочь изменение IP-адреса сервера - только облачный сервер должен знать новый IP-адрес, не публиковать его в общедоступных записях DNS.

Единственное решение, которое я придумал, может быть реализовано с помощью nginx, требует nginx версии 1.9.7 или выше.

Вы можете использовать ngx_http_geo_module чтобы идентифицировать и возвращать ответ 403 для любого IP-адреса, не являющегося IP-адресом Cloudflare.

Используя этот геоблок.

geo $realip_remote_addr $cloudflare_ip {
    default          0;
    103.21.244.0/22  1;
    103.22.200.0/22  1;
    103.31.4.0/22    1;
    104.16.0.0/12    1;
    108.162.192.0/18 1;
    131.0.72.0/22    1;
    141.101.64.0/18  1;
    162.158.0.0/15   1;
    172.64.0.0/13    1;
    173.245.48.0/20  1;
    188.114.96.0/20  1;
    190.93.240.0/20  1;
    197.234.240.0/22 1;
    198.41.128.0/17  1;
    199.27.128.0/21  1;
    2400:cb00::/32   1;
    2405:8100::/32   1;
    2405:b500::/32   1;
    2606:4700::/32   1;
    2803:f800::/32   1;
    2c0f:f248::/32   1;
    2a06:98c0::/29   1;
}

Затем вы можете добавить это в свой серверный блок.

if ($cloudflare_ip != 1) {
    return 403;
}

Что вернет 403 для любых подключений, не исходящих от $cloudflare_ip.

Это работает, потому что я использую $realip_remote_addr в блоке geo, который сохраняет исходный адрес клиента при использовании real_ip_header CF-Connecting-IP.