클라우드플레어 터널 | 포트포워딩 없이 외부접속하기 (1)
다음글 : 클라우드플레어 터널 | 도커 macvlan으로 보안강화 (2)
목차
이번에는 클라우드플레어 터널서비스를 알아보고자 합니다. 스마트홈을 운영하거나 홈서버를 운영하다 보면 집 내부망에서의 접속이 아닌 외부에서의 접속이 필요할 때가 있습니다.
외부에서 내부망으로 접속하는 방법은 VPN을 활용하거나 라우터의 포트포워딩을 통해서 하기도 하고 혹은 스마트홈 플랫폼에서 자체적으로 클라우드 서버를 통해서 외부 접속을 지원하기도 하는데 스마트 싱스의 경우 외부->삼성 스마트 싱스 서버->집 스마트 싱스 허브를 거쳐 외부에서도 편리하게 앱을 통해서 집안 내부를 제어할 수 있기도 하죠.
시놀로지도 자체적으로 DDNS를 통해서 외부에서 도메인으로 집 내부망에 접근할 수 있게 세팅할 수 있지만 라우터의 포트포워딩이 필요하기도 합니다.
DDNS의 외부 접속은 설정이 비교적 간단하지만 포트포워딩을 통해 포트를 열어놓고 외부에서 내부로 접속하기에 은근히 찔러보는 찜찜한 트래픽들이 많습니다.
이때 라우터의 포트를 오픈하지 않고 VPN처럼 외부에서 내부로 접속할 수 있는 방법 중에 하나인 클라우드 플레어의 터널 서비스가 있습니다.

클라우드플레어의 터널은 일종의 DMZ와 비슷합니다. 내부망과 외부에서 다이렉트로 연결할 수 있는 터널을 만들고 해당 터널로 내부망에 접속하여 여러 홈서비스를 연결할 수 있게 합니다.
도메인 등록 후 레코드를 내 공인 IP로 설정하는 것이 아닌 클라우드 플레어 엣지 서버의 터널 커넥터로 설정해서 외부에서 도메인을 통해 접속하면 클라우드플레어의 서버를 통해 터널로 연결되어 내부 홈서비스에 접근하게 되는 방식입니다.
진행하기에 앞서 우선 개인 도메인이 필요하고 클라우드플레어 터널을 설치할 도커가 필요합니다.
도메인은 유료 도메인을 추천하고 국내 가비아 같은 업체에서 구매하셔도 좋고 클라우드플레어에서도 도메인을 구매할 수 있습니다. 다만 다른 업체에서 구매한 도메인이라면 네임서버를 변경해 주고 클라우드플레어에 적용해 주는 작업이 필요합니다. 저는 편의를 위해 클라우드플레어에서 구매하는 것으로 진행하였습니다.
국내 업체에서 구매할 경우 1년에 500원~몇천 원 정도의 도메인은 초기 연도 할인된 가격으로 제공하고 1년 뒤 연장하면 비싸게 연장해야 될 수도 있으니 꼭 연장 가격을 확인해 보시고 진행하시는 게 좋습니다.
클라우드플레어 가입 및 도메인 구매
https://www.cloudflare.com/ko-kr 접속 후 회원가입을 한 뒤 로그인을 해줍니다.

왼쪽 메뉴에서 도메인 등록을 클릭하고 원하는 도메인을 검색해 보면 아래 가격과 함께 목록이 뜨게 되는데 원하는 도메인을 클릭하고 컨펌 또는 구매를 클릭합니다.

저는 1년에 7.18불 약 만 원 정도의 도메인을 골랐습니다. 그리고 도메인 등록자 정보를 입력하게 되는데 이름과 메일 전화번호 주소 등등을 입력하고 구매를 해줍니다. 페이팔 혹은 해외 결제가 가능한 카드가 필요합니다.

구매까지 완료가 되면 도메인이 바로 활성화되거나 혹은 네임서버에서 확인을 거쳐야 돼서 약간의 텀을 두고 기다리시다 보면 활성화가 됩니다.
클라우드플레어 초기 설정

도메인 페이지로 들어가게 되면 왼쪽 메뉴에 SSL/TLS의 overview 클릭 후 나타나는 페이지에서 Configure를 클릭합니다.

encryption mode를 아래 커스텀 SSL/TLS에서 Full 모드로 설정합니다.
이로써 클라우드 플레어 엣지 서버와 홈 네트워크 내부망에 설치되는 터널 간의 통신을 암호화할 수 있습니다.

왼쪽 메뉴에 Edge Certifications 클릭 후 Always Use HTTPS를 활성화해 줍니다.
클라우드플레어 터널 설치

다시 클라우드플레어 초기 페이지로 접속 후에 왼쪽 메뉴에 Zero Trust를 클릭합니다. 만약 처음 Zero Trust를 접속하게 되면 팀 네임을 입력하게 됩니다. 아무거나 원하시는 네이밍을 입력해 줍니다.


