В случае использования вашего приложения через load balancer или через различные прокси вида Cloudflare задача вывода клиентского IP адреса заключается в правильной выборке header. От X-Real-Ip до CF_CONNECTING_IP или же X-Original-Forwarded-For.
Для этого я написал простую функцию по выборке IP адреса:
func readUserIP(r *http.Request) string {
address := r.Header.Get("X-Original-Forwarded-For")
if address == "" {
address = r.Header.Get("X-Forwarded-For")
}
if address == "" {
address = r.Header.Get("X-Real-Ip")
}
if address == "" {
address = r.RemoteAddr
}
return address
}
Алгоритм прост — мы смотрим на входящие HTTP хедеры и вытаскиваем возможный IP адрес по очереди:
X-Original-Forwarded-For -> X-Forwarded-For -> X-Real-Ip -> r.RemoteAddr