Go로 인증서버 만들기 #2 Cloudflare Argo Tunnel 구축

펜타곤·2023년 3월 20일
0
post-thumbnail

0. 들어가며

이번 글은 필수가 아니다.
만약 자신의 공인IP를 공개할 수 없거나 80포트를 열 수 없는 경우,
포트포워딩 없이 인터넷만 연결되어있다면 docker-compose만으로 어디서든 배포하고 싶다면,
이번 글에 나오는 Cloudflare Argo Tunnel을 고려해 보길 바란다.



1. Argo Tunnel의 작동원리

서버를 Cloudflare에 연결하기 전,
간단히 Argo Tunnel이 어떻게 구성되고 작동하는지 알아보자

먼저 우리의 서버가 Cloudflared 프로그램을 설치한다.
이를 통해, 우리 서버는 Cloudflare 서버에 요청을 보내 양방향 통신을 체결한다.

그리고 우리는 우리의 서버에 할당된 고유 ID와 도메인을 연결한다.

만약, 누가 우리의 도메인으로 요청을 보내면 Cloudflare 서버가 이를 받고,
앞서 체결한 양방향 통신을 통해 우리 서버로 전달해 준다.

양방향 통신을 우리 서버에서 요청하여 체결하므로,
인터넷만 연결되어있다면 사설망이나 포트 개방이 불가능한 상태여도 웹서비스를 운영할 수 있다.

사진 출처: Cloudflare 기술 블로그



2. Cloudflare 설정

앞서 설명한 Argo Tunnel을 구축하기 위한 Cloudflare 대시보드 설정을 진행해보자

(0). 준비

먼저, Cloudflare에 등록된 도메인이 있어야 한다.
없다면 아래의 링크를 참고하여 Cloudflare에 등록하도록 하자

Cloudflare에 도메인 등록하기

(1). Tunnel 생성

a. 왼쪽 사이드바에 Zero Trust를 눌러 Zero Trust Dashboard에 접속


b. Zero Trust Dashboard 안에 있는 사이드바에서 Access -> Tunnels 로 접속


c. Create a Tunnel 버튼을 눌러 터널을 생성해보자


d. 터널 이름은 자신의 서버를 식별 할 수 있는 이름으로 정하고, Save tunnel을 클릭해 저장합니다.


e. Docker 환경을 선택하고 아래 명령어의 --token 이하 내용 만 복사한다.
복사를 했다면 아래로 스크롤해 Next 버튼을 눌러 넘어간다.


f. 일단 테스트를 위해 Portainer 만 연결 해보겠다.
Public hostname 에서 서브도메인을 설정하고 본인의 도메인을 선택한 뒤,
Service 에서 Portainer의 내부 hostname과 포트에 맞춰 설정해준다.


(2). Tunnel Client(Cloudflared) 설정

0편에 소개 되었던 docker-compose.yml을 불러와보자

version: "3.7"

services:
  portainer-ce:
    container_name: main-portainer
    image: portainer/portainer-ce:latest
    restart: always
    expose:
      - "8000"
      - "9000"
      - "9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer/data:/data
      - /etc/localtime:/etc/localtime:ro 
    networks:
      - main_net

  tunnel:
    container_name: main-cloudflared-tunnel
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel run
    env_file:
      - .env
    networks:
      - main_net


networks:
  main_net:
    driver: bridge

위의 docker-compose.yml 파일은 PortainerCloudflared 이미지를 배포한다.

해당 파일을 (원하는 폴더)/main/ 에 저장 해주자
나는 ~/main/ 에 저장하도록 하겠다.


.env 파일을 만들어 2-(1) Tunnel 생성 단계에서 복사한 내용을 붙여넣기 한다.

TUNNEL_TOKEN=여기에 복사

이제는 실행해보자
sudo docker-compose up 을 실행해 PortainerCloudflared 를 실행하면,
자동으로 아까 생성한 터널과 양방향 통신이 시작된다.

Zero Trust Dashboard 안에 있는 사이드바에서 Access -> Tunnels 로 접속하여,
StatusHealthy이면 정상적으로 연결된 것이다.

https://설정한 Public hostname으로 접속해 Portainer 화면이 잘 나온다면 성공이다.


3. 마무리

위와 같은 방법으로 추후에 배포할 인증서버도 연결하면 된다.

다음 글에는 .env 파일을 통한 PostgresSQL, Redis 연결 방법을 올려보겠다.

profile
모난 예비 개발자 펜타곤

0개의 댓글