Согласно IETF RFC 2616, раздел 4.2 , заголовок может содержать разделенный запятыми список значений, и это случай X-Forwarded-For
, поскольку Cloudflare использует его .
Если заголовок X-Forwarded-For уже присутствовал в запросе к Cloudflare, Cloudflare добавляет IP-адрес прокси-сервера HTTP к заголовку:
Example: X-Forwarded-For: 203.0.113.1,198.51.100.101,198.51.100.102
ВВ приведенных выше примерах 203.0.113.1 - это исходный IP-адрес посетителя, а 198.51.100.101 и 198.51.100.102 - это IP-адреса прокси-сервера, предоставляемые Cloudflare через заголовок X-Forwarded-For.
Обычновыберите самый левый IP-адрес как реальный, но это не всегда так.
Если вы пойдете этим путем, вы должны проверить регулярное выражение, соответствующее вашему IP-адресу, как
SetEnvIf X-Forwarded-For ^1\.2\.3\.4 allowed
(крайний левый IP-адрес, исключая точки)
Лучший способ (IMHO)
Cloudflare также отправляет заголовок cf-connecting-ip
(который должен быть последним IP-адресом, обратившимся к cloudflare перед отправкой нана вашем компьютере), и я бы лучше использовал его.
Это безопасный подход или есть лучший / более безопасный способ ограничения доступа по IP-адресу клиента в Apache при использовании Cloudflare?
ЕстьподвохВ этом сценарии вы говорите Apache:
"у нас есть cloudflare в середине, поэтому вместо вашего собственного способа сказать IP посетителя давайте посмотрим на этот пользовательский заголовок".
Этот пользовательский заголовок может быть подделан . Абсолютно. Поэтому вы также должны сказать:
«этот пользовательский заголовок следует считать надежным, если и только запрос исходит от Cloudflare IP».
Cloudflareявно перечисляет их диапазоны IP-адресов
Наконец, вы должны использовать mod_remoteip вместо того, чтобы вручную создавать правило SetEnvIf.
В основном:
# /etc/apache2/conf-enabled/remoteip.conf
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 173.245.48.0/20
RemoteIPTrustedProxy 103.21.244.0/22
...
RemoteIPTrustedProxy 2606:4700::/32
RemoteIPTrustedProxy 2803:f800::/32
В качестве альтернативы, поместите список IP в отдельный файл:
# /etc/apache2/conf-enabled/remoteip.conf
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxyList conf/trusted-proxies.lst
и
# conf/trusted-proxies.lst
173.245.48.0/20
103.21.244.0/22
...
...
2803:f800::/32
2606:4700::/32
Если указанный заголовокне приходит в запросе, Apache возвращается к REMOTE_ADDR. То же самое касается запросов от ненадежных IP-адресов. Если заголовок присутствует и поступает из Cloudflare, вы можете просто сделать:
Require ip 1.2.3.4
Этот подход заменяет IP-адрес везде, где вам нужно его использовать (журналы, аутентификация и т. Д.), И постепенно возвращается к исходному REMOTE_ADDR вкрайние случаи.