진행 중 실제 IP 획득

일반적인 상황 에서 ingress 의 요청 을 통 해 header X-Real-IP 를 휴대 하고 사용 자 는 header 에 따라 실제 방문 IP 를 분석 할 수 있 습 니 다.
특수 한 상황 에서 사용자 요청 은 여러 nginx 를 거 쳐 ingress 에 도달 할 수 있 습 니 다. 상기 방법 을 통 해 얻 은 것 은 사용자 의 실제 IP 가 아 닙 니 다.
request->nginx->…->ingress->backend
프로젝트 1 use - forward - headers
nginx - ingress 공식 제안 은 use - forward - headers 를 시작 하 는 것 입 니 다. 설정 은 다음 과 같 습 니 다.
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
data:
  compute-full-forwarded-for: 'true'
  use-forwarded-headers: 'true'

방안 2
이런 방식 은 확실히 작용 할 수 있 지만 사용자 피드백 이 켜 진 후에 ingres 백 엔 드 서 비 스 를 방문 하여 계속 보고 308 했 고 ingress 의 코드 가 켜 진 것 use-forwarded-headers 을 검사 한 후에 동시에 켜 진 것 ssl-redirect 으로 인해 308 이 발생 했다.
그러면 저 희 는 nginx 설정 에 있 는 real - ip 설정 을 켜 야 합 니 다. 다음 과 같이 http-snippet 에 추가 real_ip_header X-Forwarded-For; 합 니 다.
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
data:
  http-snippet: |
    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;

golang 에서 실제 ip 가 져 오기
func RemoteIP(r *http.Request) string {
	ip := strings.TrimSpace(strings.Split(r.Header.Get("X-Original-Forwarded-For"), ",")[0])
	if ip != "" {
		return ip
	}

	ip = strings.TrimSpace(strings.Split(r.Header.Get("X-Forwarded-For"), ",")[0])
	if ip != "" {
		return ip
	}

	ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
	if ip != "" {
		return ip
	}

	if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
		return ip
	}

	return ""
}

주의 사항
nginx - ingress configmap 의 설정 은 전역 적 으로 유효 하 며, 출시 전에 엄격 한 테스트 가 필요 합 니 다.

좋은 웹페이지 즐겨찾기