Поиск IP-адреса клиента, подключенного через прокси-сервер

Есть ли способ собирать IP-адрес клиента, подключенного к вашему веб-сайту, через прокси-сервер?

Вся настройка – это внутренняя локальная сеть и через sysadmin, у меня есть контроль над прокси-машиной. Я использую PHP5 для сервера сайта.

Я пробовал $_SERVER['REMOTE_ADDR'] в PHP, но эта переменная просто хранит IP-адрес прокси-сервера.

Есть идеи?

Стандартное решение (в php):

 if ($_SERVER['HTTP_X_FORWARDED_FOR']){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else{ $ip = $_SERVER['REMOTE_ADDR']; } 

Но, как говорится в первом ответе, все это зависит от того, какой заголовок действительно установлен.

Это зависит от прокси. Некоторые прокси добавляют заголовок, который дает исходный IP-адрес, заголовок X-Forwarded-For, но при условии, что большинство компаний используют прокси, чтобы скрыть внутреннюю структуру сети, которая редко встречается. Если это так, то вы не сможете сделать это легко.

Если у вас есть контроль над прокси-сервером, пришло время прочитать документацию прокси, чтобы узнать, как добавить этот заголовок.

X-Forwarded-For – единственный способ получить IP-адрес клиента. Проверьте, есть ли способ включить это в свой прокси-сервер.

На каком-то прокси-сервере он дает вам возможность обрабатывать существующий заголовок XFF (когда запрос проходит через несколько прокси-серверов). Вот что вам нужно учитывать,

  1. Если адрес клиента предназначен для целей безопасности / доверия (например, ACL или ограничение скорости), существующий заголовок XFF должен быть сброшен прокси.
  2. Если адрес предназначен только для информации (регистрация, отладка), вы должны добавить адрес одноранговой сети в существующий XFF, разделенный запятой. Первым IP-адресом в списке будет IP-адрес клиента.

Этот код можно использовать для получения IP-адреса клиента, который подключается через прокси-сервер.

  public static String getClientIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } 

Но он обнаруживает только тогда, когда прокси прозрачен.

Ниже приведена информация о HTTP-прокси:

  1. Не использовать прокси-сервер:

    • request.getRemoteAddr() = IP-адрес клиента
    • request.getHeader("HTTP_X_FORWARDED_FOR") = Нет значения или Нет отображения
  2. Использовать прозрачные прокси:

    • HTTP_X_FORWARDED_FOR = Реальный IP-адрес клиента
  3. Использовать обычные анонимные прокси:

    • request.getRemoteAddr() = IP-адрес прокси-сервера
    • HTTP_X_FORWARDED_FOR = IP-адрес прокси-сервера