인바운드 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을 사용합니다.
업스트림 설정
프록시 헤더를 보내는 것만으로 업스트림이 자동으로 해당 정보를 사용하지는 않습니다. 애플리케이션이나 앞단 웹 서버에서도 다음과 같이 설정합니다.
- fn-knock의 연결 주소 또는 네트워크 대역을 신뢰 프록시로 설정합니다.
- 실제로 사용할 프록시 헤더 이름을 지정합니다.
- 외부 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 헤더를 올바르게 처리하는지에 달려 있으므로 배포 후 요청 로그에서 반드시 검증합니다.
