Intro#
지난 글에 이어서, 내 홈서버에 어디서든 접속할 수 있게 설정하려고 한다.
설정의 정확한 목적은 다음과 같다
- 누구나 내 홈서버에서 실행되는 웹 서버에 접근할 수 있어야 한다. (:8080)
- 오직 나만이 홈서버에 SSH로 연결할 수 있어야 한다.
보통 공유기 포트포워딩을 통해 외부 접속을 해결하고 ssh는 인증으로 막지만, Cloudflare Tunnel을 사용해 포트포워딩 없이 목적을 안전하게 달성할 수 있다.
Cloudflare에 등록된 도메인만 있으면 된다.
Cloudflare Tunnel이란?#

Cloudflare Tunnel은 내 서버를 직접 인터넷에 노출하지 않고, Cloudflare를 통해 외부에서 접근할 수 있게 해주는 기능이다. 공유기를 사용해 포트포워딩하면 외부 사용자가 내 집 공인 IP(공유기)의 인바운드 포트로 직접 들어오게 되지만, Tunnel을 사용하면 리소스(홈서버)에 설치된 cloudflared가 Cloudflare로 연결을 만들고 외부 사용자는 Cloudflare를 통해 리소스로 요청을 전달하게 된다. 공식문서
공유기에서 인바운드 포트를 열지 않고도 Cloudflare를 통해서 외부에서 웹서버던 SSH던 접근할 수 있다.
설정#
Tunnels#
Dashboard에 tunnels를 검색하고, Zero Trust > Network > Tunnels로 들어간다. 처음 들어갔다면 Cloudflare One 가입 화면이 뜨는데, 무료 플랜으로 가입하면 된다.
Create a tunnel 버튼을 누르고, Cloudflared를 선택한 후 이름만 지어주면 된다.

Connector#
Connector에서는 터널에 붙는 운영체제만 명시해주면 Cloudflare가 알아서 명령어까지 전부 알려주는데, 서버에서 이를 실행하면 된다. 완료되면 Tunnel 대시보드에 Connector가 표시된다.


Published application routes#
앞서 만든 Tunnels를 Cloudflare 도메인에 연결한다. 도메인을 Connector가 설치된 호스트의 특정 서비스에 연결한다고 생각하자.
나는 외부에서 HTTP와 SSH로 접근하기 위해 홈서버의 http://localhost:8080과 ssh://localhost:22를 각각 다른 도메인에 매핑했다.

접속 확인#
웹 서버#
웹 서버는 이제 전 세계 어디에서나 브라우저로 접근할 수 있다. Ubuntu엔 기본적으로 파이썬이 있으니 python3 -m http.server 8080로 임시로 서버를 키고 테스트해보자.
SSH#
SSH는 로컬 SSH에서 cloudflared를 프록시로 사용해 접속한다.
ssh -o ProxyCommand="cloudflared access ssh --hostname %h" 리눅스유저@ssh도메인맥에서 cloudflared 설치하기
brew install cloudflared 한 줄로 간단히 설치가 가능하다.
Access Control#
지금은 내 홈서버의 SSH에 누구나 접속을 시도할 수 있다. 물론 인증 정보는 나만 알고 있으니 실제로 침입은 불가능하겠지만, 접속 시도가 가능하다는 점이 마음에 들지 않는다. 이럴 때 Cloudflare Access를 사용해 인증되지 않은 사용자의 SSH 접속 시도 자체를 막을 수 있다.
Access Control > Applications에서 내 SSH의 도메인을 등록하면, 여기에 IP 기반, 이메일 인증, 토큰 등 다양한 Access policy를 붙일 수 있다.

어차피 SSH는 나만 사용할 예정이므로 가장 간단한 이메일 인증 방식을 선택했다. Policy를 붙이면 이제 SSH 접속을 시도할 때 브라우저 창이 열리고 이메일 인증을 하게 되고, 이를 마치면 드디어 터미널에서 SSH로 접속할 수 있다.

Final#
Cloudflare는 정말 무료 플랜 혜택이 어마어마한 것 같다. 이전에도 R2, Proxy, Functions 등을 잘 활용하고 있었는데, Tunnel까지 구축해보니 더욱 실감이 난다. 물론 우리나라에서 사용할 땐 무조건 해외를 경유해 속도가 떨어지는 이슈가 있지만1, 이런 기능을 제공해주는 것만으로도 너무 만족스럽다.
3-point#
- Cloudflare를 통해 외부 접속 환경까지 전부 설정했다.
- 이제 홈서버 구축은 끝나고 가지고 놀 일만 남았다.
- Cloudflare는 신이다.
Cloudflare는 서울 리전도 운영하지만, 국내 통신사들의 망사용료가 너무 비싸서 Cloudflare Enterprise Plan이 아니면 외국을 경우한다. 내가 이전에 Cloudflare CDN을 테스트해본결과 LA로 잡혔다. ↩︎