Битрикс за Cloudflare или DDoS-защитой: не работает авторизация
Почему после подключения DDoS-защиты или Cloudflare в 1С-Битрикс перестаёт работать вход и как вернуть реальный IP посетителя безопасно.
Симптом
После подключения сайта к Cloudflare или другому сервису защиты от DDoS пользователи не могут войти: форма авторизации сбрасывается, сессия теряется, срабатывает проактивная защита.
Причина
Все запросы теперь приходят на сервер с IP-адресов прокси защиты, а не посетителей. Битрикс видит сотни пользователей с одного адреса: срабатывают ограничения по IP, привязка сессии к адресу, блокировки «Стоп-листа».
Решение
Подставить реальный IP посетителя из заголовка, который передаёт прокси. У Cloudflare это CF-Connecting-IP. Добавьте в начало /bitrix/php_interface/dbconn.php (или /local/php_interface/, если подключаете оттуда):
// Реальный IP посетителя за Cloudflare.
// Доверяем заголовку, только если запрос пришёл от самого Cloudflare.
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP']) && isset($_SERVER['REMOTE_ADDR'])) {
$cloudflare = ['173.245.48.0/20', '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22',
'141.101.64.0/18', '108.162.192.0/18', '190.93.240.0/20', '188.114.96.0/20',
'197.234.240.0/22', '198.41.128.0/17', '162.158.0.0/15', '104.16.0.0/13',
'104.24.0.0/14', '172.64.0.0/13', '131.0.72.0/22'];
$ip = ip2long($_SERVER['REMOTE_ADDR']);
foreach ($cloudflare as $range) {
[$net, $bits] = explode('/', $range);
if ($ip !== false && ($ip & ~((1 << (32 - $bits)) - 1)) === ip2long($net)) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];
break;
}
}
}
Проверка диапазонов важна: без неё любой может прислать заголовок CF-Connecting-IP с чужим адресом и обойти блокировки по IP. Актуальный список адресов Cloudflare опубликован на cloudflare.com/ips.
Если сервер на nginx
Ещё надёжнее восстановить IP на уровне веб-сервера модулем real_ip: директивы set_real_ip_from с диапазонами прокси и real_ip_header CF-Connecting-IP;. Тогда правильный адрес увидят и Битрикс, и логи сервера.