Como encaminhar corretamente o endereço remoto da solicitação para um serviço Go com proxy?

Como encaminhar corretamente o endereço remoto da solicitação para um serviço Go com proxy?

Eu tenho um serviço simples que verifica o endereço IP da solicitação usando Request.RemoteAddro padrãopacote net/http.

Este serviço go é implantado atrás do nginx com a seguinte configuração de localização simples:

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

Obviamente, quando o aplicativo é implantado atrás do proxy, Request.RemoteAddragora retorna o endereço localhost/servidor (por exemplo, ::1)

Eu sei que poderia definir algo como:

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

mas isso também exigirá modificações no serviço go (e algumas verificações de segurança adicionais caso o serviço seja implantado como um servidor independente, porque esses cabeçalhos podem ser modificados pelo cliente)

Existe uma maneira de passar o endereço remoto da solicitação para o serviço go, para que ele possa ser retornado por Request.RemoteAddr?


Nota lateral: Em php com fastcgi, neste caso, por exemplo, eu poderia fazer algo como:

fastcgi_param REMOTE_ADDR $remote_address;

Responder1

Você propôs as alterações corretas na configuração do seu servidor web. Esses cabeçalhos são como o endereço IP real geralmente é passado do servidor web para o servidor de aplicativos, independentemente do idioma. Você deve adicioná-los ao seu bloco serverou location.

Então, para receber esses dados em Go, você pode usar um middleware comoCabeçalhos proxyde gorilla/handlers, que inserirá o endereço IP de um desses cabeçalhos em Request.RemoteAddr. Você poderia usar outras abordagens, mas perguntas de programação devem ser feitas no Stack Overflow.

Responder2

Como as bibliotecas Go relevantes são de código aberto, foi bastante simples verificar que não, não há possibilidade de personalizar facilmente o Request.RemoteAddr.

Você pode se livrar do nginx e colocar seu serviço go em api.example.com (um endereço IP público sem proxy separado) em vez de example.com/api.

informação relacionada