[linux] DDNS 홈서버 설정 가이드 - ddclient로 유동IP에 도메인 연결하기

DNS와 DDNS

DNS는 IP 주소를 도메인으로 연결해주는 서비스입니다. 따라서 DNS는 인터넷에서 접근할 수 있도록 공개된 서비스로 제공되어야 합니다.

내 소유, 또는 타인 소유의 도메인을 실제 서버 IP 주소로 변경할 수 있도록 DNS 서비스를 제공하는 서버를 네임서버(Name Server)라고 합니다.

인터넷에는 많은 메이저 회사들이 DNS 서비스를 제공하고 있습니다. 이 서비스를 이용하면 편리하게 내 도메인을 관리할 수 있습니다. 대표적으로 구글, 클라우드플레어와 같은 회사들이 있습니다.

인터넷 관련 메이저 회사들만 DNS 서비스를 제공하는 것은 아닙니다. 카페24도 자체 네임서버가 있고, 인터넷 서비스 회사가 아니어도 자체적인 네임서버를 운영하기 도 합니다. 아니면 개인적으로 인터넷에 연결된 PC에 DNS 서비스를 올려서 내 소유의 도메인을 IP주소로 연결해주는 네임서버를 운영할 수도 있습니다.

어떤 형태든 공인 IP를 도메인으로 연결해주는 서비스가 DNS, 또는 네임서버의 기능입니다.

집에서 사용하는 내 PC를 도메인을 연결해서 홈서버를 운영하고 싶으면 사용하는 DNS 서비스 관리 화면에 들어가서 도메인을 내PC의 공인 IP(또는 인터넷 공유기에 할당된 공인 IP)를 등록하면 됩니다.

등록까지는 잘 되지만, 내 PC, 또는 인터넷 공유기에 할당되는 공인IP가 가변 IP라는 것입니다. 내가 사용하는 인터넷 서비스를 통해 내가 할당받는 IP는 망 안에 있는 DHCP 서버에서 자동으로 할당됩니다.

대부분의 경우 15일 이상, 또는 몇 달씩 같은 IP가 할당되지만, 주기적으로 망 안의 네트워크 장비들의 환경 정보가 리셋되거나, 이런 저런 이유로 IP가 다시 할당될 때 IP가 변경되게 됩니다.

이런 변경 사항을 내가 실시간으로 알 수 있는 방법이 없기 때문에 내 홈서버에서 운영중인 서비스가 접속이 안되는 것을 한참 후에나 알 수 있을 수도 있습니다.

IP가 변경된 것을 알게 되면, 사용하는 네임 서버 서비스 관리 페이지에 들어가서 변경된 IP를 반영하면 되지만, IP가 바뀔때마다 변경 작업을 해야 합니다.

그래서 주기적으로 내 PC의 IP가 바뀌는 지를 체크해서 DNS 서버에 바뀐 IP를 갱신해주는 서비스가 DynamicDNS, 줄여서 DDNS 서비스가 생겨났습니다.

DDNS 서비스를 위해서는 DNS서버와 내 PC 양쪽에 통신이 가능해야 합니다.

내 PC에는 내 PC, 또는 인터넷 공유기의 공인 IP가 바뀌는지를 일정 시간 간격으로 모니터링하는 프로그램, 또는 스크립트가 필요합니다. 이 DDNS 클라이언트 프로그램은 IP가 바뀌면 DNS 서버에 변경 내용을 갱신하는 동작을 하게 됩니다.

DNS 서버는 전용의 DDNS 클라이언트 프로그램과 통신을 할 수 있는 기능이 구현된 DDNS 서비스일 수도 있고, 네임 서버의 관리 기능을 공개된 API로 제공하는 것일 수도 있습니다.

전자의 경우가 DNSEver와 같은 DDNS 네임서버 서비스입니다. DNSEver는 DDNS 클라이언트를 제공하며, 스크립트로 업데이트를 할 수 있는 커맨드 방식또한 지원합니다.

