<code class="php">$_SERVER['REMOTE_ADDR']</code> устанавливает твой веб сервер, ему вы доверяете. <br/> Но, если пользователь заходит через прокси сервер - то тут будет выходной ip адрес этого прокси. <br/> <br/> Если прокси сервер не скрывает информацию о своих клиентах то <br/> <code class="php">$_SERVER['HTTP_X_FORWARDED_FOR']</code> и <code class="php">$_SERVER['HTTP_CLIENT_IP']</code> должны содержать ожидаемое, но это значит нужно доверять этому прокси серверу. <br/> <br/> Хочешь узнать реальный ip адрес, используй javascript в браузере пользователя (т.е. придется доверять уже пользователю в плане, а отреверсит ли он твой код и не подсунет что угодно). <br/> <br/> Cамый известный и достаточно надежный способ (его сразу отключают любые адекватные анонимизеры) - это WebRTC. Технология позволяет двум браузерам открывать прямое соединение (да еще и udp) друг с другом, а веб сервер только организует процесс. Т.е. подняв соответствующего клиента WebRTC (погугли, правда я для php с ходу готовой библиотеки не нашел) и организовав подключение клиента с этим твоим сервером, который представляется обычным веб клиентом), ты сможешь по тому, с какого ip адреса пришло соответствующее соединение, определить настоящий, даже если пользователь использует прокси. <br/> <br/> Это не защитит от vpn, тут никакими способами определить ip адрес пользователя не получится, потому что с точки зрения сетевых технологий, vpn - это как бы проводок пользовательского компьютера подключили к vpn-серверу, и никакие коммуникации не пойдут иначе, если пользователь не укажет иного (можно настроить маршрутизацию на выход через разные шлюзы в зависимости от геолокации, кстати этим можно воспользоваться, разместив кучу своих серверов в разных локациях и, обращаясь к ним из браузера клиента, сравнивать ip адреса)