Tailscale Rverse Proxy

기존에 저는 Cloudflare의 Tunnel을 잘 사용해 왔습니다.

Cloudflare Tunnel의 장점은 설정이 간편하고 별도의 방화벽 포트를 열지 않고도 제가 사용하는 서버 혹은 NAS의 각종 서비스 및 호스팅하고 있는 것들을 쉽게 역방향 프록시 할 수 있다는 점이었습니다.

또한 Cloudflare라는 점에서도 보안에 문제가 없고 전 세계 인프라가 깔린 Cloudflare의 CDN 사용 등 각종 서비스와의 연동도 용이하다는 장점이 있습니다.

Cloudflare Tunnel은 다운로드에 대한 트래픽은 큰 문제가 없지만 업로드가 100MB로 제한되어 있습니다. 심지어 요금을 추가하더라도 가장 비싼 Enterprise의 요금제로도 기본은 500MB가 최대로 되어있습니다. (기업의 경우 계약을 통해서 조절이 가능한 것으로 보임)

일반적인 경우에서 100MB의 제한이 작으냐고 생각해 보았을 때는 적지 않은 제한이라고 생각되긴 합니다. 왜냐하면 Discord의 경우 Nitro 구독을 하지 않는다면 최대 업로드 용량이 25MB이며 Basic을 구독해야 50MB 일반 Nitro가 500MB를 제공합니다. 하지만 카카오톡의 경우 최대 300MB를 지원한다는 점에서 약간 아쉬운 점이 될 수 있습니다.

이 경우 일반적 사용에서는 문제가 되지 않지만, 집에서 NAS나 개인서버를 이용하시는 분들이 NextCloud 혹은 소규모 기업에서 RocketChat, Mattermost와 같은 메신저 서비스를 사용할 경우 대용량 파일을 업로드 할 경우 문제가 발생하게 됩니다.

이 때문에 Reddit 혹은 cloudflare 커뮤니티에도 종종 게시글이 올라오곤 합니다.

그래서 저는 일반적으로, 외부로 노출되어야 하는 블로그 서비스는 Tunnel을 사용하여 호스팅하는 중이며 외부에 노출하지 않으며 안에서 처리해야 하는 일들은 Tailscale을 사용하여 처리하고 있습니다.

이때 외부망이 아닌 사설망이기 때문에 http 연결로만 충분하게 사용할 수 있습니다. 하지만 가끔 https를 요구하는 서비스들이 있어 문제가 발생하곤 합니다.

이때 Tailscale을 사용하신다면 별도의 NPM(Nginx Proxy Manager) 혹은 Traefik을 사용하실 필요 없이 역방향프록시를 바로 이용하실 수 있습니다.

Tailscale server 명령어를 사용하시면 되는데 이때 별로 restart 하지 않아도 바로 적용됩니다.

해당 서비스를 사용하기전 Tailscale Admin Console의 DNS 메뉴에서 MagicDNS와 HTTPS Certificates을 활성화 해주세요
공식 가이드 예시
$ tailscale serve --https=<port> <target> [off]
$ tailscale serve --http=<port> <target> [off]

예시 사용법
$ tailscale serve -bg --https=1234 http://localhost:1234 // 역방향프록시 적용
$ tailscale serve --https=1234 off // 역방향 프록시 삭제

$ tailscale serve tstauts // server 상태 확인
https://<machine name>.<tailnet name>.ts.net:1234 (tailnet only)
|-- / proxy http://localhost:1234

사용 방법은 위와 같으며 localhost:1234에서 사용하는 서비스를 https로 역방향 프록시 할 수 있으며 원하는 포트로 https를 적용할 수 있습니다.

예시에는 -bg라는 옵션이 있는데 공식 가이드에 나온 대로 실행하면 terminal 채로 실행되기 때문에 Background에서 작동하도록 옵션을 추가해 주어야 합니다.

상태를 확인하면 지금은 예시를 위해 주소를 https://.<tailnet name>.ts.net:1234로 해두었지만, 실제 사용 시 사용자분 환경에 맞는 주소가 출력될 것입니다.

다른 장치에서 접속하는 포트는 내부에서 이용하는 포트와 일치 할 필요는 없습니다. 예로는 tailscale serve -bg --https=5678 http://localhost:1234로 해도 가능하다는 이야기입니다.

당연하지만 해당 역방향 프록시는 Tailscale 내부에서만 작동하는 서비스이므로 Tailscale 내부망으로 구성되지 않은 디바이스에서는 접속할 수는 없습니다.

Tailscale Funnel이라는 서비스를 이용하면 일부 가능한 것으로 알고 있는데 아직 사용할 계획이 없어서 별도로 알아보지는 않았습니다.

참조
Tailscale serve command
Tailsclae Enabling HTTPS