¿Cómo reenviar correctamente la dirección remota de solicitud a un servicio Go proxy?

¿Cómo reenviar correctamente la dirección remota de solicitud a un servicio Go proxy?

Tengo un servicio simple que verifica la dirección IP solicitada usando Request.RemoteAddrel estándarpaquete net/http.

Este servicio go se implementa detrás de nginx con la siguiente configuración de ubicación simple:

location /api {
    proxy_pass http://localhost:8080;
}

Obviamente, cuando la aplicación se implementa detrás del proxy, Request.RemoteAddrahora devuelve la dirección del servidor/host local (por ejemplo ::1) .

Sé que podría definir algo como:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

pero hacerlo también requerirá modificaciones en el servicio go (y algunas comprobaciones de seguridad adicionales en caso de que el servicio se implemente como un servidor independiente porque el cliente podría modificar esos encabezados)

¿Hay alguna manera de pasar la dirección remota de solicitud al servicio go, para que pueda ser devuelta Request.RemoteAddr?


Nota al margen: en php con fastcgi en este caso, por ejemplo, podría hacer algo como:

fastcgi_param REMOTE_ADDR $remote_address;

Respuesta1

Ha propuesto los cambios de configuración correctos en su servidor web. Estos encabezados son la forma en que generalmente se pasa la dirección IP real desde el servidor web al servidor de aplicaciones, independientemente del idioma. Debes agregarlos a tu servero locationbloquear.

Luego, para recibir estos datos en Go, puede utilizar un middleware comoEncabezados de proxyde gorilla/handlers, que insertará la dirección IP de uno de esos encabezados en Request.RemoteAddr. Posiblemente podría utilizar otros enfoques, pero las preguntas de programación deben formularse en Stack Overflow.

Respuesta2

Dado que las bibliotecas Go relevantes son de código abierto, fue bastante sencillo comprobar que no, que no hay posibilidad de personalizarlas fácilmente Request.RemoteAddr.

Puede deshacerse de nginx y colocar su servicio go en api.example.com (una dirección IP pública independiente sin proxy) en lugar de example.com/api.

información relacionada