본문으로 건너뛰기

인바운드 PROXY Protocol과 업스트림 헤더 ​

게이트웨이는 방향이 반대인 두 종류의 프록시 정보를 처리합니다. 앞단 로드 밸런서는 PROXY Protocol로 실제 연결 주소를 fn-knock에 전달하고, fn-knock는 X-Forwarded-* 헤더를 앱 업스트림에 보냅니다. 두 설정과 신뢰 경계는 별개입니다.

인바운드 PROXY Protocol 수신 ​

HAProxy, Nginx stream 등의 L4 로드 밸런서를 사용할 때 시스템 설정 → 게이트웨이 → PROXY Protocol에서 v1 / v2를 켜고 전송을 허용할 프록시 IP 또는 CIDR을 입력합니다. 방문자 IP가 아니라 TCP 피어 프록시 주소를 입력해야 합니다.

활성화하려면 신뢰 소스가 하나 이상 필요합니다. IP와 CIDR만 허용하며 호스트 이름과 IPv4/IPv6 전체 범위는 거부합니다. 목록의 socket 피어만 PROXY 헤더를 보낼 수 있고, 다른 연결의 위조된 X-Forwarded-For 또는 X-Real-IP는 PROXY 주소를 덮어쓸 수 없습니다.

PROXY Protocol에는 인증이 없습니다. 클라이언트 허용 목록이나 넓은 공인 대역을 재사용하지 말고 고정 사설 프록시 주소와 네트워크 제한을 사용하세요. 관리형 FRP는 필요한 설정을 자동으로 활성화합니다.

저장 시 게이트웨이 설정을 검증하고 트랜잭션으로 적용합니다. 변경 후 외부 경로에서 요청을 보내 요청 로그의 socket 피어와 클라이언트 IP를 확인하세요.

HTTP 프록시 헤더를 업스트림으로 전달 ​

fn-knock가 요청을 리버스 프록시할 때 업스트림 서비스에는 원래 프로토콜, 접속 Host 또는 클라이언트 주소가 필요할 수 있습니다. 시스템 설정 → 게이트웨이 → 프록시 헤더에서는 리버스 프록시 서비스 Host별로 게이트웨이가 업스트림에 X-Forwarded-* 같은 프록시 헤더를 보낼지 설정합니다. 이 항목은 Host 라우트를 사용하는 서브도메인 모드에서만 편집할 수 있습니다. 공인 IP로 직접 연결하는 서브도메인 모드와 리버스 프록시 모드 → 서브도메인 매핑이 여기에 해당하며 경로 모드, 직접 연결 모드 및 정적 파일 또는 디렉터리 응답에는 이 항목이 없습니다. 정적 응답에는 업스트림이 없기 때문입니다.

활성화하면 업스트림 서비스에서 이러한 헤더를 바탕으로 올바른 외부 링크를 생성하고, HTTPS 여부를 판단하고, 클라이언트 주소를 기록하거나 자체 신뢰 프록시를 설정할 수 있습니다. 비활성화하면 애플리케이션에는 일반적으로 fn-knock와 업스트림 사이의 연결 정보만 표시됩니다.

UI에는 리버스 프록시 Host만 표시되지만 런타임에서는 업스트림 Target별로 적용됩니다. 여러 Host가 같은 Target을 재사용할 때 한 Host의 프록시 헤더를 끄면 같은 Target을 사용하는 다른 Host에도 영향을 줍니다. 서로 다른 정책이 필요하다면 각각 다른 Target을 사용합니다.

업스트림 설정 ​

프록시 헤더를 보내는 것만으로 업스트림이 자동으로 해당 정보를 사용하지는 않습니다. 애플리케이션이나 앞단 웹 서버에서도 다음과 같이 설정합니다.

  1. fn-knock의 연결 주소 또는 네트워크 대역을 신뢰 프록시로 설정합니다.
  2. 실제로 사용할 프록시 헤더 이름을 지정합니다.
  3. 외부 URL, HTTPS 판단 및 접근 로그의 클라이언트 IP를 확인합니다.

업스트림이 모든 출발지의 X-Forwarded-For를 신뢰하면 공격자가 fn-knock를 우회해 업스트림에 직접 연결할 때 주소를 위조할 수 있습니다. 업스트림의 수신 범위를 제한하거나 방화벽에서 fn-knock의 접근만 허용합니다.

사용 원칙 ​

  • 업스트림 서비스에 필요하고 헤더를 올바르게 처리할 수 있을 때만 활성화합니다.
  • 업스트림 서비스는 fn-knock에서 보낸 프록시 헤더만 신뢰하도록 구성합니다. 임의의 클라이언트가 위조한 X-Forwarded-For를 받아들이면 안 됩니다.
  • fn-knock 앞단에 CDN, FRP 또는 터널이 있다면 앞단 경로에서 외부 클라이언트가 위조할 수 있는 실제 IP 헤더를 삭제하거나 다시 작성합니다. 그런 다음 요청 로그에서 fn-knock가 식별한 클라이언트 IP를 확인합니다.
  • 변경 후 요청 로그와 업스트림 접근 로그의 Host, 프로토콜 및 클라이언트 IP를 대조합니다.

이 설정은 fn-knock가 업스트림으로 보내는 헤더에만 영향을 줍니다. fn-knock가 인바운드 클라이언트 IP를 식별하는 방식을 결정하지 않으며 신뢰 프록시 목록을 대신할 수도 없습니다. 인바운드 출발지 식별은 앞단 경로에서 실제 IP 헤더를 올바르게 처리하는지에 달려 있으므로 배포 후 요청 로그에서 반드시 검증합니다.

QQ 커뮤니티: 1081609274