콘텐츠로 이동
ProxerProxerv0.13.0

라우팅과 신뢰 프록시

호스트 라우팅, 루트 경로, 서브도메인 경로, forwarded 헤더를 다룹니다.

Proxer는 호스트 기준으로 라우팅합니다. 평범해 보이지만, DNS, TLS, reverse proxy 뒤에 터널을 둘 때 가장 자주 틀리는 부분입니다.

공개 루트 도메인을 지정해 서버를 시작합니다.

proxer server --listen 0.0.0.0:8080 --domain proxy.example.com --token dev-token

--subdomain이 없는 클라이언트는 서버가 할당한 임의 서브도메인을 받습니다.

proxer http 3000 --server wss://proxy.example.com --token dev-token

클라이언트는 https://px-k7m3q9t2ab.proxy.example.com 같은 public URL을 출력합니다. 같은 실행 중 재연결해도 이 할당값을 계속 씁니다.

루트 경로가 필요할 때만 --subdomain @를 사용합니다.

proxer http 3000 --server wss://proxy.example.com --subdomain @ --token dev-token

proxy.example.com 요청은 이 루트 경로 클라이언트로 갑니다. 루트 경로는 서버를 --domain으로 시작했을 때 가장 명확합니다. --domain이 없으면 Proxer는 요청 호스트의 첫 번째 label을 서브도메인 경로로 해석합니다.

--subdomain demo를 지정한 클라이언트는 demo.proxy.example.com을 등록합니다.

proxer http 3000 --server wss://proxy.example.com --subdomain demo --token dev-token

알 수 없는 호스트는 404를 반환합니다. localhost나 IP 주소로 들어온 요청도 연결된 클라이언트로 자동 라우팅되지 않습니다.

DNS 없이 테스트할 때는 호스트 헤더를 직접 보냅니다.

curl -H 'Host: demo.proxy.example.com' http://127.0.0.1:8080/

호스트 헤더가 틀리면 Proxer는 어떤 터널을 의도했는지 알 수 없습니다.

인터넷에 노출하는 서버라면 Caddy, Traefik, NGINX, 로드 밸런서 같은 reverse proxy에서 TLS를 종료하는 구성이 보통입니다. 그 proxy가 HTTP/WebSocket 트래픽을 loopback 또는 사설 네트워크로 Proxer에 넘기게 하세요.

원래 호스트는 유지해야 합니다. Traefik에서는 보통 passHostHeader를 켜둔 기본값이면 됩니다.

그다음 Proxer에 어떤 TCP peer의 forwarded 헤더를 믿을지 알려줍니다.

proxer server \
--listen 0.0.0.0:8080 \
--domain proxy.example.com \
--trusted-proxy loopback \
--trusted-proxy private \
--token "$PROXER_TOKEN"

환경변수 형식은 다음과 같습니다.

PROXER_TRUSTED_PROXIES=loopback,private,10.42.0.0/16 proxer server --domain proxy.example.com

신뢰 프록시 값은 loopback, private, IP literal, CIDR 범위를 사용할 수 있습니다.

peer를 신뢰하면 Proxer는 그 peer가 보낸 X-Forwarded-For, X-Real-IP, X-Forwarded-Host, X-Forwarded-Proto를 사용할 수 있습니다. reverse proxy는 외부 클라이언트가 보낸 X-Forwarded-*X-Real-IP 헤더를 Proxer로 넘기기 전에 반드시 덮어쓰거나 제거해야 합니다. 직접 관리하지 않는 proxy 주소는 신뢰하지 마세요.

신뢰 프록시를 설정하지 않으면 Proxer는 라우팅 판단에 forwarded host, protocol, client IP 헤더를 사용하지 않습니다.

공개 배포에서는 --domain을 설정하세요. 설정하지 않으면 Proxer는 요청 호스트의 첫 번째 label에서 서브도메인 경로를 추출합니다. 로컬 실험에는 쓸 수 있지만, 실제 DNS와 reverse proxy가 들어오면 헷갈리기 쉽습니다.

모든 내부 엔드포인트는 /__proxer__/ 아래에 있습니다.

/__proxer__/control
/__proxer__/health/live
/__proxer__/health/ready

이 경로는 앱으로 보내지 마세요. 공개 Proxer 서버가 앱 라우팅보다 먼저 처리합니다.