본문 바로가기

개발노트/LINUX

cloudflare free plan 을 이용한 DDNS 설정

들어가며,

내 집에는 라즈베리 파이가 있다.

여러가지 목적으로 잘 활용하고 있는데, 그 중에서 WOL 실행기로써 사용하고 있는 것이 매우 편리하다. 바깥에 나가있을 때 언제 어디서든 집에 있는 컴퓨터를 켜고 각종 필요한 관공서/민원 서류를 발급받아 내가 있는 곳으로 전송을 해야하거나, 컴맹인 가족이 뭘 해달라고 하면 대신 해줘야 하는 일들이 종종 있기 때문이다.

원래는 WOL 기능이 지원되는 iptime 의 공유기를 썼었는데, 이사온 집에서는 Wifi mesh 때문에 통신사에서 빌려주는 공유기를 쓰고 있다. 따로 Wifi mesh 를 구성할 수도 있었지만 굳이 비용을 들이지 않고 통신사에서 빌려주는 공유기를 쓰면 쉽게 설정 가능했기에 그렇게 쓰고 있다.

그러나 통신사에서 주는 공유기는 WOL 기능이 없다.

그래서 라즈베리파이를 거쳐서 WOL 을 하는 것을 세팅해뒀었다. 그리고 라즈베리파이에 접속하기 위해서는 집 공인 IP 를 이용해야만 했다.

그런데 고정 IP 를 할당받은 인터넷이 아니다보니 공인 IP 가 가끔씩 변경이 되는 일이 있어서 그동안 no-ip 서비스를 이용하여 DDNS 설정을 해왔었는데, 한 달에 한 번씩 매번 confirm 하는 과정을 해야하다보니 많이 번거로웠다. confirm 하는 과정을 자동화하는 스크립트도 돌려봤으나 no-ip 에서 지속적으로 스크립트로 자동화하지 못하게 여러 방식으로 꼭 수동으로 confirm 하게 만드는 게 있었는지 결과적으로 잘 안 됐다.

그러던 와중 Cloudflare 를 이용한 DDNS 설정 방법에 대한 설명을 한 블로그 포스트를 하나 봤고, 나도 그렇게 설정을 해보았다.

 

Cloudflare 를 이용한 DDNS 설정 방법

요약된 방법은 아래와 같다.

1. 새로운 도메인 네임 구매 또는 기존 도메인 네임 필요 (새로운 도메인 네임 구매할거면 Cloudflare 에서 구매하는 게 훨씬 편할 듯)

2. Cloudflare 회원 가입

3. Cloudflare > sidebar > Websites > Add site (Free plan 선택)

4. 네임 서버 변경 필요 : Cloudflare 에서 알려주는 Nameservers 로 네임 서버 변경

나는 닷홈에서 도메인 네임을 구매한 것을 쓰고 있기 때문에 닷홈에서 네임 서버 변경을 해주었음

Cloudflare 에서 Cloudflare Nameservers 로 뭘 사용하면 되는지 알려준다. 사용자/사이트마다 다르게 제시하는 것으로 보이고 나에게는 teresa, wells 라는 이름으로 시작하는 이름의 Nameservers 를 사용하면 된다고 한다.

네임 서버를 변경하면 닷홈에서는 아래와 같이 "닷홈 네임서버가 아닙니다." 라는 문구를 확인할 수 있다.

5. 네임 서버를 변경하기 이전에 추가한 레코드들을 cloudflare 에서도 등록을 해줘야 한다.

그래야 기존에 운영하고 있는 DNS 레코드가 resolve 된다. 그렇지 않으면 네임 서버가 바뀌었기 때문에 기존에 추가해뒀던(나같은 경우에는 닷홈에 추가해줬던) 레코드들에 대한 DNS resolve 가 되지 않는다.

Cloudflare 에서 레코드를 등록할 때 Proxy status 를 off 하여 DNS only 로 바꿔줘야 입력한 그대로의 IP 로 resolve 함을 볼 수 있었다. (Proxy status 를 on 하면 내가 지정하지 않은 IP 2개가 나오는데 최종 목적지로 지정한 내 IP 로의 resolve 는 끝내 되지 않았다. 이 부분에 대해서는 몇가지 실험을 좀 더 해보거나 문서를 찾아봐야할 것 같다.)

 

6. IP 변경에 대해 polling 하여 변경이 되면 Cloudflare API 를 통해 IP 변경 (DDNS)

아까 언급한 블로그 포스트를 작성하신 분이 이 과정을 위한 스크립트를 공개해주셨고 나도 그대로 사용하기로 했다.

라즈베리파이에서 아래의 명령어로 git clone 을 해주고 필요한 설정을 한다.

git clone https://github.com/zerobell-lee/cloudflare-update-ip
cd cloudflare-update-ip
cp config-sample.json config.json
vi config.json # OR nano config.json
# Cloudflare 대시보드에서 확인되는 ZoneID 와 API Key 입력

pip3 install -U urllib3 requests # python 스크립트가 실행될 때 필요한 라이브러리 : requests 
# (urllib3 는 지정하지 않고 requests 만 설치해봤을 때 python 스크립트를 실행할 때마다 
# /usr/lib/python3/dist-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.26.8) or chardet (3.0.4) doesn't match a supported version! RequestsDependencyWarning) 
# 이런 warning 이 떴고 이 warning 이 보이지 않도록 하는 방법을 찾아서 해본 것)

ZoneID 와 API Key 는 어렵지 않게 Cloudflare 의 대시보드에서 찾을 수 있다.

그리고 라즈베리파이에서 crontab 을 설정한다.

0 * * * * /usr/bin/python3 /home/pi/cloudflare-update-ip/update_ip.py >> /home/pi/cloudflare-update-ip/result-update-ip-cron.log

 

해당 스크립트는 코드를 읽어보니, Cloudflare 에 등록돼있는 레코드의 value 가 스크립트가 실행되고 있는 현재 IP와 똑같은 레코드에 대해서만 값을 업데이트하고 있다는 것을 알 수 있었다. 그래서 스크립트가 어떤 레코드에 대해서 값을 수정을 하는 것인지에 대해서는 의문을 가지지 않아도 된다.

나는 소스 코드 일부를 수정하여 디버깅 목적의 로그를 출력하도록 해봤는데, 이 글을 쓰는 동안 cronjob 이 하나 실행돼 로그 파일에 STDOUT 이 잘 출력됐음을 확인할 수 있었다!

 

앞으로 IP 가 바뀌는 일이 또 얼마나 있을지 모르겠지만(아마도 1년에 1~2번) 앞으로 한참동안은 신경쓰지 않아도 될 것 같아 좋다!

 

결론

자동화는 옳다.

회사일 할 때도 성가신 수동 작업들을 할 때마다 "자동화 해야하는데..." 라고 생각하면서도 막상 그러지 못하는 게 많고, 어떨 땐 삘 받아서 그동안 미뤘던 자동화를 많이 하기도 하는데 하고 나면 느끼는 것은 항상 "자동화는 옳다" 는 '사실' 이다.

 

Thanks to https://seolin.tistory.com/118

반응형