Назад | Перейти на главную страницу

В журналах моего веб-сайта появился внутренний IP-адрес

Я регистрирую все посещения моего веб-сайта, такие как дата, запрашиваемый 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 для отмены или перезаписи всех потенциальных заголовков, которые ищет ваш код.