Wie leitet man die angeforderte Remote-Adresse ordnungsgemäß an einen geprobten Go-Dienst weiter?

Wie leitet man die angeforderte Remote-Adresse ordnungsgemäß an einen geprobten Go-Dienst weiter?

Ich habe einen einfachen Go-Dienst, der die angeforderte IP-Adresse überprüft, indem er Request.RemoteAddrden Standard verwendetnet/http-Paket.

Dieser Go-Dienst wird hinter nginx mit der folgenden einfachen Standortkonfiguration bereitgestellt:

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

Wenn die Anwendung hinter dem Proxy bereitgestellt wird, Request.RemoteAddrwird jetzt offensichtlich die lokale Host-/Serveradresse zurückgegeben (z. B. ::1) .

Ich weiß, dass ich so etwas definieren könnte:

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

Dies erfordert allerdings auch Änderungen am Go-Dienst (und einige zusätzliche Sicherheitsüberprüfungen, falls der Dienst als eigenständiger Server bereitgestellt wird, da diese Header vom Client geändert werden könnten).

Gibt es eine Möglichkeit, die Remote-Adresse der Anforderung an den Go-Dienst zu übergeben, sodass sie zurückgegeben werden kann Request.RemoteAddr?


Randbemerkung: In PHP mit FastCGI könnte ich in diesem Fall beispielsweise Folgendes tun:

fastcgi_param REMOTE_ADDR $remote_address;

Antwort1

Sie haben die richtigen Konfigurationsänderungen für Ihren Webserver vorgeschlagen. Über diese Header wird die echte IP-Adresse im Allgemeinen vom Webserver an den App-Server weitergegeben, unabhängig von der Sprache. Sie sollten sie zu Ihrem serveroder locationBlock hinzufügen.

Um diese Daten dann in Go zu empfangen, können Sie eine Middleware wie verwendenProxyHeadervon Gorilla/Handlern, das die IP-Adresse aus einem dieser Header in einfügt Request.RemoteAddr. Sie könnten möglicherweise andere Ansätze verwenden, aber Programmierfragen sollten auf Stack Overflow gestellt werden.

Antwort2

Da die entsprechenden Go-Bibliotheken Open Source sind, ließ sich relativ einfach feststellen, dass keine Möglichkeit zur einfachen Anpassung besteht Request.RemoteAddr.

Sie könnten nginx loswerden und Ihren Go-Dienst unter api.example.com (einer separaten öffentlichen IP-Adresse ohne Proxy) statt unter example.com/api platzieren.

verwandte Informationen