Nginx IPV6 с CDN и real_ip
Я использую CDN для своего сайта и хочу получить реальный IP клиентов. Мои конфигурации следующие:
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
real_ip_header X-Forwarded-For;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
Раньше конфигурация работала хорошо, но поскольку мой CDN поддерживает IPV6, у меня возникли следующие проблемы.
Я привязал использовать IPV6 для доступа к моему сайту, затем по моему запросу:
remote_addr: 117.34.13.18
http_x_forwarded_for: 2409:890c:530:a849:84b5:3a3b:d0ce:4e5b
realip_remote_addr: 117.34.13.18
proxy_add_x_forwarded_for: 2409:890c:530:a849:84b5:3a3b:d0ce:4e5b, 117.34.13.18
Похоже, что nginx использовал IP CDN как remote_addr, когда nginx получил адрес IPV6.
Тогда я не могу получить RealIp пользователей, если они подключены к IPV6.
Я проверил документ nginx, там сказано, что realip поддерживает IPV6. Есть ли способ получить реальный IP IPV6 клиента?
Я знаю, что могу использовать $ http_x_forwarded_for в качестве IP-адреса клиента, но если клиенты подключаются к моему серверу напрямую, то $ http_x_forwarded_for не будет.
1 ответ
Сегодня со мной произошло то же самое (через 16 месяцев после вашего вопроса). Всякий раз, когда пользователь IPV6 обращался ко мне через Cloudflare, он регистрировал только IP-адрес Cloudflare. Версия nginx, которую я использовал, была довольно старой, поэтому я попробовал новый сервер Debian с nginx 1.14.2, и проблема была решена! Так что, если у кого-то еще есть такая же проблема, попробуйте обновить nginx.