DDNS(다이나믹DNS) 자동업데이트 하기

 개인이 홈페이지나 서버를 운영하려면 여러가지 요소가 필요하다. 먼저 물리적인 서버, 그리고 도메인, 그리고 서버에 연결된 네트워크가 필요하다. 필자의 경우, 학창시절에 작은 단체의 서버를 운영한 적이있다. 구형PC에 우분투 OS를 설치하여 학교의 네트워크망에 물려서 사용하였다. 지금은 취미 생활로 라즈베리 파이를 집에 설치하여 이것저것 공부하고 있다.

 대학/회사의 네트워크는 기본적으로 고정IP를 기반으로 한다. 하지만 집에서 사용하는 인터넷은 유동IP이다. 언제 IP가 바뀔지 모른다. 이를 해결하기 위해 DDNS라는 것이 있다. DDNS를 이용하는 2가지 방법이 있다. 

 첫 번째 방법으론 이전 글에서도 언급한 적이 있는 공유기에 있는 DDNS를 이용하는 방법이다.
공유기 DDNS 이용하기 : http://www.withover.com/2014/12/nginx-php5-mysql.html
 위 링크의 중간 부분부터 iptime DDNS를 설정하는 방법이 나온다. 이 방법을 이용하면 도메인.iptime.org 같은 형태의 도메인을 획득 할 수 있다. 인터넷 서비스 업체에서 IP를 변경하더라도 공유기에서 IP를 자동으로 도메인에 업데이트 하기 때문에 다른 작업이 필요없다. 하지만, withover.com 의 도메인을 직접 구입해서 사용하는 입장에서는 iptime.org라는 다른 도메인을 사용해야 한다는 점이 아쉬운 방법이다.

 두 번째 방법이 DDNS를 지원해주는 dnsever.com 과 같은 서비스를 이용하는 방법이 있다. 이 방법을 이용하면, http://pi.withover.com 과 같이  withover.com 도메인의 하위 도메인을 이용할 수 있다. 세계적으로 많이 사용하는 dyndns.com 서비스을 이용한다면 공유기 설정만으로 DDNS를 이용할 수 있다. 하지만, 필자는 dnsever.com 을 이용하기 때문에 dnsever.com 을 이용해서, 특정 도메인과 필자의 라즈베리 파이이를 연결하는 방법을 설명하려 한다.
DNSever.com : http://dnsever.com
 pi.withover.com 을 입력했을 때, 변환과정을 간략히 보자.
http://pi.withover.com -> DNS Server -> 입력된 도메인을 특정 IP를 변환 -> IP를 가지고 서버를 찾음
 위 과정을 거쳐 특정 도메인이 IP로 변환되어 서버를 찾는 것이다.

 먼저 간략하게 DDNS를 등록해 보자. 도메인 구입과 dnsever.com에 도메인 등록은 완료되었다고 가정한다.
DNSever.com 에 로그인 -> 기본 도메인 선택 -> 다이나믹 DNS 관리 -> DDNS에 공유기 외부 IP등록
 고정 IP를 사용한다면, 위 단계까지만 해도 문제가 없다. 하지만, 일반 가정집에서 인터넷 공유기를 이용해 서버를 구축했다면, IP가 주기적으로 변경된다. IP가 변경되면 도메인은 잘못된 IP에 연결을 시도하게 된다. 이 문제를 해결하렴 IP가 변경되는 것을 감지해 DNS정보를 업데이트 해야한다. dnydns.com 서비스를 이용한다면 보통의 공유기에서 이 작업을 자동으로 처리할 수 있다. 하지만, 우리나라에서 많이 사용하는 dnsever.com 서비스는 crontab 등을 사용해 변경된 IP를 등록하는 작업을 만들어야한다.
DNSEver.com의 DDNS 등록 참고 : https://kr.dnsever.com/help/wiki/wiki.php?AboutDDNSHelp
 다음 단계를 통해서 DDNS 정보를 주기적으로 업데이트하는 작업을 만들어보자.

 먼저, DNSEver.com 의 다이나믹 DNS 관리 페이지에서 DNS 인증코드(authcode) 를 등록한다. 자동으로 IP를 업데이트할 때 필요한 코드이다.

 DNS 인증코드를 등록한 후, 아래 형식의 코드를 서버에서 실행한다. 정상적으로 실행되면 dnsever.com에 등록된 도메인 IP의 업데이트가 이루어 진다.
linx 사용시
lynx -source -auth=아이디:인증코드 'http://dyna.dnsever.com/update.php?host[호스트이름]' 
wget 사용시
wget -O - --http-user=아이디 --http-passwd=인증코드 'http://dyna.dnsever.com/update.php?host[호스트이름]'
 아래의 코드는 필자의 pi.withover.com 도메인의 IP를 업데이트하는 코드이다. 사용자ID(userid)와 DNS인증코드(12345678)은 다른 코드로 바꾸었다.
pi@raspberrypi ~ $ wget -O - --http-user=userid --http-passwd=12345678 'http://dyna.dnsever.com/update.php?host[pi.withover.com]'
--2015-01-03 16:08:56--  http://dyna.dnsever.com/update.php?host[pi.withover.com]
Resolving dyna.dnsever.com (dyna.dnsever.com)... 211.233.75.82, 211.233.75.81
Connecting to dyna.dnsever.com (dyna.dnsever.com)|211.233.75.82|:80... connected.
HTTP request sent, awaiting response... 401 Unauthorized
Connecting to dyna.dnsever.com (dyna.dnsever.com)|211.233.75.82|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 238 [text/xml]
Saving to: `STDOUT'
 0% [                                    ] 0           --.-K/s              <?xml version="1.0" encoding="utf-8" ?>
<dnsever>
        <result type="update" code="701" numOfSuccess="1" numOfFailure="0" msg="DDNS Update Success">
                <host name="pi.withover.com" code="720" msg="Update Success"></host>
        </result>
</dnsever>
100%[===================================>] 238         --.-K/s   in 0s
2015-01-03 16:08:56 (3.44 MB/s) - written to stdout [238/238]
pi@raspberrypi ~ $
 위 내용을 crontab 과 같이 주기적으로 실행하는 서비스에 등록해보자.
Cron : http://en.wikipedia.org/wiki/Cron 
Crontab 설명 : http://jmnote.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab
dnsever.com 에서 1분이내의 시도가 있으면 거부를 주기 때문에 5분마다 실행하는 크론탭을 만들어보자.
$ crontab -e 
아래의 내용을 마지막에 붙여 넣고 저장한다. 5분 단위로 서비스를 호출하는 코드이다.
*/5 * * * * wget -O - --http-user=userid --http-passwd=12345678 'http://dyna.dnsever.com/update.php?host[pi.withover.com]'
크론탭 서비스를 다시 시작한다.
$ sudo apt-get service cron restart
다음의 명령으로 등록된 크론탭 리스트를 볼수 있다.
$ crontab -l
 ISP 업체에서 공유기에 할당된 IP를 바꾸더라도 5분 이내에 바뀐 IP로 DNS가 설정되게 된다.

추가.
 DNS업데이트를 쉘로 바꾸었고, 로그를 남기게 설정을 변경하였다.
 위 크론탭 내용을 setdns.sh 등의 쉘 파일로 만든다.
$ vi setdns.sh 
-O - --http-user=userid --http-passwd=12345678 'http://dyna.dnsever.com/update.php?host[pi.withover.com]'

 쉘 실행권한을 준다.
$ chmod +x setdns.sh 
 쉘을 크론탭에서 실행한다. 그리고 로그를 남긴다.
00 * * * * $HOME/setdns.sh > $HOME/setdns.sh.log