관리 메뉴

bright jazz music

동적DNS(DDNS) 적용하기 (with DuckDNS) 본문

OS 및 기타/리눅스

동적DNS(DDNS) 적용하기 (with DuckDNS)

bright jazz music 2024. 12. 20. 21:09

DuckDNS는 도메인과 공인 IP를 매핑하는 서비스이다.

사설망에 존재하는 하나의 기기에서, 같은 망에 존재하는 다른 기기로 접근하기 위해 사용하는 방법이 아니다.

왜냐하면 duckdns에 업데이트 되는 아이피는 공인아이피이기 때문이다. 따라서 NAT를 사용하는 사설망에서 적용하는 것은 무의미하다. (포트포워딩을 사용하지 않는 한. 그러나 카페나 도서관 이용자가 임의로 포트포워딩을 할 수 있는 것도 아니고...)

 

그래도 사용하려면 아래와 같이 사용할 수 있다.

 

서브도메인이 xxx.duckdns.org라고 할 때,

 

  • 클라이언트가 xxx.duckdns.org:3306 접속 시도 (xxx.duckdns.org를 변수처럼 사용하는 것이다)
  • 이 요청은 먼저 DuckDns의 DNS로 들어간다.
  • DuckDNS가 이를 실제 공인 IP(예: 123.456.789.012)로 변환하여 클라이언트에게 반환한다.
  • 클라이언트가 이 값을 사용하여 123.456.789.012:3306으로 접속 시도
  • 해당 공인 아이피를 가진 공유기에서 이 3306 포트로 들어오는 트래픽을 내부 사설망의 특정 IP(예: 192.168.0.27:3306)로 포워딩

 

참고로 여기서 실습하는 기기는 라즈베리 파이이다.

 

 

1. DuckDns 가입 및 서브도메인 생성

https://www.duckdns.org/

 

Duck DNS

Duck DNS free dynamic DNS hosted on AWS news: login with Reddit is no more - legal request support us: become a Patreon

www.duckdns.org

 

나는 지메일로 소셜 가입했다. 가입을 완료했으면 아래의 recaptcha를 누르면 서브도메인 생성으로 화면이 바뀐다.

서브도메인을 생성하자. 인당 최대 5개이고, 변경은 안되며 삭제만 가능하다.

삭제한 도메인은 다른 사람이 쓸 수 있다.

 

2. 토큰 확인

 

오른쪽 끝 부분에서 생성된 서브도메인의 토큰을 확인할 수 있다. 토큰은 asdff-asdfasdf-asdfasdf-asdfasfd 처럼 UUID형식으로 되어 있다.

 

3. 라즈베리에서 아이피 업데이트 할 스크립트 생성 및 설정

 

대략

대략 아래의 과정을 거치게 된다


# duckdns 디렉토리 생성
mkdir ~/duckdns

#생성한 디렉토리로 이동
cd ~/duckdns

# 업데이트 스크립트 생성
nano duck.sh

# 다음 내용 입력 (YOUR_TOKEN과 YOUR_DOMAIN 수정)
echo url="https://www.duckdns.org/update?domains=YOUR_DOMAIN&token=YOUR_TOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -

# 실행 권한 부여
chmod 700 duck.sh

# cron에 등록하여 주기적 업데이트
crontab -e

# 다음 라인 추가 (5분마다 업데이트)
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

 

참고로 DuckDNS 업데이트 스크립트는 인터넷 연결만 필요하고, 일반적인 읽기/쓰기만 수행함으로 시스템 수준의 권한이 필요 없을 것 같아. 루트 계정으로 진행하지 않았다. 일반 사용자 계정으로 진행하면 될 듯하다.

 

3.1. 일반 사용자의 홈 디렉토리에 duckdns 디렉토리 만들고 내부로 들어가기.

coffee@coffee-rasp:~$ mkdir ~/duckdns
coffee@coffee-rasp:~$ cd ~
coffee@coffee-rasp:~$ ll
total 564
drwxr-x--- 5 coffee coffee   4096 Dec 20 20:32 ./
drwxr-xr-x 3 root   root     4096 Apr 23  2024 ../
-rw------- 1 coffee coffee   3706 Dec 20 19:06 .bash_history
-rw-r--r-- 1 coffee coffee    220 Mar 31  2024 .bash_logout
-rw-r--r-- 1 coffee coffee   3771 Mar 31  2024 .bashrc
drwx------ 2 coffee coffee   4096 Apr 23  2024 .cache/
-rw------- 1 coffee coffee     20 Dec 20 16:49 .lesshst
-rw-r--r-- 1 coffee coffee    807 Mar 31  2024 .profile
-rw------- 1 coffee coffee      3 Dec 20 19:38 .psql_history
drwx------ 2 coffee coffee   4096 Apr 23  2024 .ssh/
-rw-r--r-- 1 coffee coffee      0 Apr 23  2024 .sudo_as_admin_successful
-rw------- 1 coffee coffee   1046 Jun 27 12:43 .viminfo
-rw-rw-r-- 1 coffee coffee     71 Dec 20 13:28 bootconf.txt
drwxrwxr-x 2 coffee coffee   4096 Dec 20 20:32 duckdns/
-rw-r--r-- 1 root   root   524288 Dec 20 13:28 pieeprom-new.bin
coffee@coffee-rasp:~$
coffee@coffee-rasp:~$ cd duckdns/

 

