ServBay에서 Cloudflare Tunnel을 이용한 안전한 로컬 서비스 노출 가이드
Cloudflare Tunnel(이전 명칭: Argo Tunnel)은 Cloudflare가 제공하는 제로 트러스트 네트워크 서비스로, 복잡한 방화벽 설정이나 포트 개방 없이도 로컬에서 실행 중인 웹 서버, SSH, 기타 애플리케이션을 안전하게 인터넷에 노출할 수 있도록 지원합니다. 본 문서에서는 강력한 로컬 웹 개발 환경인 ServBay에서 cloudflared
클라이언트 도구를 이용해 안전한 터널을 구축하고, 로컬 ServBay 서비스를 외부에서 접근하는 방법을 상세히 안내합니다.
주요 장점:
- 보안 강화: Cloudflare의 글로벌 네트워크 보안(예: DDoS 방어, WAF 등)을 그대로 이용할 수 있습니다.
- 간편한 네트워크 설정: 포트 포워딩, NAT, 방화벽 등 복잡한 설정 과정이 필요 없습니다.
- 제로 트러스트 모델 기반: 연결이 외부로 먼저 열리므로 공격받을 면이 줄어듭니다.
- Cloudflare의 다양한 기능 활용: 캐싱, 최적화, 분석 등 Cloudflare의 서비스를 연동할 수 있습니다.
개요
ServBay는 개발자에게 다양한 언어(PHP, Node.js, Python, Go, Java, Ruby, Rust 등), 데이터베이스(MySQL, PostgreSQL, MongoDB, Redis 등), 웹 서버(Caddy, Nginx, Apache)를 지원하는 통합 및 관리가 쉬운 로컬 개발 환경을 제공합니다. 원래 ServBay에서 개발하는 웹사이트나 앱은 로컬에서만 접근 가능합니다. 하지만 Cloudflare Tunnel을 접목하면 외부 사용자와 팀원들에게 개발 결과물을 쉽게 공유하거나, 특정 상황에서 임시 또는 장기적으로 로컬 서비스를 인터넷에 노출시킬 수 있습니다. 이 모든 과정에서 Cloudflare의 보안·성능 이점을 그대로 누릴 수 있습니다.
기술 원리
Cloudflare Tunnel의 핵심 원리는 ServBay를 실행 중인 로컬 네트워크 기기에서 cloudflared
클라이언트를 작동시켜, 최근접 Cloudflare 엣지 노드로 QUIC 프로토콜을 기반으로 한 하나 이상의 암호화 연결을 능동적으로 맺는 데 있습니다. 이 연결은 모두 외부로 뚫려 있으므로, 라우터나 방화벽에 별도의 인바운드 룰이 필요하지 않습니다. 사용자가 터널에 연결된 도메인으로 접속하면 트래픽은 먼저 Cloudflare 엣지 서버로 전달되며, 이후 미리 연결된 보안 터널을 통해 로컬의 cloudflared
로 전송됩니다. cloudflared
는 이는 다시 ServBay에서 돌고 있는 로컬 서비스(예: https://servbay.local
또는 http://localhost:8000
)로 전달하고, 응답도 동일 경로를 따라 다시 사용자에게 반환됩니다.
환경 준비
본격적인 설정에 앞서 아래 사항을 반드시 준비하세요.
- ServBay 정상 설치 및 실행: ServBay 환경이 구축되어 있고, 노출하려는 로컬 웹/서비스가 실행 중이어야 합니다. 예를 들어, 기본 도메인
servbay.local
로 웹사이트 접근이 가능한 상태여야 합니다. - Cloudflare 계정: Cloudflare 계정이 있어야 합니다.
- Cloudflare에 등록된 도메인: 등록하고자 하는 도메인이 Cloudflare 계정에 추가되어 있고, DNS도 Cloudflare에서 관리되는 상태여야 합니다.
- cloudflared 클라이언트 설치: ServBay가 설치된 macOS에
cloudflared
명령줄 도구가 필요합니다.
1. cloudflared
클라이언트 설치
macOS에서는 Homebrew를 사용하는 설치 방법을 추천합니다. Homebrew가 미설치된 경우, 먼저 공식 문서를 참고하여 설치하세요.
Homebrew 사용 설치(추천)
bash
brew update
brew install cloudflared
1
2
2
수동 다운로드 및 설치(macOS ARM용)
bash
# macOS ARM(Apple Silicon)용 바이너리 파일 다운로드
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-arm64.tgz | tar xz
# 다운받은 파일을 시스템 PATH 폴더로 이동
sudo mv cloudflared /usr/local/bin/
1
2
3
4
2
3
4
설치 확인 설치 완료 후 아래 명령어로 cloudflared
가 정상 설치 및 동작하는지 버전을 확인합니다:
bash
cloudflared --version
# 예시 출력: cloudflared version 2024.5.0 (built 2024-05-01)
1
2
2
버전 번호는 다를 수 있지만, 버전 정보가 출력되면 정상 설치된 것입니다.
2. Cloudflare 계정 로그인
터미널에서 아래 명령어로 Cloudflare 계정을 인증하세요:
bash
cloudflared tunnel login
1
실행 시, 브라우저가 자동으로 열리며 Cloudflare 로그인 및 인증 창으로 이동합니다. 도메인과 연결된 계정을 선택해 cloudflared
에 계정 접근 권한을 부여하세요. 성공 시 인증 완료 메시지가 뜨고, 터미널에도 안내가 나오며 기본 설정 폴더(일반적으로 ~/.cloudflared/
)에 cert.pem
파일이 생성됩니다.
터널 구성 실전
이제 새로운 터널을 만들고, ServBay에서 실행되는 로컬 서비스로 트래픽이 연결되도록 설정해봅니다.
핵심 설정 절차
터널 생성
다음 명령어로 새로운 터널을 생성합니다. 터널 이름은 구분하기 쉬운 것으로 설정할 수 있습니다(예:
servbay-demo-tunnel
).bashcloudflared tunnel create servbay-demo-tunnel
1실행되면 터널 ID(UUID)와
credentials-file
경로가 출력됩니다. 터널 ID(예:a7b8c9d0-e1f2-3a4b-5c6d-7e8f9a0b1c2d
)를 잘 기록해두세요. 또한,~/.cloudflared/
폴더에 인증 정보가 담긴 JSON 파일(예:a7b8c9d0-e1f2-3a4b-5c6d-7e8f9a0b1c2d.json
)이 생성되니, 반드시 안전하게 보관하세요.DNS 레코드 설정
Cloudflare가 특정 도메인의 트래픽을 내 터널로 연결하게 하려면, Cloudflare DNS에 CNAME 레코드를 추가해야 합니다. 이를 편리하게 처리하는 명령어는 다음과 같습니다:
bashcloudflared tunnel route dns servbay-demo-tunnel servbay-demo.yourdomain.com
1servbay-demo-tunnel
은 생성한 터널 이름,servbay-demo.yourdomain.com
은 로컬 서비스 접근에 사용할 서브도메인으로 각각 교체하세요(여기서yourdomain.com
은 Cloudflare에서 운영 중인 도메인이어야 합니다).실행 시, Cloudflare DNS 설정에
servbay-demo.yourdomain.com
항목이<터널ID>.cfargotunnel.com
을 가리키는 CNAME 레코드로 자동 추가됩니다.설정 파일 작성
cloudflared
는 동작 방식(노출할 로컬 서비스, 사용할 도메인 등)을 YAML 설정 파일로 지정할 수 있습니다. 기본 위치는~/.cloudflared/config.yml
입니다. 없으면 새로 생성하세요.~/.cloudflared/config.yml
내용 예시는 다음과 같습니다:yaml# tunnel: 터널 UUID(생성 시 받은 실제 값으로 교체) tunnel: a7b8c9d0-e1f2-3a4b-5c6d-7e8f9a0b1c2d # credentials-file: 인증 파일 경로. 일반적으로 ~/.cloudflared/ 아래 터널 UUID명으로 존재 credentials-file: /Users/yourusername/.cloudflared/a7b8c9d0-e1f2-3a4b-5c6d-7e8f9a0b1c2d.json # 실제 사용자명과 파일 경로로 대체 ingress: # 터널로 들어오는 요청별 매칭 규칙 - hostname: servbay-demo.yourdomain.com # 외부 접근 도메인. DNS 레코드에 지정한 것과 일치해야 함 service: https://servbay.local # ServBay 로컬 서비스 주소(ServBay는 기본적으로 servbay.local 제공 및 SSL 적용). originRequest: # noTLSVerify: true # 로컬 서비스가 자체 서명 인증서(예: ServBay User CA 인증서)를 쓸 때 적용하면 TLS 검증을 건너뜀 # ServBay 사이트가 유효한 인증서(예: Let's Encrypt)를 사용한다면 필요없음. # 개발 편의상 ServBay User CA 인증서 + noTLSVerify: true 활용 빈도가 높음. - service: http_status:404 # 모든 hostname이 매칭되지 않으면 404 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14중요 안내:
tunnel
,credentials-file
의 값은 생성한 UUID와 실제 파일 경로로 정확히 교체해야 합니다.hostname
은 2번 과정에서 추가한 서브도메인(예:servbay-demo.yourdomain.com
)으로 일치시켜야 합니다.service: https://servbay.local
은 기본 웹사이트의 HTTPS 주소입니다. ServBay는servbay.local
도메인에 자체 사설 CA로 발급한 신뢰된 SSL 인증서를 사용합니다. 만약 Node.js 앱 등 다른 포트에서 서비스 중이면(예:http://localhost:3000
), 해당 서비스 주소로 수정하십시오.originRequest.noTLSVerify: true
는 로컬 서비스가 자체 서명 인증서를 사용하는 경우(예: ServBay User CA) 반드시 필요합니다. 이를 지정하지 않으면cloudflared
가 인증서 오류로 인해 로컬 서비스에 연결하지 못할 수 있습니다. 만약 ServBay 웹사이트가 시스템 신뢰 인증서(예: Let's Encrypt)를 쓴다면 이 옵션은 비활성화해도 됩니다.
터널 서비스 실행
설정 파일이 완성되면 이제 cloudflared
터널 서비스를 시작할 수 있습니다. 터미널에서 다음을 실행하세요:
bash
cloudflared tunnel run servbay-demo-tunnel
1
servbay-demo-tunnel
를 실제 만든 터널 이름으로 교체하세요.
cloudflared
가 Cloudflare 네트워크에 연결되어 터널이 활성화됩니다. 연결 및 로그 상태는 터미널에서 실시간 확인할 수 있습니다. 해당 명령이 실행되는 동안 터널은 살아있습니다. 터널을 백그라운드 서비스로 항상 작동하게 하려면 운영체제에 맞게 시스템 서비스로 설정해야 할 수도 있습니다(macOS는 launchctl
활용 등, 이 부분은 문서 범위 밖입니다).
서비스 검증
터널이 성공적으로 시작되면, 지정한 도메인으로 외부에서 내 로컬 ServBay 서비스에 접속할 수 있습니다.
도메인 접속 테스트 브라우저에서 2번 단계에서 설정한 도메인(예:
https://servbay-demo.yourdomain.com
)으로 접속합니다.필수 검증 포인트
- 브라우저에 로컬에서(
https://servbay.local
) 보이던 웹사이트와 동일 화면이 정상 출력되어야 합니다. - 브라우저 주소창에서 유효한 SSL 인증서가 적용된 상태여야 합니다. 해당 인증서는 Cloudflare가 서명한 것으로, 로컬(servbay.local)의 것이 아님을 주의하세요(로컬 인증서는
cloudflared
에서만 활용). - 개발자 도구에서 HTTP 응답 헤더를 검토하면,
CF-RAY
등 Cloudflare 관련 헤더들이 존재하는지 확인해 트래픽이 Cloudflare 네트워크를 경유했는지 알 수 있습니다.
- 브라우저에 로컬에서(
고급 설정 팁
다중 서비스 라우팅
config.yml
의 ingress
에 여러 규칙을 지정하면, 도메인별로 ServBay에서 서로 다른 로컬 서비스(API, 여러 사이트 등)로 트래픽을 분기할 수 있습니다.
yaml
ingress:
- hostname: api.yourdomain.com
service: http://localhost:8080 # 예시: 로컬 8080 포트의 API 서비스
- hostname: app.yourdomain.com
service: https://servbay.local # 메인 웹사이트
- service: http_status:404
1
2
3
4
5
6
2
3
4
5
6
트래픽 모니터링 및 로그
cloudflared
는 터널 감시와 문제 해결을 위한 다양한 명령을 제공합니다.
- 실시간 메트릭 확인:bash
cloudflared tunnel info servbay-demo-tunnel
1 - 상세 로그 확인:
cloudflared tunnel run
명령 실행 시 터미널에 즉시 로그가 출력됩니다. 로그 레벨 조정, 파일 출력 등 세밀한 설정도 가능합니다.
Cloudflare Access 통합
더 강력한 보안을 위해, 터널로 공개되는 서비스에 Cloudflare Access 인증 및 권한 제어를 적용할 수 있습니다. Cloudflare Access는 Cloudflare Zero Trust 플랫폼에 속해있으며 기존 VPN보다 유연하고 정교한 접근 제어 방식을 제공합니다. 이 부분은 Cloudflare Dashboard에서 별도 설정해야 합니다.
문제 해결 가이드
설정 및 사용 중 다음과 같은 대표 오류별 대응법을 정리했습니다.
증상 | 해결 방법 |
---|---|
도메인 접속 시 502 Bad Gateway | 로컬 ServBay 서비스가 정상 작동 중이며, 직접(https://servbay.local 등) 접속도 가능한지 확인하세요.config.yml 의 service 항목 주소, 포트가 정확한지도 체크.로컬 서비스 HTTPS 사용 시 noTLSVerify: true 미설정이라면, 인증서 상태를 확인하거나 옵션 활성화 고려. |
DNS 오류, 도메인 접근 불가 | Cloudflare DNS에서 도메인이 <터널ID>.cfargotunnel.com 을 가리키는 CNAME 레코드로 정확히 등록됐는지 확인. dig , nslookup 등 도구로 DNS 정상 동작 확인. |
접속 시 인증서 에러 | Cloudflare 발급 인증서 오류라면 config.yml 의 hostname 과 방문하는 도메인이 일치하는지 체크.cloudflared 가 로컬 서비스 연결 중 TLS 에러일 경우, service 주소 확인 및 originRequest.noTLSVerify: true 옵션 활성화 검토. |
cloudflared tunnel run 실행 오류 | ~/.cloudflared/config.yml 이 존재하며 형식(YAML)이 올바른지 확인.tunnel , credentials-file 값(UUID 및 파일 경로)이 정확한지 체크.cloudflared 가 인증 및 설정 파일에 접근 권한을 갖는지 점검. |
느린 속도나 끊김, 불안정 | 로컬 네트워크 연결 상태 확인. Cloudflare Tunnel은 QUIC 기반이므로 네트워크 환경이 QUIC 통신을 원활히 처리할 수 있는지 점검. Cloudflare 리전 설정 또는 Cloudflare 지원팀 문의 등 추가 대처. |
솔루션 요약
ServBay와 Cloudflare Tunnel의 통합으로 개발자는 다음과 같은 장점을 얻을 수 있습니다:
- 안전한 결과물 공유: 고객 또는 팀원에게 로컬에서 개발 중인 웹사이트나 앱 데모를 빠르고 안전하게 제공할 수 있습니다.
- 외부 서비스 콜백 테스트: 공개된 접근이 필요한 콜백, 웹훅 등의 개발 및 테스트가 손쉽게 이뤄집니다.
- 엔터프라이즈급 보안 적용: Cloudflare의 DDoS 방어, WAF 등 고급 보안 체계를 로컬 서비스에도 활용할 수 있습니다.
- 간편한 네트워크 관리: 복잡한 포트 포워딩, 방화벽 조작에서 완전히 자유로워집니다.
- Cloudflare 글로벌 네트워크 활용: Anycast 등 글로벌 최적화 네트워크로 빠르고 안정적인 서비스가 가능합니다.
ServBay의 강력한 로컬 개발/실행 환경과 Cloudflare Tunnel의 보안 노출 기능을 조합해, 개발 효율성과 서비스 보안을 동시에 극대화할 수 있습니다.
결론
본 문서는 ServBay 환경에서 cloudflared
설치, Cloudflare Tunnel 생성 및 실행, 외부에서 안전하게 로컬 웹 서비스를 공개하는 방법까지 전 과정을 자세히 소개했습니다. ServBay의 멀티 스택 지원과 Cloudflare Tunnel의 보안 이점을 동시에 활용함으로써 개발 및 협업의 효율성을 대폭 높일 수 있습니다. 아울러, Cloudflare Tunnel은 Cloudflare Zero Trust 플랫폼의 일부이므로, 보다 고급 보안 제어나 인증이 필요한 경우 Cloudflare Access 등 추가 기능도 적극 도입해 보시길 권장합니다.