リクエストのリモート アドレスをプロキシされた Go サービスに適切に転送するにはどうすればよいですか?

リクエストのリモート アドレスをプロキシされた Go サービスに適切に転送するにはどうすればよいですか?

Request.RemoteAddr私は標準を使用してリクエストIPアドレスをチェックするシンプルなGoサービスを持っていますnet/http パッケージ

この Go サービスは、次の単純な場所構成で nginx の背後にデプロイされます。

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

当然のことながら、アプリケーションがプロキシの背後にデプロイされると、Request.RemoteAddrlocalhost/server アドレスが返されます (例: ::1)

次のように定義できると思います:

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

しかし、そうするには、Go サービスの変更も必要になります (また、サービスがスタンドアロン サーバーとして展開されている場合は、ヘッダーがクライアントによって変更される可能性があるため、追加のセキュリティ チェックも必要になります)。

リクエストのリモート アドレスを go サービスに渡して、それを返す方法はありますかRequest.RemoteAddr?


補足: この場合、たとえば fastcgi を使用した PHP では、次のようなことができます。

fastcgi_param REMOTE_ADDR $remote_address;

答え1

ウェブ サーバーに正しい構成変更を提案しました。これらのヘッダーは、言語に関係なく、実際の IP アドレスがウェブ サーバーからアプリケーション サーバーに渡される一般的な方法です。これらを またはserverブロックに追加する必要がありますlocation

Goでこのデータを受け取るには、次のようなミドルウェアを使用することができます。プロキシヘッダーgorilla/handlers から、これらのヘッダーの 1 つから IP アドレスが に挿入されますRequest.RemoteAddr。他のアプローチを使用することもできますが、プログラミングに関する質問は Stack Overflow で質問してください。

答え2

関連する Go ライブラリはオープンソースなので、簡単にカスタマイズできないことを確認するのは非常に簡単でしたRequest.RemoteAddr

nginx を削除し、go サービスを example.com/api ではなく api.example.com (プロキシされていない別のパブリック IP アドレス) の下に置くことができます。

関連情報