DNSEver.com 웹기반 DNS 서버 (네임서버)
DNSEver는 편리한 웹기반 DNS관리시스템을 제공합니다. 더 이상 DNS설정을 위하여 복잡한 시스템관리를 하실 필요가 없습니다. 웹에서 도메인 이름과 IP주소를 입력하시면, 바로 편리한 DNS서비스를 사용할 수 있습니다.

후자의 경우는 네임버서 API를 제공하는 대부분의 네임서버 서비스에서 지원이 됩니다. Google Domains, Cloudflare, Pokebun 같은 네임서버 서비스들이 API를 통해 도메인 호스트의 IP 업데이트를 할 수 있습니다.

구글의 네임서버는 동적 DNS(DDNS)를 기본 기능으로 지원합니다.
구글의 네임서버는 동적 DNS(DDNS)를 기본 기능으로 지원합니다.

bash 스크립트로 API를 사용해서 네임서버 정보를 갱신할 수 있지만, 스크립트 사용이 어렵다면 ddclient같은 프로그램을 사용해서 ddclient가 지원하는 네임서버의 등록정보 갱신을 간편하게 할 수 있습니다.

국내 ISP, 또는 호스팅 사의 네임서버들은 대부분 API를 지원하지 않기 때문에 DDNS 사용할 수 없습니다. API를 사용해서 DDNS를 구현하고 싶으면 앞서의 네임서버 서비스에 도메인을 등록/이전해야 합니다.

구글의 도메인 등록/관리 서비스는 Squarespace로 매각되었습니다. 아직은 구글이 도메인 등록/관리 서비스를 유지하고 있고, DDNS 서비스 또한 사용하는데 문제가 없지만, Squarespace에서 이 기능을 그대로 지원할지는 알 수 없습니다.

구글의 DDNS 서비스를 사용하게 되면 Squarespace로 완전히 서비스가 넘어가는 시점에 DDNS 서비스 지속 가능 여부를 체크해야 합니다.

ddclient 설치

우분투는 다음 커맨드로 ddclient 패키지를 설치합니다. CentOS는 yum 패키지 관리자로 설치합니다. 3.9.x 버전 기준입니다.

sudo apt install ddclient

설치 시작과 함께 다음과 같은 DDNS 서비스 선택 및 접속 정보를 입력하는 화면이 순서대로 표시됩니다. "other"를 연속으로 선택하고 설치 과정중 표시되는 입력 항목은 빈칸으로 두고 "ok", 또는 엔터키를 눌러 설치를 완료합니다. 나중에 설정 파일을 텍스트 에디터로 수정해서 목록에 없는 네임서버 API와의 연동정보를 수정합니다.

ddclient 설정 파일은 "/etc/ddclient.conf" 경로에 있습니다. 앞서 DDNS를 위한 DNS 서비스부터 모두 스킵을 했으므로 설정 값이 모두 이어있고 다음과 같습니다.

"#"으로 시작하는 행은 주석이므로 모두 무시합니다.

protocol=changeip
use=web, web=https://api.ipify.org/
login=
password=''

DNS 서비스로 "googledomains"를 선택하고 필요 항목을 모두 입력하면 다음과 같은 설정 값을 가지게 됩니다. 주석의 설명을 참조해서 설정하면 됩니다. 클라우드플래어는 첫 행의 "protocol"만 "cloudflare"로 바꾸면 됩니다.

ddclient가 공인IP 정보를 얻기 위해서 기본 값으로 사용하는 웹 사이트인 https://api.ipify.org/ 사이트가 소켓 오류가 발생해서 공인IP를 받아올 수 없을 때는(Connection refused IO::Socket::IP configuration failed) 다음 사이트 중 하나로 URL을 변경하면 됩니다. HTTPS 접속만 지원하므로 환경 설정 파일에 "ssl=yes" 행을 추가해야 합니다.

# DNS 서비스 선택
protocol=googledomains

# 공인 IP 획득 방식
# 네트워크 인터페이스면 if, 웹 접근이면 web
# if는 PC가 공인IP를 가지고 있을 때 if=네트워크 인터페이스(eth0)
# web은 공유기/라우터 등이 공인IP를 가지고 있을 때 https://ipinfo.io/ip
use=web, web=https://ipinfo.io/ip

