
У меня есть простой сервис 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.