집 밖에서도 내 홈서버에 접속하려면 'DDNS'가 필요합니다. 집 인터넷 IP는 수시로 바뀌는 데다 외우기도 어려운데, DDNS는 이 변하는 IP에 고정된 주소(이름)를 붙여줘서 언제든 같은 주소로 접속하게 해주는 서비스입니다. 이 글에서는 무료 DDNS인 DuckDNS 설정부터, 공유기 포트포워딩, 그리고 외부 접속이 가능한 환경인지 직접 진단하는 방법까지, 제가 실제로 우분투 서버에서 확인한 결과와 함께 정리합니다.
이 글은 홈랩 입문 시리즈의 3부(기초 인프라) 첫 편입니다. 서버 구축이 아직이라면 3~5편을 먼저 진행하세요.
DDNS가 왜 필요한가 — 변하는 IP 문제
DDNS가 필요한 이유는 집 인터넷의 공인 IP가 '고정이 아니기' 때문입니다. 통신사는 가정용 회선에 유동 IP를 주기 때문에, 어제 접속되던 주소가 오늘은 안 될 수 있습니다. 게다가 IP는 123.45.67.89처럼 외우기 힘든 숫자라, 밖에서 접속할 때마다 확인하기도 번거롭죠.
DDNS(Dynamic DNS)는 이 문제를 해결합니다. myhome.duckdns.org 같은 고정된 이름을 만들어두면, 집 IP가 바뀔 때마다 DDNS 서비스가 자동으로 그 이름이 새 IP를 가리키도록 갱신해줍니다. 결과적으로 우리는 숫자 IP를 몰라도 항상 같은 주소로 서버에 접속할 수 있어요. 시놀로지 NAS를 쓰는 분은 제어판에 내장된 DDNS 기능(.synology.me 주소)을 몇 번의 클릭으로 켤 수 있고, 우리처럼 우분투 서버로 직접 구축하는 경우엔 DuckDNS 같은 무료 서비스를 쓰는 게 가장 간편합니다. 참고로 이미 개인 도메인을 보유하고 있다면(예: 제 경우 ddlabx.com), 홈서버 전용으로 home.내도메인.com 같은 서브도메인을 만들어 쓰는 방법도 있습니다. 블로그 등 기존 서비스에 쓰는 메인 도메인은 건드리지 말고 서브도메인만 따로 두는 게 안전합니다.
무료 DDNS — DuckDNS 설정하기
DuckDNS는 완전 무료이면서 설정이 간단해 홈랩 입문자에게 가장 널리 쓰입니다. 설정 흐름은 세 단계입니다. 먼저 duckdns.org에 접속해 구글·깃허브 등의 계정으로 로그인한 뒤, 원하는 서브도메인(예: myhome)을 만들면 myhome.duckdns.org 주소가 생성됩니다. 이때 화면에 표시되는 token(토큰) 값을 복사해두세요. 이 토큰이 내 IP를 갱신할 때 쓰는 열쇠입니다.
다음으로, 집 IP가 바뀔 때마다 DuckDNS에 자동으로 알려주도록 갱신 스크립트를 등록합니다. Docker를 쓰는 우리 환경에서는 linuxserver/duckdns 이미지를 컨테이너로 올리는 게 가장 깔끔합니다. Portainer나 명령어로 이 컨테이너를 실행하면서 서브도메인과 토큰을 환경변수로 넣어주면, 이후에는 알아서 주기적으로 IP를 갱신합니다. 설정이 끝나면 myhome.duckdns.org가 항상 우리 집 공인 IP를 가리키게 됩니다. 여기까지 하면 '이름'은 준비된 거예요. 다만 이 이름으로 실제 접속이 되려면 다음 단계인 포트포워딩이 반드시 필요합니다.
내 환경이 외부 접속 가능한지 진단하기 (직접 실습)
포트포워딩을 설정하기 전에, 내 인터넷 환경이 애초에 외부 접속이 되는 구조인지부터 진단하는 게 순서입니다. 한국 가정용 회선 중 일부는 공인 IP가 아니라 통신사 내부용 IP(CGNAT)를 받는데, 이 경우 포트포워딩을 아무리 해도 외부에서 접속이 안 되기 때문입니다. 그래서 저는 DuckDNS를 설정하기 전에 제 우분투 서버에서 직접 진단부터 해봤습니다.
방법은 두 값을 비교하는 것입니다. 먼저 서버(SSH 접속 상태)에서 아래 명령으로 '서버가 인식하는 공인 IP'를 확인합니다.
curl -4 ifconfig.me
그러면 숫자 IP가 하나 출력됩니다. 다음으로 공유기 관리자 페이지(보통 192.168.0.1 등, 환경에 따라 다름)에 접속해 'WAN IP' 또는 '외부 IP' 항목을 확인합니다. 이 두 값이 같으면 공인 IP(외부 접속 가능), 다르면 CGNAT(이중 NAT, 그냥은 외부 접속 불가)입니다. 네이버에 '내 아이피'를 검색해 나오는 IP를 세 번째 기준으로 함께 비교하면 더 확실합니다.

제 경우 curl로 나온 IP와 공유기 WAN IP가 정확히 일치했습니다. 즉 공인 IP 환경이라, 포트포워딩만 제대로 하면 외부 접속이 가능한 상태였습니다. 만약 이 두 값이 달랐다면 CGNAT 환경이라, 통신사에 공인 IP를 요청하거나 8편에서 다룰 DNS 방식 인증으로 우회해야 합니다.
포트포워딩 설정하기
진단 결과 공인 IP가 확인됐다면, 이제 공유기에서 포트포워딩을 설정하면 외부 접속이 열립니다. 포트포워딩은 '집 대문(공유기)으로 들어온 특정 노크(포트)를, 내부의 특정 서버로 전달하라'고 지정하는 설정입니다. iptime 공유기 기준으로 고급 설정 → NAT/라우터 관리 → 포트포워드 설정에서, 외부 요청을 홈서버(제 경우 172.30.1.51)의 해당 포트로 연결해주면 됩니다. 다음 편에서 다룰 리버스 프록시를 쓸 거라면 보통 80번(http)과 443번(https) 포트를 포워딩합니다.
포트포워딩이 됐는지 확인하는 가장 확실한 방법은, 휴대폰의 와이파이를 끄고 셀룰러 데이터로 myhome.duckdns.org 주소에 접속해보는 것입니다. 집 네트워크 밖에서 접속되면 성공입니다. 반대로 앞선 진단에서 CGNAT로 나온 분은 이 단계에서 접속이 안 되는 게 정상인데, 그 '막힘'이 곧 8편(DNS 방식 우회)으로 넘어가는 이유가 됩니다. 즉 진단 결과에 따라 6편에서 바로 성공하거나, 8편에서 우회로 해결하거나 두 갈래로 나뉩니다.
DDNS로 '항상 같은 주소'라는 기반이 마련됐으니, 다음 편에서는 이 주소 하나로 여러 서비스를 깔끔하게 연결하는 리버스 프록시를 설치합니다. → 7편. 리버스 프록시로 도메인 하나에 여러 서비스 연결