1. Cloudflare 터널이란 무엇인가
홈서버를 외부에서 접속하려면 일반적으로 공유기에서 포트 포워딩을 설정하고, 공인 IP 또는 DDNS를 연결해야 합니다. 하지만 이 방식은 공유기 설정이 복잡할 수 있고, 외부에 포트를 직접 노출하기 때문에 보안 관리 부담도 커집니다. 특히 가정용 인터넷 환경에서는 유동 IP, CGNAT, 통신사 포트 차단 등의 문제가 발생할 수 있습니다.
Cloudflare Tunnel은 홈서버에서 Cloudflare 네트워크로 “나가는 연결”을 생성하는 방식입니다. 즉, 외부 사용자가 홈 네트워크의 IP 주소나 포트로 직접 접근하는 것이 아니라 Cloudflare를 거쳐 안전하게 내부 서비스에 연결됩니다. 홈서버는 외부에서 들어오는 연결을 기다릴 필요가 없으므로, 공유기 포트 포워딩 없이도 웹 서비스 공개가 가능합니다.
이 방식은 개인 블로그, NAS 웹 관리 페이지, Home Assistant, Vaultwarden, Jellyfin 웹 페이지, 개인 Git 서비스, 대시보드 등 HTTP 또는 HTTPS 기반 서비스에 특히 적합합니다. Cloudflare의 무료 플랜에서도 터널 기능을 사용할 수 있으며, 별도의 고정 IP가 없어도 도메인만 준비되어 있다면 안정적인 주소로 홈서버에 접속할 수 있습니다.
다만 Cloudflare Tunnel은 모든 서비스에 적합한 것은 아닙니다. 기본적으로 웹 트래픽 중심의 서비스에 가장 편리하며, 게임 서버나 일반 TCP/UDP 포트 전체를 공개해야 하는 환경에서는 별도 설정이나 유료 기능, VPN 또는 다른 터널링 방식이 필요할 수 있습니다. 따라서 먼저 외부에 공개하려는 서비스가 웹 브라우저로 접근하는 HTTP/HTTPS 서비스인지 확인하는 것이 좋습니다.
2. 사전 준비: 도메인과 홈서버 환경 구성
Cloudflare Tunnel을 사용하려면 Cloudflare 계정과 도메인이 필요합니다. 무료 도메인보다는 개인이 소유한 일반 도메인을 사용하는 편이 관리와 안정성 측면에서 좋습니다. 도메인을 구매한 뒤 Cloudflare에 사이트를 추가하고, 도메인 등록업체의 네임서버를 Cloudflare에서 안내하는 값으로 변경하면 DNS 관리가 Cloudflare로 넘어갑니다.
홈서버에는 외부로 인터넷 연결이 가능한 환경이 필요합니다. Windows, Linux, Docker, Raspberry Pi, NAS 등 대부분의 운영체제에서 사용할 수 있으며, 일반적으로 Linux 서버나 Docker 환경에서 많이 구성합니다. 홈서버가 인터넷에 직접 공개되지 않아도 되므로 포트 포워딩은 필요하지 않으며, 오히려 기존에 열어 둔 불필요한 포트는 닫는 것이 좋습니다.
터널을 연결하려는 내부 서비스의 주소도 확인해야 합니다. 예를 들어 Home Assistant가 홈서버의 8123 포트에서 실행 중이라면 내부 접속 주소는 http://localhost:8123 또는 http://192.168.0.10:8123과 같은 형태입니다. Docker 컨테이너로 서비스가 실행 중이라면 localhost가 아닌 Docker 네트워크 이름이나 호스트 포트를 사용해야 할 수도 있습니다.
외부 공개 전에는 내부 서비스가 정상적으로 작동하는지 먼저 점검해야 합니다. 홈 네트워크 안에서 http://서버IP:포트번호로 접속했을 때 서비스가 열리지 않는다면 Cloudflare Tunnel을 연결해도 정상 동작하지 않습니다. 또한 서비스 자체에 관리자 계정, 강력한 비밀번호, 최신 버전 적용 여부를 확인해 두는 것이 중요합니다.
3. cloudflared 설치 및 터널 생성
Cloudflare Tunnel은 cloudflared라는 에이전트 프로그램을 통해 연결합니다. Linux 환경에서는 Cloudflare 공식 저장소 또는 패키지 파일을 이용해 설치할 수 있으며, Docker를 사용한다면 cloudflare/cloudflared 이미지를 활용할 수도 있습니다. Ubuntu나 Debian 계열 서버에서는 설치 후 cloudflared --version 명령으로 정상 설치 여부를 확인할 수 있습니다.
터미널에서 다음 명령을 실행하면 Cloudflare 로그인 페이지가 열리거나 URL이 출력됩니다. 해당 링크를 브라우저에서 열고 Cloudflare 계정으로 로그인한 뒤, 연결할 도메인을 선택하면 홈서버와 Cloudflare 계정이 연결됩니다.
cloudflared tunnel login
로그인이 완료되면 터널을 생성합니다. 예를 들어 homeserver라는 이름의 터널을 만들려면 아래와 같이 실행합니다. 명령 실행 후 출력되는 터널 ID는 이후 설정에 사용되므로 기록해 두는 것이 좋습니다.
cloudflared tunnel create homeserver
이제 터널 설정 파일을 작성해야 합니다. 일반적으로 Linux에서는 ~/.cloudflared/config.yml 또는 /etc/cloudflared/config.yml 경로를 사용합니다. 설정 파일에는 터널 ID, 인증 파일 경로, 외부 도메인 이름, 내부 서비스 주소를 입력합니다. 예를 들어 home.example.com을 Home Assistant에 연결하려면 다음과 같이 구성할 수 있습니다.
tunnel: 터널_ID
credentials-file: /home/user/.cloudflared/터널_ID.json
ingress:
- hostname: home.example.com
service: http://localhost:8123
- service: http_status:404
4. DNS 연결과 서비스 외부 공개
설정 파일을 작성한 뒤 Cloudflare DNS에 터널용 레코드를 연결해야 합니다. 명령줄에서 다음과 같이 실행하면 home.example.com 주소가 생성한 터널과 연결됩니다. Cloudflare는 일반적인 A 레코드 대신 터널을 가리키는 CNAME 레코드를 자동으로 생성합니다.
cloudflared tunnel route dns homeserver home.example.com
이제 터널을 직접 실행해 동작을 확인할 수 있습니다. 아래 명령을 실행한 뒤 브라우저에서 https://home.example.com으로 접속해 봅니다. 내부 서비스가 정상적으로 열리면 터널 연결과 DNS 설정이 올바르게 완료된 것입니다.
cloudflared tunnel run homeserver
테스트가 성공했다면 cloudflared를 시스템 서비스로 등록하는 것이 좋습니다. 이렇게 하면 서버를 재부팅해도 터널이 자동으로 실행됩니다. Linux 환경에서는 일반적으로 다음 명령으로 서비스를 설치하고 시작할 수 있으며, 배포판이나 설치 방식에 따라 설정 파일 위치는 조금 달라질 수 있습니다.
sudo cloudflared service install
sudo systemctl enable --now cloudflared
Cloudflare 대시보드에서도 터널 상태를 확인할 수 있습니다. Cloudflare Zero Trust 대시보드의 Networks > Tunnels 메뉴에서 연결 상태가 Healthy 또는 정상 상태인지 확인하면 됩니다. 연결이 끊겼을 때는 홈서버의 인터넷 상태, cloudflared 서비스 상태, 설정 파일의 터널 ID와 인증 파일 경로를 차례대로 점검하는 것이 좋습니다.
5. Cloudflare Access로 로그인 보안 강화하기
터널을 구성했다고 해서 내부 관리 페이지를 누구나 접근할 수 있게 두는 것은 바람직하지 않습니다. Home Assistant, NAS 관리자 페이지, Grafana, Portainer, Vaultwarden 같은 서비스는 외부에 노출될 경우 공격 대상이 될 수 있습니다. 따라서 Cloudflare Access를 사용해 서비스 앞단에 추가 인증 절차를 넣는 것이 좋습니다.
Cloudflare Zero Trust 대시보드에서 Access > Applications 메뉴로 이동한 뒤, Self-hosted 애플리케이션을 추가합니다. 애플리케이션 도메인에는 home.example.com과 같이 터널에 연결한 주소를 입력합니다. 이후 정책을 생성해 특정 이메일 주소만 접속하도록 제한할 수 있습니다.
가장 간단한 정책은 본인의 이메일 주소만 허용하는 방식입니다. 예를 들어 Google, GitHub, Microsoft 계정으로 로그인한 뒤 등록된 이메일이 일치할 때만 접속을 허용하도록 설정할 수 있습니다. 가족 구성원이나 팀원과 함께 사용한다면 허용할 이메일 주소 또는 특정 이메일 도메인을 정책에 추가하면 됩니다.
보안을 더 강화하려면 일회용 PIN 로그인보다 OAuth 로그인, 다중 인증(MFA), 국가 제한, IP 대역 제한 등을 함께 적용할 수 있습니다. 특히 관리자 서비스는 “모든 사용자 허용” 정책을 만들지 말고, 필요한 사용자만 명시적으로 허용하는 방식이 좋습니다. Cloudflare Access는 서비스 자체의 로그인 화면 전에 한 번 더 인증을 요구하므로, 비밀번호 유출이나 무차별 대입 공격에 대한 방어력을 높여 줍니다.
6. 홈서버 자체 보안과 운영 관리
Cloudflare Tunnel을 사용하더라도 홈서버 내부 서비스의 보안 설정은 반드시 유지해야 합니다. Cloudflare Access를 적용했더라도 서비스 자체의 관리자 비밀번호가 약하면 위험할 수 있습니다. 관리자 계정에는 긴 비밀번호와 다중 인증을 적용하고, 기본 계정 이름이나 초기 비밀번호를 그대로 사용하지 않아야 합니다.
가능하다면 서비스가 외부 인터페이스 전체에 바인딩되지 않도록 설정하는 것이 좋습니다. 예를 들어 터널이 같은 서버에서 실행되는 경우 웹 서비스는 127.0.0.1 또는 localhost에서만 수신하도록 구성할 수 있습니다. 이렇게 하면 홈 네트워크 내부의 다른 기기에서도 해당 관리 포트에 쉽게 접근하지 못하도록 제한할 수 있습니다.
정기적인 업데이트도 중요합니다. 운영체제, Docker 이미지, 웹 애플리케이션, cloudflared 모두 보안 취약점이 발견될 수 있으므로 최신 안정 버전으로 유지해야 합니다. 특히 인터넷과 연결되는 서비스는 오래된 버전을 방치하지 말고, 업데이트 전 백업을 만든 뒤 주기적으로 점검하는 습관을 들이는 것이 좋습니다.
마지막으로 로그와 장애 대응 방법을 준비해 두면 운영이 훨씬 편해집니다. systemctl status cloudflared, journalctl -u cloudflared 명령을 이용하면 터널 연결 상태와 오류 로그를 확인할 수 있습니다. 또한 중요한 서비스의 설정 파일, Docker Compose 파일, 인증 정보는 안전한 장소에 백업하고, 터널이 끊겼을 때 내부 서비스 문제인지 DNS 문제인지 Cloudflare 상태 문제인지를 구분해 확인하는 절차를 만들어 두는 것이 좋습니다.