홈서버 (재)구축하기 - 5. 웹서버 구성 (2)
DNS로 Cloudflare 쓰니까 리버스 프록시로 Cloudflare Tunnel 설정해보기
Cloudflare Tunnel 소개
Cloudflare Tunnel은 인터넷에서 내부 네트워크에 안전하게 접근할 수 있도록 해주는 솔루션이다. 이를 활용해서 nginx
의 복잡한 설정 없이 간편하고 안전하게 리버스 프록시를 구성할 수 있다.
리버스 프록시 이외에도 임시 연결 생성 등 다양한 기능이 있지만, 이번엔 리버스 프록시만 구성해보겠다.
장점
- SSL 인증서 자동 관리
- IP 변경 대응, 포트 포워딩 불필요
- 이외에도 Cloudflare의 각종 설정과 통합 관리 가능
단점
- Proxy 상태가 되므로 Cloudflare의 Free/Pro 티어 제한 사항에 영향 받음
- 클라이언트와 Cloudflare 간 통신은 국외 리전을 거치므로 RTT가 높음
- 파일 업로드 100MB 제한 등…
- 플랫폼 종속적인 구성
nginx
보다 느린cloudflared
서비스의 재시작 속도
위의 단점이 문제가 되는 서비스를 운영한다면, Cloudflare Tunnel를 사용하지 않고 직접 웹서버를 통해 리버스 프록시를 구성해야한다.
비교
과정을 간단하게 나타낸 그림으로, 실제 환경 및 작동 방식과 차이가 있을 수 있다. (라우터 앞에 방화벽 장비가 있다던가…)
Cloudflare Tunnel을 이용한 리버스 프록시
서버는 밑에서 소개할 cloudflared
를 통해 라우터(=공유기)의 NAT를 통과하여 Cloudflare의 네트워크로 아웃바운드 연결을 만든다. 서버는 클라이언트의 요청을 직접 받는게 아닌, 오직 Cloudflare와 통신만 하는 것이다.
게임으로 비유하자면 상대를 직접 찾아 친구 추가한 뒤 대전을 하는 것이 기존 방식이고, 매칭 시스템에 접속하면 상대를 알아서 찾아주는 것이 CF Tunnel 방식이다. 게임 시작 전 상대가 누군지 알 수 있는지, 없는지 정도의 차이.
cloudflared
cloudflared
는 Cloudflare의 CLI 도구로, 서버가 Cloudflare와 통신하기 위해 사용된다. Cloudflare Tunnel를 사용하려면 필수인 이번 포스팅의 주인공.
Tunnel 이외에도 다양한 기능이 있지만 Tunnel 기능 중 일부만 사용해보겠다. CF 관련 첫 포스트니까…
설치
Cloudflare 공식 저장소의 문서를 참고하여 서술했다.
- Cloudflare의 GPG 키 추가
1 2
$ sudo mkdir -p --mode=0755 /usr/share/keyrings $ curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
- Cloudflare의
apt
저장소 설정1 2
$ echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' | sudo tee /etc/apt/sources.list.d/cloudflared.list $ sudo apt update
cloudflared
설치1
$ sudo apt install cloudflared
로그인
1
$ cloudflared tunnel login
별도의 Key 파일을 받아 설정하지 않았을 경우, Cloudflare의 웹 페이지가 열리며 로그인 창이 뜰 것이다. 내 Cloudflare 계정으로 로그인 한 후 Cloudflare와 연결할 도메인을 선택.
Tunnel 구성
- 생성
1
$ cloudflared tunnel create <터널 이름>
위 명령어로 Tunnel를 생성하면 UUID로 된 이름의
json
파일이 만들어진다. 파일 내용은 볼 일 없고(secret이 있으니 중요하긴 하다), 해당 UUID가 중요하므로 복사를 해놓자. - 도메인 주소와 Tunnel 연결
1
$ cloudflared tunnel route dns <UUID/터널 이름> test.example.com
test.example.com
의 CNAME이<UUID>.cfargotunnel.com
로 변경된다. Cloudflare 내에서 수동으로 설정해줘도 된다. config.yml
작성1 2 3 4 5 6 7 8
tunnel: <UUID> credentials-file: /home/hgsanguk/.cloudflared/<UUID>.json ingress: - hostname: test.example.com # 외부에서 접속할 도메인 service: http://localhost:1010 # 요청을 전달할 서비스 - service: http_status:404
UUID는 아까 나왔던 UUID를 입력. 위의 내용을
~/.cloudflared
에config.yml
라는 이름으로 작성해준다. 추가할 도메인이 더 있다면, ingress 안에 도메인 및 서비스를 추가 작성하고 2번을 실행하면 된다.- Tunnel 실행
1
$ cloudflared tunnel run
터널 상태는 Cloudflare One 대시보드의 네트워크 > Tunnels에서 확인 가능하다.
- 서비스 설정
1
$ sudo cp /home/hgsanguk/.cloudflared/config.yml /etc/cloudflared/config.yml
먼저
config.yml
파일을 cloudflare 경로에 복사한다. (그냥 서비스 등록을 시도할 경우 권한 관련 오류가 발생한다.)1
$ sudo cloudflared --config /etc/cloudflared/config.yml service install
백그라운드에서 실행하기 위해서
cloudflared
를 서비스로 등록한다.
여기까지 왔다면 도메인이 서비스에 잘 연결되었는지 확인해보자.
여러 개의 Tunnel를 만들 경우
config.yml
하나에 Tunnel을 여러 개 작성할 수 없다. Tunnel이 더 필요하다면 다른 이름으로 .yml
파일을 하나 만든 다음, 아래의 명령어로 실행해야한다.
1
$ cloudflared tunnel --config ~/.cloudflared/<파일 이름>.yml run
터널 삭제
1
$ cloudflared tunnel delete <터널 이름>
Tunnel에 연결된 도메인은 변경되지 않으므로 Cloudflare의 DNS 설정에서 직접 지워줘야한다.