# DDNS 로그인/패스워드 정보 - 도메인을 등록한 DNS 서비스에서 확인
login=ddns-id
password='ddns-pw'

# 업데이트 대상 도메인/호스트
www.plaincss.com

공인 IP 획득 방식은 홈서버를 구축하면 대부분 web 방식을 사용하면 됩니다.

DDNS 아이디/패스워드는 보안 인증을 위한 것으로 사용하는 DNS 서비스에서 DDNS 호스트를 생성하면 확인할 수 있습니다. 사용자 이름/비밀번호 보기를 한 후 복사 붙여넣기로 ddclient.conf 파일에 login/password 항목의 값을 채우면 됩니다. 패스워드는 따옴표로 감싸서 표시해야 합니다.

구글 도메인 DDNS 사용자 인증 정보
구글 도메인 DDNS 사용자 인증 정보

DDNS로 사용하는 호스트가 여러 개일 경우, 다음처럼 순서대로 나열해서 ddclient.conf 파일에 표기해주면 됩니다.

protocol=googledomains
use=web, web=https://ipinfo.io/ip
login=ddns-id1
password='ddns-pw1'
www.plaincss.com

protocol=googledomains
use=web, web=https://ipinfo.io/ip
login=ddns-id2
password='ddns-pw2'
blog.plaincss.com

ddclient가 기본 지원하는 DNS 서비스는 다음과 같습니다. 이외에도 ddclient.conf 파일을 편집해서 지원 가능한 다른 DNS 서비스를 사용할 수도 있습니다. ddclient.conf 파일에 "server" 속성 값으로 도메인을 표기하지 않고 "protocol"에 서비스 이름만 표기를 하면 됩니다.

  • changeip
  • cloudflare
  • concont
  • dnsmadeeasy
  • dnspark
  • dondominio
  • dslreports1
  • dtdns
  • duckdns
  • dyndns1
  • dyndns2
  • easydns
  • freedns
  • freemyip
  • googledomains
  • hammernode1
  • namecheap
  • nfsn
  • noip
  • nsupdate
  • sitelutions
  • woima
  • yandex
  • zoneedit1

네임서버 DDNS 호스트 등록

구글 도메인에서 등록한 도메인에 DDNS 호스트로 www를 추가하고 login/password 값을 확인 해보겠습니다.

  1. DDNS 호스트를 추가할 도메인을 선택한 후 왼쪽 메뉴에서 "DNS"를 선택합니다.

  1. DNS 레코드 관리 화면 하단의 "고급 설정 표시" 버튼을 눌러 고급 설정 항목을 표시합니다.

  1. 동적 DNS 섹션 오른쪽의 "동적 DNS 관리" 링크를 눌러 호스트 추가 폼을 표시합니다.
  2. 새 호스트를 입력하고 "저장" 버튼을 눌러 호스트를 등록합니다. IP는 동적 업데이트를 하기 때문에 입력할 수 없습니다. 초기에는 0.0.0.0으로 표시되며, ddclient로 IP 갱신이 되면 자동으로 변경됩니다.

  1. 새 호스트가 등록되면 동적 DNS 섹션 하단에 "도메인에 동적 DNS가 설정됨" 펼침 영역이 추가됩니다. 오른쪽의 펼침 버튼을 눌러 설정 내용을 확인합니다.

  1. 오른쪽 "사용자 인증 정보 보기"를 눌러 ddclient에서 구글 도메인의 호스트 IP를 업데이트하는데 필요한 아이디/패스워드 인증정보를 확인합니다.
    "보기" 버튼을 누르면 가려진 이름/비밀번호를 확인할 수 있습니다.

사용자 이름과 비밀번호를 복사해서 ddclient.conf 에 복사 붙여넣기를 하면 호스트 등록 과정은 완료됩니다.

클라우드 플래어는 로그인 ID와 생성한 API Key를 생성해서 복붙해야 합니다.

