동적 DNS(DDNS) 개념과 테스트
Ubuntu 홈서버 구축기· 14 / 15
- 1 — 홈서버 구축 과정 정리
- 2 — 운영체제 선택과 설치
- 3 — Rufus로 Ubuntu USB 부팅 디스크 만들기
- 4 — Windows 디스크 파티셔닝과 Ubuntu 설치
- 5 — SSH 원격 접속 설정
- 6 — 방화벽 설정
- 7 — Cloudflare DNS 설정
- 8 — Nginx 설치와 리버스 프록시
- 9 — Nginx SSL/TLS 발급과 자동 갱신
- 10 — MySQL 설치와 설정
- 11 — Node.js 설치와 백엔드 애플리케이션 실행
- 12 — DHCP Reservation으로 내부 IP 고정
- 13 — 포트 포워딩
- 14 — 동적 DNS(DDNS) 개념과 테스트
- 15 — ddclient으로 동적 DNS(DDNS) 자동화
이전 문서에서 다룬 DHCP 예약은 내부 IP 주소의 변경으로 인해 포트 포워딩 설정이 어긋나는 것을 방지하기 위해 내부 IP 주소를 고정하는 작업이다.
그러나 내부 IP 주소를 고정하더라도 공인 IP 주소가 변경될 경우, 외부 요청이 네트워크로 전달될 수 없게 된다.
이 문제를 근본적으로 해결하기 위해 네트워크 제공업체의 고정 IP 서비스를 이용할 수 있지만, 특정 IP 주소를 독점으로 제공받는 것이기에 서비스 이용료 문제가 따른다. 따라서 다른 대안으로 동적 DNS(DDNS) 작업을 진행할 예정이다.
동적 DNS(DDNS)
DDNS는 유동적인 공인 IP 환경에서 도메인과 서버를 연결 상태로 유지해주는 방식이다.
동적 DNS(Dynamic Domain Name System, 이하 DDNS) 은 이름에서 알 수 있듯이, DNS 정보를 동적으로 처리하는 시스템으로서 특정 IP 주소에 대한 DNS 레코드를 주기적으로 또는 상황에 따라 자동으로 업데이트하는 설정이다.
홈 네트워크와 같이 유동적인 IP 주소가 변경될 때마다 도메인에 연결된 DNS 레코드의 IP 주소를 자동으로 업데이트해주는 방식이다.
즉, IP 주소를 고정할 수 없다면 변경될 때마다 DNS 레코드를 업데이트한다는 의미다.
DNS 업데이트 테스트
DNS를 업데이트하기까지의 <핵심> 은 다음과 같다.
A: 현재 네트워크의 IP 주소 확인B: 도메인에 설정된 현재 DNS 레코드 IP 주소 확인- 두 IP 주소 비교
↳
A = B: 같으면 그대로 유지 ↳A ≠ B⇒B → A: 다르면 DNS 업데이트
현재 DNS를 구성한 DNS 서비스는 Cloudflare이다.
Cloudflare는 DNS 레코드의 IP 조회 및 DNS 업데이트 API를 제공한다.
직접 API 요청을 해보며 구성이 가능한지 테스트해보았다. 테스트 과정은 다음과 같다.
- 서버 IP 주소 조회
- Cloudflare API: Zone ID 조회
- Cloudflare API: Record ID 조회
- Cloudflare API: DNS 업데이트
서버 IP 주소 조회
IP 주소 확인 서비스를 이용해 서버 네트워크의 현재 IP 주소를 조회한다.
curl https://ifconfig.co222.222.222.222조회한 IP 주소는 추후 비교 대상으로 준비해놓는다.
Cloudflare API: Zone ID 조회
Cloudflare API를 이용해 zone_id 를 조회한다. 이때, 쿼리 파라미터(name)로 찾고자하는 도메인을 추가하고, 소유자 인증을 위해 헤더값에 사용자 계정과 글로벌 키를 제공해야한다.
curl -X GET "https://api.cloudflare.com/client/v4/zones?name={domain.com}" \
-H "Content-Type: application/json" \
-H "X-Auth-Email: <EMAIL>" \
-H "X-Auth-Key: <API_GLOBAL_KEY>"{
"result": [
{
"id": "examp1e52c5a8e4b5f0d3c6a9e2b1d7f",
"name": "domain.com",
"status": "active",
...
}
],
"result_info": {
...
},
"success": true,
"errors": [],
"messages": []
}응답값으로 도메인에 대한 zone_id 를 얻을 수 있다.
Cloudflare API: Record ID 조회
확보한 zone_id 값을 이용해 record_id 를 이어서 조회한다.
이때, URL 매개변수에 zone_id, 쿼리 파라미터(name)에는 찾고자하는 호스트을 추가하고, 마찬가지로 소유자 인증 정보를 제공해야한다.
curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records?name={api.domain.com}" \
-H "Content-Type: application/json" \
-H "X-Auth-Email: <EMAIL>" \
-H "X-Auth-Key: <API_GLOBAL_KEY>"{
"result": [
{
"id": "examp1e6ff6db90ab422890c41bedf0d",
"zone_id": "examp1e52c5a8e4b5f0d3c6a9e2b1d7f",
"zone_name": "domain.com",
"name": "api.domain.com",
"type": "A",
"content": "111.111.111.111",
...
}
],
"result_info": {
...
},
"success": true,
"errors": [],
"messages": []
}응답값으로 찾고자하는 호스트의 DNS 레코드에 대한 record_id 를 얻을 수 있다.
여기서, DNS 레코드의 IP 주소와 미리 조회해 놓은 서버의 현재 IP 주소와 비교하여, 다를 경우 다음 작업을 진행한다.
Cloudflare API: DNS 업데이트
연달아 확보한 zone_id 와 record_id 를 이용해 DNS 레코드의 정보를 업데이트할 수 있다.
이때, URL 매개변수에 zone_id 와 record_id 를 입력하고, 소유자 인증 정보와 바디 데이터로 서버의 현재 IP 주소를 제공한다.
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{record_id}" \
-H "Content-Type: application/json" \
-H "X-Auth-Email: <EMAIL>" \
-H "X-Auth-Key: <API_GLOBAL_KEY>"
--data '{
"type": "A",
"content": "<NEW_IP>",
}'{
"result": {
"id": "examp1e6ff6db90ab422890c41bedf0d",
"zone_id": "examp1e52c5a8e4b5f0d3c6a9e2b1d7f",
"zone_name": "domain.com",
"name": "api.domain.com",
"type": "A",
"content": "222.222.222.222",
...
},
"success": true,
"errors": [],
"messages": []
}위와 같은 응답을 받으면 DNS 업데이트가 완료되었으며, Cloudflare의 DNS 메뉴에서 변경된 내용을 확인할 수 있다.
위 과정은 DNS 자동 업데이트 클라이언트인 ddclient 의 수행하는 과정과 동일하다.
ddclient 설치와 설정 과정은 다음 문서에서 다룬다.