홈서버를 외부에서 접속하려고 하면 곧 벽에 부딪힌다. 우리 집의 공인 IP가 고정이 아니라는 것. 가정용 인터넷 회선은 대부분 유동 IP라서, 공유기를 재시작하거나 통신사 사정에 따라 IP가 바뀔 수 있다. 어제 접속되던 주소가 오늘 안 되는 이유다. 이 문제의 표준 해법이 DDNS(Dynamic DNS)다.
DDNS가 하는 일
원리는 단순하다. 도메인과 IP의 연결(DNS 레코드)을 IP가 바뀔 때마다 자동으로 갱신하는 것이다.
- 서버(또는 공유기)에서 작은 클라이언트가 주기적으로 현재 공인 IP를 확인한다
- IP가 바뀌었으면 DDNS 서비스에 “내 새 주소는 이것”이라고 보고한다
- 외부 사용자는 늘 같은 도메인으로 접속하고, DNS가 최신 IP를 알려준다
즉 IP는 계속 바뀌지만 도메인은 그대로다. 유일한 공백은 IP가 바뀐 직후부터 다음 갱신까지의 시간인데, 갱신 주기를 5분으로 두면 실사용에서 문제가 되는 일은 드물다.
선택지 세 가지
① 공유기·NAS 내장 DDNS
가장 쉬운 길이다. 시놀로지 NAS는 제어판에서 자체 DDNS(synology.me 서브도메인)를 몇 번의 클릭으로 설정할 수 있고, 상당수 공유기도 제조사 DDNS를 내장하고 있다. 별도 서버 설정 없이 동작하므로 입문자에게 가장 권할 만하다.
② 무료 DDNS 서비스
DuckDNS 같은 무료 서비스는 서브도메인을 발급해주고, 갱신은 cron으로 도는 curl 한 줄이면 된다. 커스텀 도메인이 없어도 시작할 수 있다는 게 장점이다.
# 5분마다 IP 보고 (DuckDNS 방식 예시)
*/5 * * * * curl -s "https://www.duckdns.org/update?domains=내도메인&token=내토큰&ip=" >/dev/null
③ 내 도메인 + DNS API 갱신
이미 도메인을 갖고 있다면, DNS를 Cloudflare 같은 API 지원 DNS 호스팅으로 옮기고 DNS API로 레코드를 갱신하는 방식이 가장 깔끔하다. 내이름.duckdns.org가 아니라 home.내도메인.com처럼 자기 도메인 체계 안에서 관리할 수 있고, 이후 서비스별 서브도메인 확장(리버스 프록시 글 참고)과도 자연스럽게 이어진다.
어떤 걸 골라야 하나
| 상황 | 추천 |
|---|---|
| NAS 또는 DDNS 지원 공유기 보유 | ① 내장 DDNS — 5분 안에 끝 |
| 도메인 없음, 일단 시작 | ② DuckDNS 등 무료 서비스 |
| 내 도메인 보유, 서비스 확장 계획 | ③ DNS API 갱신 |
부끄러운 구성을 하나 공개한다. 내 WireGuard 클라이언트 설정의 서버 주소 칸에는 도메인이 아니라 공인 IP가 그대로 박혀 있다 — DDNS 없이. 올해 3월 중순 VPN을 올리며 “일단 지금 IP로” 적어둔 것이 석 달째 그대로인데, 이 글을 쓰며 다시 대조해 보니 설정 속 IP와 현재 공인 IP가 여전히 일치한다. 석 달간 한 번도 안 바뀐 셈이지만, 운이 좋았다는 자각은 있다. 이 구성의 진짜 약점은 IP가 바뀌는 날 외부에서 VPN이 끊긴다는 것, 그리고 그 사실을 하필 집 밖에서 알게 된다는 것이다 — 갱신해 줄 DDNS가 없으니 복구 수단도 집에 두고 나온 셈이 된다. 그래서 도메인을 이미 가진 내 경우의 결론은 ③이다. DNS API 갱신으로 옮기는 일이, 이 글을 쓰면서 내 할 일 목록 맨 위로 올라왔다.
더 까다로운 경우: CGNAT
DDNS로도 해결되지 않는 환경이 있다. 통신사가 가입자 여러 명에게 하나의 공인 IP를 공유시키는 CGNAT(통신사급 NAT) 환경에서는, 내가 받은 IP가 진짜 공인 IP가 아니라서 외부에서 들어오는 연결 자체가 불가능하다.
확인 방법은 간단하다. 공유기 관리 화면에 표시된 WAN IP와, 집 안 기기에서 외부 IP 확인 사이트로 본 IP를 비교한다. 두 값이 다르면 CGNAT일 가능성이 높다. 특히 WAN IP가 100.64.x.x 대역(CGNAT 전용으로 예약된 주소 공간)이라면 확실하다.
CGNAT라면 선택지는 둘이다. 통신사에 공인 IP(또는 포트포워딩 가능한 옵션)를 요청하거나, 인바운드 연결이 필요 없는 구조로 우회하는 것 — 뒤에서 소개할 Tailscale 같은 메시 VPN은 양쪽이 모두 바깥으로 연결을 맺는 방식이라 CGNAT 뒤에서도 동작한다.
함께 점검할 것
DDNS는 “주소”만 해결한다. 외부 접속이 실제로 되려면 두 가지가 더 필요하다.
- 포트 개방 여부: 공유기에서 해당 포트가 서버로 포워딩되어 있어야 한다. 단, 무엇을 어떻게 열지는 보안 문제와 직결된다 — VPN vs 포트포워딩 글에서 다루듯, 기본값은 “최소한만 연다”이다.
- 통신사 차단 포트: 일부 ISP는 80/443 같은 웹 포트의 인바운드를 막아두는 경우가 있다. 외부에서 접속 테스트(모바일 데이터 등 집 밖 네트워크 사용)로 실제 도달 여부를 확인해야 한다.
정리하면: 유동 IP는 홈서버의 장애물이 아니다. DDNS 한 겹이면 도메인 기반 접속이 가능해지고, 그 위에 HTTPS(리버스 프록시)와 접근 제어를 쌓아가면 된다. 다만 CGNAT만은 DDNS로 넘을 수 없는 벽이므로, 외부 접속 계획이 있다면 위의 IP 비교 확인부터 해보는 것이 시행착오를 줄이는 순서다.