Как правильно переслать удаленный адрес запроса на проксируемый сервис Go?

Как правильно переслать удаленный адрес запроса на проксируемый сервис Go?

У меня есть простой сервис go, который проверяет IP-адрес запроса, используя Request.RemoteAddrстандартныйпакет net/http.

Этот сервис go развернут на базе nginx со следующей простой конфигурацией местоположения:

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

Очевидно, что когда приложение развернуто за прокси-сервером, Request.RemoteAddrтеперь возвращается адрес localhost/сервера (например, ::1)

Я знаю, что могу определить что-то вроде:

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

но это также потребует внесения изменений в службу go (и некоторых дополнительных проверок безопасности в случае, если служба развернута как автономный сервер, поскольку эти заголовки могут быть изменены клиентом)

Есть ли способ передать удаленный адрес запроса в службу go, чтобы она могла его вернуть Request.RemoteAddr?


Примечание: в php с fastcgi в этом случае, например, я мог бы сделать что-то вроде:

fastcgi_param REMOTE_ADDR $remote_address;

решение1

Вы предложили правильные изменения конфигурации вашего веб-сервера. Эти заголовки — это то, как реальный IP-адрес обычно передается с веб-сервера на сервер приложений, независимо от языка. Вы должны добавить их в свой serverили locationблок.

Затем, чтобы получить эти данные в Go, вы можете использовать промежуточное программное обеспечение, такое какProxyHeadersиз gorilla/handlers, который вставит IP-адрес из одного из этих заголовков в Request.RemoteAddr. Вы, возможно, можете использовать другие подходы, но вопросы по программированию следует задавать на Stack Overflow.

решение2

Поскольку соответствующие библиотеки Go имеют открытый исходный код, было довольно просто проверить, что нет возможности легко настроить Request.RemoteAddr.

Вы можете избавиться от nginx и разместить свой сервис go на api.example.com (отдельный непроксированный публичный IP-адрес) вместо example.com/api.

Связанный контент