요청 원격 주소를 프록시 Go 서비스로 올바르게 전달하는 방법은 무엇입니까?

요청 원격 주소를 프록시 Go 서비스로 올바르게 전달하는 방법은 무엇입니까?

Request.RemoteAddr표준을 사용하여 요청 IP 주소를 확인하는 간단한 go 서비스가 있습니다.넷/http 패키지.

이 go 서비스는 다음과 같은 간단한 위치 구성을 사용하여 nginx 뒤에 배포됩니다.

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

분명히 애플리케이션이 프록시 뒤에 배포되면 Request.RemoteAddr이제 로컬 호스트/서버 주소(예: ::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에서 해당 헤더 중 하나의 IP 주소를 Request.RemoteAddr. 다른 접근 방식을 사용할 수도 있지만 프로그래밍 관련 질문은 스택 오버플로에서 질문해야 합니다.

답변2

관련 Go 라이브러리는 오픈 소스이기 때문에 아니오, 쉽게 사용자 정의할 가능성이 없다는 것을 확인하는 것은 매우 간단했습니다 Request.RemoteAddr.

nginx를 제거하고 example.com/api 대신 api.example.com(프록시되지 않은 별도의 공용 IP 주소) 아래에 go 서비스를 넣을 수 있습니다.

관련 정보