포스트

홈서버 (재)구축하기 - 5. 웹서버 구성 (2)

DNS로 Cloudflare 쓰니까 리버스 프록시로 Cloudflare Tunnel 설정해보기

홈서버 (재)구축하기 - 5. 웹서버 구성 (2)

Cloudflare Tunnel 소개

Cloudflare Tunnel은 인터넷에서 내부 네트워크에 안전하게 접근할 수 있도록 해주는 솔루션이다. 이를 활용해서 nginx의 복잡한 설정 없이 간편하고 안전하게 리버스 프록시를 구성할 수 있다.

리버스 프록시 이외에도 임시 연결 생성 등 다양한 기능이 있지만, 이번엔 리버스 프록시만 구성해보겠다.

장점

  • SSL 인증서 자동 관리
  • IP 변경 대응, 포트 포워딩 불필요
  • 이외에도 Cloudflare의 각종 설정과 통합 관리 가능

단점

  • Proxy 상태가 되므로 Cloudflare의 Free/Pro 티어 제한 사항에 영향 받음
    • 클라이언트와 Cloudflare 간 통신은 국외 리전을 거치므로 RTT가 높음
    • 파일 업로드 100MB 제한 등…
  • 플랫폼 종속적인 구성
  • nginx보다 느린 cloudflared 서비스의 재시작 속도

위의 단점이 문제가 되는 서비스를 운영한다면, Cloudflare Tunnel를 사용하지 않고 직접 웹서버를 통해 리버스 프록시를 구성해야한다.

비교

과정을 간단하게 나타낸 그림으로, 실제 환경 및 작동 방식과 차이가 있을 수 있다. (라우터 앞에 방화벽 장비가 있다던가…)

리버스 프록시 과정 기존의 웹서버를 이용한 리버스 프록시

CF Tunnel을 통한 리버스 프록시 과정 Cloudflare Tunnel을 이용한 리버스 프록시

서버는 밑에서 소개할 cloudflared를 통해 라우터(=공유기)의 NAT를 통과하여 Cloudflare의 네트워크로 아웃바운드 연결을 만든다. 서버는 클라이언트의 요청을 직접 받는게 아닌, 오직 Cloudflare와 통신만 하는 것이다.

게임으로 비유하자면 상대를 직접 찾아 친구 추가한 뒤 대전을 하는 것이 기존 방식이고, 매칭 시스템에 접속하면 상대를 알아서 찾아주는 것이 CF Tunnel 방식이다. 게임 시작 전 상대가 누군지 알 수 있는지, 없는지 정도의 차이.

cloudflared

cloudflared는 Cloudflare의 CLI 도구로, 서버가 Cloudflare와 통신하기 위해 사용된다. Cloudflare Tunnel를 사용하려면 필수인 이번 포스팅의 주인공.

Tunnel 이외에도 다양한 기능이 있지만 Tunnel 기능 중 일부만 사용해보겠다. CF 관련 첫 포스트니까…

설치

Cloudflare 공식 저장소의 문서를 참고하여 서술했다.

  1. 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
    
  2. 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
    
  3. cloudflared 설치
    1
    
     $ sudo apt install cloudflared
    

로그인

1
$ cloudflared tunnel login

별도의 Key 파일을 받아 설정하지 않았을 경우, Cloudflare의 웹 페이지가 열리며 로그인 창이 뜰 것이다. 내 Cloudflare 계정으로 로그인 한 후 Cloudflare와 연결할 도메인을 선택.

Tunnel 구성

  1. 생성
    1
    
     $ cloudflared tunnel create <터널 이름>
    

    위 명령어로 Tunnel를 생성하면 UUID로 된 이름의 json 파일이 만들어진다. 파일 내용은 볼 일 없고(secret이 있으니 중요하긴 하다), 해당 UUID가 중요하므로 복사를 해놓자.

  2. 도메인 주소와 Tunnel 연결
    1
    
     $ cloudflared tunnel route dns <UUID/터널 이름> test.example.com
    

    test.example.com의 CNAME이 <UUID>.cfargotunnel.com로 변경된다. Cloudflare 내에서 수동으로 설정해줘도 된다.

  3. 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를 입력. 위의 내용을 ~/.cloudflaredconfig.yml라는 이름으로 작성해준다. 추가할 도메인이 더 있다면, ingress 안에 도메인 및 서비스를 추가 작성하고 2번을 실행하면 된다.

  4. Tunnel 실행
    1
    
    $ cloudflared tunnel run
    

    터널 상태는 Cloudflare One 대시보드의 네트워크 > Tunnels에서 확인 가능하다.

  5. 서비스 설정
    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 설정에서 직접 지워줘야한다.

이 글은 저작권자의 CC BY 4.0 라이센스를 따릅니다.