
Ich habe einen einfachen Go-Dienst, der die angeforderte IP-Adresse überprüft, indem er Request.RemoteAddr
den 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.RemoteAddr
wird 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 server
oder location
Block 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.