Yıllar sonra konuyu tekrar uyandırmış olacağım. Paylaştığınız kod işime yaramışken güncel php sürümüne göre dahada iyi hale getireyim dedim.
Artıları:
Özel ve rezervli IP filtreleri kullanıldı. (FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE).
$_SERVER değişkeni şuanda, getenv() yerine daha güvenlidir.

Dikkat: Eğer Cloudflare kullanıyorsanız HTTP_CF_CONNECTING_IP kullanmanız gerekiyor.

function GetSecureIP() {
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP)) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        foreach ($ips as $ip) {
            $ip = trim($ip);
            if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                return $ip;
            }
        }
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : 'UNKNOWN';
}