protocol=cloudflare
use=web, web=https://ipinfo.io/ip
login=클라우드플레어 ID
password=클라우드플레어 Global API Key
blog.plaincss.com # DDNS 도메인

ddclient 실행 테스트

다음 커맨드를 입력해서 콘솔창 출력 끝 행에 "good", "Done", "Okay", "SUCCESS"라고 메시지가 표시되면 성공입니다.(버전에 따라 메시지가 다소 다를 수 있습니다.) 디버그 모드로 DDNS 갱신 처리 과정의 모든 메시지를 표시합니다.

맨 끝 행만 확인하면 됩니다.

sudo ddclient -daemon=0 -debug -verbose -noquiet

=== opt ====
opt{cache}                           : <undefined>
opt{cmd}                             : <undefined>
opt{cmd-skip}                        : <undefined>
opt{daemon}                          : 0
opt{debug}                           : 1
opt{exec}                            : <undefined>

...

GMT; path=/; domain=.google.com; HttpOnly
RECEIVE:  Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
RECEIVE:  Accept-Ranges: none
RECEIVE:  Vary: Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site,Accept-Encoding
RECEIVE:
RECEIVE:  good 210.95.255.255

이미 등록되어 성공했으면 다음처럼 "SUCCESS" 메시지가 최종 출력됩니다.

SUCCESS:  www.mydomain.com: skipped: IP address was already set to 210.95.255.255.

실행이 성공하면 구글 도메인에 들어가서 동적 DNS 섹션에 추가한 호스트에 내 PC의 공인 IP가 갱신되었는지 확인하면 됩니다.

크론탭에 ddclient 등록

설정이 완료되었으므로 ddclient를 크론탭에 등록해서 일정 시간 간격으로 IP가 업데이트 되었는지 확인하고, IP가 변경되었으면 IP를 갱신하도록 합니다.

5분 간격으로 ddclient가 실행되도록 크론탭에 작업을 추가합니다.

*/5 * * * * 루트계정 /usr/sbin/ddclient

이 방법보다는 다음의 ddclient 서비스를 이용한 데몬 서비스를 사용하는 것을 권장합니다. 기본적으로 ddclient 설치 후 데몬이 실행되고 있고 기본 설정 값으로 5분에 한번씩 실행도록 주기 설정이 되어 있습니다.

데몬을 죽이고 또는 크론탭 작업으로 여러가지 작업을 관리할 때만 사용하는 것을 추천합니다.

ddclient 서비스 설정

ddclient를 설치하면 서비스 형태로 백그라운드로 실행되고 있기 때문에 ddclient 설정 파일에 실행 주기 변수 값을 추가하면 자동으로 설정한 주기에 따라 IP 체크를 합니다.

서비스 데몬 설정 파일은 /etc/default/ddclient 파일이며 파일 안의 다음 행을 수정합니다. "60"으로 변경하면 1분 간격으로 유동IP 체크를 합니다.

daemon_interval="5m" # m은 분 단위 표시로 5분을 나타냄. 단위 표시가 없으면 초로 처리함.

/etc/default/ddclient 파일 저장 후 ddclient 서비스를 다시 시작합니다.

sudo systemctl restart ddclient

설정한 간격으로 IP 체크가 실행되지 않으면 다음 커맨드를 크론탭에 등록해서 부팅할 때마다 인터벌 설정 값이 강제로 적용되도록 할 수 있습니다.

@reboot root ddclient -daemon 300 -syslog

ddclient 데몬의 상태를 출력해보면 다음 실행할 때까지 얼마의 시간을 대기해야 하는지 표시를 해줍니다.

