Я регистрирую все посещения моего веб-сайта, такие как дата, запрашиваемый URL и IP-адрес. Сегодня я получил несколько записей с «внутреннего» IP в формате 10.x.x.x. Кто бы это ни был, он получил доступ к нескольким ссылкам на моем сайте, и я не могу сказать, что именно делало это «соединение». Я действительно хочу спросить, «как» они подделали свой IP-адрес, «что», вероятно, было намерением этого «соединения», «как» они получили обратно какие-либо данные с моего сайта, если они используют внутренний IP-адрес? Надеюсь, эти вопросы не слишком расплывчаты.
Спасибо
Поскольку ваш сервер "прокси запросы через nginx в apache" вы можете увидеть внутренний IP-адрес прокси-сервера (хотя обычно вы увидите это во всех запросах), а не IP-адрес клиента.
Если ваш прокси-сервер добавляет заголовок с исходным IP-адресом, а ваше приложение записывает этот заголовок, вам необходимо убедиться, что прокси-сервер действительно заменяет IP-адрес в этом заголовке, если он уже присутствует.
Например, в ситуациях, когда клиент также находится за прокси, который устанавливает тот же заголовок, т.е.
client with internal-IP
\__ client-proxy sets "X-forwarded-for: internal-IP"
\__ (internet)
\__ your nginx proxy passes unmodified "X-forwarded-for: internal-IP"
\__ PHP reads the internal-IP
где вам понадобится:
client with internal-IP
\__ client-proxy sets "X-forwarded-for: internal-IP"
\__ (internet)
\__ your nginx proxy sets a replacement "X-forwarded-for: public-IP-of-client-proxy"
\__ PHP reads the public-IP-of-client-proxy
Также может быть, что nginx добавляет public-IP-of-client-proxy
в существующий заголовок, и вам нужно проверить свой код, чтобы увидеть, как он будет обрабатывать несколько значений.
В ответ на ваш комментарий:
Ваш PHP-код выглядит следующим образом:
function get_ip_address() {
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP) !== false) {
return $ip;
}
}
}
}
}
Этот код проверяет ряд различных (потенциальных) заголовков и вернет первый заголовок, содержащий действительный IP-адрес, и, если таких заголовков нет, он вернет переменную сервера. $_SERVER[REMOTE_ADDR]
который содержит обнаруженный apache IP-адрес клиента.
В случае обратного прокси $_SERVER[REMOTE_ADDR]
всегда будет IP-адресом вашего прокси, поэтому он, вероятно, не скажет вам то, что вы хотите знать.
Довольно распространенная вещь, которую нужно сделать, - это указать вашему обратному прокси-серверу установить заголовок с IP-адресом клиента, обнаруженным прокси.
В вашей конфигурации nginx это будет выглядеть так:
location /some/path/ {
proxy_set_header FORWARDED_FOR $remote_addr;
proxy_pass http://apache.example.com:8000/some/path;
}
Apache с mod_php сделает это доступным как _SERVER[HTTP_FORWARDED_FOR]
заголовок и готово: ваш код определяет правильный удаленный IP-адрес клиента.
За исключением того, что ваш код развалится, если уже установлен другой заголовок, имеющий приоритет в вашем коде. I.E. Когда клиентский запрос с настраиваемым заголовком CLIENT_IP: <some-ip>
анализируется вашим кодом, то есть IP-адресом, который будет обнаружен вашей функцией PHP, вместо фактического IP-адреса клиента.
Проверьте, что происходит, например, с: curl -H "CLIENT_IP: 10.0.0.0" http://yoursite.example.com/
Решение: в вашем коде принимайте только фактический заголовок, который вы установили в nginx, или используйте nginx для отмены или перезаписи всех потенциальных заголовков, которые ищет ваш код.