3.2. nano duck.sh 명령어로 업데이트 스크립트 생성하고 내용 추가

****YOUR_DOMAIN 부분을 방금 생성한 서브 도메인으로 변경해주고,

****YOUR_TOKEN부분을 생성된 토큰으로 변경해주는 것을 잊지 말 것

echo url="https://www.duckdns.org/update?domains=YOUR_DOMAIN&token=YOUR_TOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -

 

입력이 완료되었으면 파일을 저장하고 나온다.

 

이 스크립트의 구체적인 내용은 아래와 같다.

각 부분의 의미:

1. `echo url="..."`: URL 문자열을 출력
   - `domains=YOUR_DOMAIN`: 업데이트할 도메인 이름
   - `token=YOUR_TOKEN`: DuckDNS에서 발급받은 인증 토큰
   - `ip=`: 비워두면 현재 IP를 자동 감지

2. `|`: 파이프로 echo의 출력을 curl의 입력으로 전달

3. `curl` 옵션들:
   - `-k`: SSL 인증서 검증을 건너뜀
   - `-o ~/duckdns/duck.log`: 응답을 duck.log 파일에 저장
   - `-K`: URL을 표준 입력에서 읽음
   - `-`: 표준 입력에서 설정을 읽음을 나타냄

따라서 이 스크립트는 현재 IP를 DuckDNS 서버에 전송하여 도메인의 IP 주소를 업데이트 한다.

 

3.3. 권한 부여

coffee@coffee-rasp:~/duckdns$ ll
total 12
drwxrwxr-x 2 coffee coffee 4096 Dec 20 20:39 ./
drwxr-x--- 6 coffee coffee 4096 Dec 20 20:39 ../
-rw-rw-r-- 1 coffee coffee  145 Dec 20 20:35 duck.sh
coffee@coffee-rasp:~/duckdns$ 

coffee@coffee-rasp:~/duckdns$ 
coffee@coffee-rasp:~/duckdns$ chmod 700 duck.sh

 

 

3.4. 스크립트 테스트

 

coffee@coffee-rasp:~/duckdns$ ./duck.sh 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     2    0     2    0     0      2      0 --:--:-- --:--:-- --:--:--     2
coffee@coffee-rasp:~/duckdns$

 

위 처럼 나오면 성공한 것이다.

  1. 요청이 성공적으로 완료되었고 (100%)
  2. 2바이트의 응답을 받았다 (100 2)

DuckDNS는 업데이트가 성공하면 'OK'를 반환하는데, 이게 바로 그 2바이트이다.

 

이 과정을 제대로 수행했다면 해당 디레렉토리에 duck.log 로그 파일이 생겼을 것이다.

coffee@coffee-rasp:~/duckdns$ ll
total 16
drwxrwxr-x 2 coffee coffee 4096 Dec 20 20:50 ./
drwxr-x--- 6 coffee coffee 4096 Dec 20 20:43 ../
-rw-rw-r-- 1 coffee coffee    2 Dec 20 20:55 duck.log
-rwx------ 1 coffee coffee  145 Dec 20 20:35 duck.sh*
coffee@coffee-rasp:~/duckdns$

 

확인해 보자

coffee@coffee-rasp:~/duckdns$ cat ./duck.log 
OKcoffee@coffee-rasp:~/duckdns$ 

#앞에 OK가 먼저 나오고 바로 터미널 프롬프트가 이어져 나와서 붙어서 출력된다.
#크론탭에서 등록해주면 이 스크립트가 5분마다 실행되어 아이피가 바뀌더라도 duckdns에 변경된 아이피가 등록되는 것이다.

 

3.5. 크론탭에 등록

coffee@coffee-rasp:~/duckdns$ crontab -e
no crontab for coffee - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]:

 

coffee 사용자의 crontab이 아직 없어서 새로 만든다는 의미이다.

편집기를 골라야 하는데 그냥 nano 편집기를 골랐다. 각자 편할 걸로 고르고 1~4번 가운데 선택해서 엔터치면 된다.

 

그럼 아래와 같이 크론탭이 뜬다

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

 

 

크론탭에 등록해주자.

 

# duck.sh 스크립트 5분마다 업데이트
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

 

주석은 지워도 상관없지만 이해를 돕기위해서 여기는 그냥 남겨뒀다. 저장하고 나오면 아래와 같은 화면일 것이다.

coffee@coffee-rasp:~/duckdns$ crontab -e
no crontab for coffee - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 1
crontab: installing new crontab
coffee@coffee-rasp:~/duckdns$

 

크론탭을 다시 확인하고 싶으면 다시 crontab -e를 입력하면 된다.

Comments