sudo service ddclient status
● ddclient.service - Update dynamic domain name service entries
     Loaded: loaded (/lib/systemd/system/ddclient.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-03-27 09:03:30 KST; 7s ago
       Docs: man:ddclient(8)
    Process: 3269 ExecStart=/usr/sbin/ddclient -daemon $daemon_interval -syslog -pid /run/ddclient.pid (code=exited, status=0/SUCCESS)
   Main PID: 3270 (ddclient - slee)
      Tasks: 1 (limit: 4421)
     Memory: 15.0M
        CPU: 631ms
     CGroup: /system.slice/ddclient.service
             └─3270 "ddclient - sleeping for 60 seconds"

인터넷 공유기/라우터 포트포워딩 설정

홈서버에 홈페이지를 구축했으면 인터넷에서 도메인으로 내 홈서버 80포트로 접속할 수 있어야 합니다.

DDNS에서 내 공유기에 설정된 공인 IP를 알려주므로 DDNS 도메인으로 공유기까지는 웹접속 트래픽이 오지만 공유기 단에서 모두 막히게 됩니다.

공유기 80포트로 들어오는 트래픽을 내부망에 있는 내 홈서버 80 포트로 오도록 포트 포워딩 설정을 해야 비로소 내 홈서버의 웹 사이트가 DDNS 도메인을 통해 서비스가 가능해집니다.

설정은 공유기마다 다르므로 공유기 사용 설명서를 참조하면 되며, 대부분 공유기가 NAT/라우터 설정쪽에 포트포워딩 기능이 포함되어 있습니다.

iptime 공유기의 포트포워딩 설정
iptime 공유기의 포트포워딩 설정

외부에서 내 컴퓨터의 파일들에 접근할 수 있도록 내 PC에 FTP 서비스를 올렸다면 21번 포트를 포트 포워딩해서 공유기로 들어오는 FTP 접속이 내 PC로 가도록 해야 합니다.

ddclient 실행 로그 확인

ddclient는 "/var/log/syslog" 파일에 로그를 기록합니다. ddclient 로그를 기록하려면 ddclient.conf 파일에 다음 옵션 항목을 추가해야 합니다.

syslog=yes

ddclient는 기본 설정으로 아무런 로그 출력을 하지 않습니다. "verbose" 옵션을 켜야 ddclient가 IP정보를 얻고 DNS 의 IP와 비교해서 업데이트를 하는 과정에 대한 기록이 남게 됩니다.

ddclient.conf 파일에 다음 옵션 행을 추가합니다. ddclient 실행 주기가 짧을 경우 syslog 파일이 지나치게 커질 수 있으므로 테스트 환경에서만 사용하고 옵션을 삭제하는 것이 좋습니다.

verbose=yes

옵션 항목을 추가하고 ddclient 서비스를 다시 시작하면 다음처럼 ddclient 실행 로그가 "syslog" 파일에 남게됩니다.

Mar 26 20:42:35 ubuntu ddclient[2449]: CONNECT:  ipinfo.io
Mar 26 20:42:35 ubuntu ddclient[2449]: CONNECTED:  using SSL
Mar 26 20:42:35 ubuntu ddclient[2449]: SENDING:  GET /ip HTTP/1.0
Mar 26 20:42:35 ubuntu ddclient[2449]: SENDING:   Host: ipinfo.io
Mar 26 20:42:35 ubuntu ddclient[2449]: SENDING:   User-Agent: ddclient/3.9.1
Mar 26 20:42:35 ubuntu ddclient[2449]: SENDING:   Connection: close
Mar 26 20:42:35 ubuntu ddclient[2449]: SENDING:
Mar 26 20:42:35 ubuntu ddclient[2449]: SENDING:
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  HTTP/1.0 200 OK#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  server: nginx/1.24.0#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  date: Tue, 26 Mar 2024 20:42:35 GMT#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  content-type: text/plain; charset=utf-8#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  Content-Length: 14#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  access-control-allow-origin: *#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  x-envoy-upstream-service-time: 1#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  via: 1.1 google#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  strict-transport-security: max-age=2592000; includeSubDomains#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000#015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  #015
Mar 26 20:42:35 ubuntu ddclient[2449]: RECEIVE:  210.95.255.255
Mar 26 20:42:35 ubuntu ddclient[2449]: SUCCESS:  www.mydomain.com: skipped: IP address was already set to 210.95.255.255.

환경 파일의 옵션들을 커맨들 라인으로 적용해서 ddclient를 다음처럼 실행할 수도 있습니다.

sudo ddclient -daemon 300 -syslog -verbose