팀 네임을 설정한 다음에 플랜을 선택하게 되는데 무료 플랜을 클릭해서 진행합니다. 결제 단계가 나오지만 무료 플랜이므로 실제로 결제되는 내역은 없습니다.

Zero Trust 페이지에서 왼쪽 메뉴 Networks – Tunnels을 클릭하여 페이지에 Add a tunnel을 클릭해 줍니다.


터널 타입은 Cloudflared로 선택해 주고 터널 네임을 입력해 주고 저장해 줍니다.

터널 네임까지 설정한 후에 나타나는 페이지는 터널이 설치될 환경에 따라서 설치 가이드를 줍니다. 도커를 선택하면 아래 도커 실행 명령어를 주는데 그대로 복사합니다.

sudo docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <토큰>
도커가 설치되어 있는 호스트 환경 터미널에서 위 복사한 명령어를 그대로 붙여 넣고 실행해 줍니다.

도커에서 설치가 완료되고 컨테이너가 실행되면 클라우드플레어 설정 페이지 하단에 커넥터가 연결되었다고 자동으로 리프레시 됩니다.
서비스 호스트 설정

다시 터널 메뉴에 접속 후 만들어진 터널을 클릭하여 오른쪽 팝업이 나타나게 되면 Edit을 클릭합니다. 도커에 터널 설치가 잘 되고 실행되고 있다면 Status 부분에 Healthy라는 초록색 아이콘이 뜨게 되고 설치가 안 되어있거나 도커 컨테이너가 실행 중이 아닐 땐 Down이라는 빨간색 아이콘으로 뜨게 됩니다.

페이지에서 Public Hostname 선택 후 Add a public hostname을 클릭합니다.

Subdomain은 터널이 접속할 서비스를 나타내는 이름이나 혹은 마음에 드는 것으로 입력 후에 Domain은 구매한 도메인을 클릭해 줍니다.
저 같은 경우 테스트로 도커 컨테이너의 포테이너에 접속해 보기 위해 portainer로 서브도메인을 입력해 주었습니다.
아래 Service 부분에서 Type을 접속하려는 서비스의 http/https 타입을 선택해 주고 URL에 접속하려는 서비스의 내부 IP:포트나 혹은 로컬 도메인네임으로 적어줘도 됩니다. 저는 도커가 설치된 호스트 IP와 포테이너의 접속 포트인 9000을 입력해 주었습니다.

위 터널 셋업 과정에서 Subdomain을 설정해 주면 DNS 페이지에 자동으로 서브도메인이 등록이 되어 클라우드플레어 터널로 프록시가 됩니다.

이제 외부나 내부망에서도 “https://portainer.도메인”으로 접속하게 되면 터널링을 통해서 설정한 포테이너 서비스로 접속할 수 있게 되며 자동으로 클라우드 플레어 엣지 인증서가 적용되어 https 보안접속이 가능하게 됩니다.
클라이언트(외부에서 핸드폰 등) – 클라우드 플레어 엣지서버 – (터널링) – 홈 네트워크 내부망 Cloudflared – 포테이너
위 와 같은 흐름으로 통신이 이뤄지며 클라이언트<->클라우드 플레어 엣지 서버 구간에는 당연히 HTTPS 암호화로 통신이 이뤄지고 엣지 서버 <-> 홈네트워크 내부망 Cloudflared의 터널링 구간에서도 암호화로 통신을 하게 되며 내부망 Cloudflared <-> 포테이너 간의 통신은 http/https 설정에 따라서 암호화로 통신을 하거나 평문으로 통신을 하게 됩니다.
즉 내부망 안에서의 통신을 제외하곤 홈 네트워크의 라우터 바깥 외부 인터넷 통신은 기본적으로 모두 암호화로 통신이 이뤄지게 됩니다.
추가로 외부에서 표면적으로 클라이언트-클라우드 플레어 엣지 서버로 통신을 하기 때문에 도메인을 리졸빙해 보면 내 공인 IP가 나오게 되는 게 아닌 클라우드플레어의 IP가 리졸빙 되어 내 공인 IP를 숨길 수도 있게 됩니다.
한마디로 클라우드 플레어 엣지서버가 리버스 프록시 역할을 해주게 됩니다.
터널의 호스트네임 설정을 추가로 설정하여 내가 내부망에서 운영하고 있는 서비스들을 여러개 등록하면 동일하게 외부에서 접속할 수 있습니다.
간단하게 클라우드플레어 터널 서비스를 알아보았습니다.
추가적으로 보안 계층을 한 번 더 얹을 수 있는 방법도 있고 혹은 이메일 인증 같은 서비스를 추가할 수도 있습니다.
나머지 내용들을 다음 편에서 차차 진행해 보도록 하겠습니다.


