본문으로 건너뛰기
  1. Posts/

역방향 프록시의 TLS termination proxy와 TLS passthrough proxy

·
TLS 서버
작성자
hw5e
page.hw5e.cc
목차

그동안 HTTPS가 적용된 역방향 프록시, 로드밸런서를 다루면서 TLS가 어디까지 적용되는지 궁금했는데 Gitea 문서를 보고 알게 되었다.

주의 사항

  • 아직 내용이 그다지 검증되지 않았음.
  • 이 글은 TLS가 적용된 HTTP 서버 위주로 다룬다.
  • 이 글에서 나오는 프록시는 전부 HTTP 서버와 클라이언트 사이에 있는 역방향 프록시로 그냥 프록시라고 말해도 역방향 프록시를 의미한다.

설명
#

flowchart LR A(클라이언트) <--> B(역방향 프록시 서버) B <--> C(HTTP 서버)
일반적으로 역방향 프록시가 적용된 HTTP 서버는 대략 이런 구조일 것이다.

TLS termination proxy
#

flowchart LR A(클라이언트) <-->|HTTPS| B(프록시) B <-->|HTTP| C(HTTP 서버)

클라이언트와 프록시 서버 사이에는 TLS가 적용되지만 프록시 서버와 HTTP 서버 사이에는 TLS가 적용되지 않게 된다.

서버 프로그램에서 일반적으로 제공하는 HTTP 프록시를 사용하고 HTTPS는 역방향 프록시 서버에 적용시키면 이런 방식이 된다. HTTP 프록시는 프록시 서버가 HTTP 서버의 클라이언트가 되어서 서버에 요청을 하고 받은 것을 다시 클라이언트로 보내는 그런 식이다.

TLS passthrough proxy
#

flowchart LR A(클라이언트) <-->|HTTPS| B(프록시) B <-->|HTTPS| C(HTTP 서버)

프록시 서버는 클라이언트의 패킷을 그대로 서버에 넘기게 되고 통신 전체가 HTTPS 통신으로 진행된다.

서버 프로그램에서 Nginx stream 프록시(간단한 예시)를 사용해서 TCP 패킷을 그대로 HTTP 서버에 전달하게 하고 TLS를 HTTP 서버에다 적용하면 이런 방식이 된다. Caddy는 TCP/UDP 프록시를 기본적으로 지원하지 않는다. layer4 모듈을 사용하면 TCP/UDP 프록시를 사용할 수 있는 것으로 보인다.

두 방식 비교
#

TLS를 termination은 프록시 서버에 passthrough는 HTTP 서버에다가 적용한다.

TLS termination proxy 방식의 경우 프록시 서버와 HTTP 서버 사이에는 패킷이 평문으로 전송되기 때문에 만약 프록시 서버와 HTTP 서버가 다른 곳에 있어서 다른 사람이 접근 가능한 네트워크를 거친다면 보안적인 문제를 일으킬 수 있다.
지금 이 사이트도 서버는 집 인터넷에 있지만 집 인터넷의 IP를 숨기기 위해 오라클 클라우드에 있는 역방향 프록시 서버를 거쳐서 연결되는데, 역방향 프록시를 저런 목적으로 쓰는 경우 termination 방식을 사용하면 프록시 서버와 HTTP 서버 사이에는 암호화 되지 않은 패킷이 돌아다니기 때문에 보안적인 문제가 생길 수 있다.

TCP 프록시를 사용하는 passthrough 방식은 TCP 패킷을 그대로 넘기기 때문에 패킷에 변화를 줄 수 없고 패킷이 암호화 되어있으니 그 내용을 사용할 수 없다. 그래서 HTTP 역방향 프록시에서 주로 사용하는 기능인 캐시, 압축 같은 것은 termination쪽에서만 쓸 수 있는 기능이다.

기타
#

대부분의 역방향 프록시 예제는 프록시 서버와 서버가 같은 시스템에 있는 경우를 다뤄서 이런 문제를 잘 다루지 않은 것으로 보인다

참고
#

https://docs.gitea.com/administration/https-setup
https://stackoverflow.com/questions/38371840/ssl-pass-through-in-nginx-reverse-proxy
https://en.wikipedia.org/wiki/TLS_termination_proxy

Reply by Email