[HA 구축기 06] HA 외부접속 안전 설정

집에서 Home Assistant를 쓰다 보면 어느 순간 꼭 한 번은 이런 상황이 온다. 외출 중에 에어컨을 켜고 싶은데, 앱을 열어봐도 연결이 안 된다. 당연하다. 로컬 네트워크 안에서만 돌아가고 있으니까. HA 외부접속 설정을 안 해두면 집 밖에서는 아무것도 할 수 없다. 이번 글은 그 문제를 해결하기 위해 직접 삽질하면서 정리한 내용이다. DuckDNS 도메인 설정, 포트포워딩, HTTPS 인증서, 그리고 설정 후 꼭 확인해야 할 보안 체크리스트까지 순서대로 짚어본다.

앞 글에서 VM에 HA OS를 올리는 것까지 마쳤다면, 이번 단계가 사실상 스마트홈을 ‘진짜 쓸 수 있는 상태’로 만드는 마지막 고비다. 겁먹을 필요는 없는데, 순서를 틀리거나 한 단계를 빠뜨리면 접속이 안 되거나 보안 경고가 뜨는 상황이 생기기 때문에 꼼꼼하게 따라가는 게 중요하다.


왜 외부에서 접속이 안 되는 걸까 — 구조 먼저 이해하기

Home Assistant는 기본적으로 로컬 IP 주소로만 접근이 된다. 예를 들어 192.168.0.100:8123 같은 주소인데, 이건 공유기가 집 안에서만 쓰라고 만들어 준 ‘사설 IP’다. 집 밖의 인터넷에서는 이 주소를 아예 볼 수 없다.

외부에서 접속하려면 세 가지 조건이 동시에 맞아야 한다.

  • 포트포워딩 — 외부에서 들어온 요청을 공유기가 HA 기기 쪽으로 전달해주는 설정
  • DDNS (동적 DNS) — 가정용 인터넷은 공인 IP가 수시로 바뀌기 때문에, 바뀐 IP를 자동으로 추적해주는 고정 도메인이 필요하다
  • HTTPS 인증서 — 통신 내용을 암호화해서 중간에 가로채지 못하게 막는 역할

이 세 가지가 빠짐없이 맞물려야 외부에서 안전하게 HA에 붙을 수 있다. 하나라도 빠지면 접속 자체가 안 되거나, 접속은 되는데 보안이 뚫린 상태가 된다. 순서를 지켜서 하나씩 설정하는 게 핵심이다.


1단계 — DuckDNS로 고정 도메인 만들기

먼저 도메인부터 만든다. DuckDNS는 무료로 내가원하는이름.duckdns.org 형태의 도메인을 제공하는 서비스다. 유동 IP가 바뀌면 자동으로 도메인이 새 IP를 가리키도록 갱신해준다.

  1. duckdns.org에 접속해 GitHub, Google, Reddit 중 편한 계정으로 로그인한다.
  2. 원하는 서브도메인 이름을 입력하고 add domain 버튼을 누른다. 이미 누가 쓰고 있으면 다른 이름을 골라야 한다.
  3. 도메인이 만들어지면 화면 상단에 token 값이 보인다. 이게 나중에 HA 애드온 설정에 들어가는 인증 키다. 꼭 복사해서 메모해두자.

여기까지는 5분 안에 끝난다. 계정만 있으면 바로 도메인이 생긴다.

다음은 HA 안에서 DuckDNS 애드온을 설치하는 차례다.

  1. HA 대시보드 → 설정 → 애드온 → 애드온 스토어로 이동한다.
  2. 검색창에 DuckDNS를 입력하고 설치한다.
  3. 설치 후 구성(Configuration) 탭에서 아래 내용을 채운다.
{
  "domains": ["내서브도메인.duckdns.org"],
  "token": "DuckDNS에서_복사한_토큰",
  "accept_terms": true,
  "certfile": "fullchain.pem",
  "keyfile": "privkey.pem"
}

accept_terms: true로 설정하면 DuckDNS 애드온이 Let’s Encrypt 인증서를 자동으로 발급하고 90일마다 갱신해준다. 이 인증서가 있어야 HTTPS가 된다. 설정을 저장하고 애드온을 시작하면 잠시 후 /ssl/ 폴더에 인증서 파일이 생성된다.

애드온 로그 탭에서 Your certificate and chain have been saved 같은 메시지가 보이면 인증서 발급이 완료된 것이다. 오류 메시지가 뜨면 도메인 이름이나 토큰을 다시 확인해보자.


2단계 — 포트포워딩 설정하기

도메인이 내 공인 IP를 가리키게 됐다면, 이제 공유기가 외부에서 들어오는 요청을 HA 기기로 넘겨주도록 포트포워딩을 설정해야 한다. 포트포워딩이란 쉽게 말해 ‘외부에서 이 번호로 오는 요청은 집 안의 저 기기한테 전달해줘’라고 공유기에게 알려주는 작업이다.

공유기 관리 페이지는 보통 브라우저 주소창에 192.168.0.1 또는 192.168.1.1을 입력하면 접근할 수 있다. 제조사마다 메뉴 이름이 조금씩 다른데, NAT 설정, 가상 서버, 포트포워딩 중 하나를 찾으면 된다.

항목 설정값 설명
외부 포트 8123 인터넷에서 들어오는 포트 번호
내부 IP HA 기기의 로컬 IP 예: 192.168.0.100
내부 포트 8123 HA가 실제로 수신하는 포트
프로토콜 TCP 웹 통신에 사용되는 프로토콜

여기서 한 가지 꼭 챙겨야 할 게 있다. HA가 설치된 기기의 로컬 IP가 고정되어 있어야 한다는 점이다. 공유기는 기본적으로 DHCP라는 방식으로 기기에 IP를 자동 배정하는데, 재부팅하면 IP가 바뀔 수 있다. IP가 바뀌면 포트포워딩이 엉뚱한 곳을 가리키게 된다.

해결 방법은 두 가지다. 공유기의 DHCP 설정에서 HA 기기의 MAC 주소를 기반으로 항상 같은 IP를 배정하도록 고정하거나(IP 예약), HA 기기 자체에서 고정 IP를 직접 설정하는 방법이 있다. 공유기에서 예약하는 방식이 관리하기 편하다.


3단계 — configuration.yaml에 HTTPS 설정 추가하기

DuckDNS 애드온이 인증서를 만들어줬다고 해서 HA가 자동으로 HTTPS를 쓰는 건 아니다. configuration.yaml 파일에 직접 인증서를 쓰겠다고 명시해줘야 한다.

HA 대시보드에서 파일 편집기 애드온을 설치했다면 그걸로 열면 되고, SSH 애드온을 쓰고 있다면 터미널에서 편집해도 된다. configuration.yaml 파일에 아래 내용을 추가한다.

http:
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

저장하고 HA를 재시작하면 이제부터 https://내서브도메인.duckdns.org:8123 주소로 외부에서 접속할 수 있다. 처음 접속할 때 브라우저 주소창 왼쪽에 자물쇠 아이콘이 보이면 HTTPS가 정상적으로 적용된 것이다.

재시작 후에 로컬에서 http://192.168.0.100:8123으로 접속하면 안 되는 경우가 있다. HTTPS를 활성화하면 이제 로컬에서도 https://로 접속해야 하거나, 도메인 주소를 써야 하는 경우가 생기기 때문이다. 당황하지 말고 도메인 주소로 접속해보면 된다.


설정 후 꼭 확인해야 할 보안 체크리스트

외부 접속을 열었다는 건 인터넷 어디서든 내 HA에 접근을 시도할 수 있다는 뜻이기도 하다. 설정만 하고 보안을 챙기지 않으면 나중에 문제가 생길 수 있다. 아래 항목들은 설정 직후에 한 번씩 확인해두는 게 좋다.

  • 비밀번호 강도 확인 — HA 계정 비밀번호가 짧거나 단순하다면 지금 바꾸자. 외부에서 접속 가능해진 순간부터 무작위 로그인 시도(브루트포스)가 들어올 수 있다.
  • 다단계 인증(MFA) 활성화 — HA 설정 → 사용자 → 본인 계정에서 다단계 인증을 켤 수 있다. 비밀번호가 뚫려도 추가 인증이 있으면 막을 수 있다.
  • 신뢰할 수 있는 프록시 설정 확인 — Nginx Proxy Manager나 Cloudflare 터널 같은 리버스 프록시를 쓰는 경우에는 trusted_proxies 설정을 함께 챙겨야 한다. 이걸 빠뜨리면 HA가 접속 IP를 잘못 인식할 수 있다.
  • 포트 번호 변경 고려 — 기본 포트인 8123은 자동화된 스캔 도구들이 자주 시도하는 번호다. 외부 포트만 다른 번호(예: 18123)로 바꾸면 무작위 접근 시도를 줄이는 데 어느 정도 도움이 된다. 내부 포트는 그대로 8123을 유지하면 된다.
  • 로그 확인 습관 — HA 설정 → 로그에서 주기적으로 로그인 실패 기록을 확인해보자. 모르는 IP에서 반복 시도가 보인다면 IP 차단이나 접근 제한을 고려할 수 있다.
  • HA 업데이트 유지 — 보안 패치가 포함된 업데이트가 자주 나온다. 외부 접속을 열어놓은 상태에서 오래된 버전을 쓰는 건 위험할 수 있다.

막히는 지점별 확인 포인트

설정을 다 했는데도 외부에서 접속이 안 된다면, 아래 순서대로 하나씩 점검해보자. 대부분의 문제는 이 중 하나에서 걸린다.

  1. DuckDNS 도메인이 내 공인 IP를 가리키고 있는가 — duckdns.org에 로그인해서 도메인 옆에 표시된 IP와, whatismyip.com 같은 사이트에서 확인한 내 공인 IP가 일치하는지 확인한다.
  2. 포트포워딩이 올바른 내부 IP를 가리키는가 — HA 기기의 현재 로컬 IP가 포트포워딩에 입력한 IP와 같은지 확인한다. IP가 바뀌었다면 다시 고정해야 한다.
  3. 인증서 파일이 정상적으로 생성됐는가 — HA 파일 편집기에서 /ssl/ 폴더 안에 fullchain.pemprivkey.pem이 있는지 확인한다. 없으면 DuckDNS 애드온 로그를 다시 살펴보자.
  4. configuration.yaml 문법이 맞는가 — YAML은 들여쓰기에 민감하다. 탭 대신 스페이스를 써야 하고, 들여쓰기가 한 칸이라도 틀리면 HA가 시작을 거부한다. HA 설정 → 설정 확인 기능을 써서 오류 여부를 먼저 체크해보자.
  5. 인터넷 공급사(ISP)가 포트를 막고 있지 않은가 — 일부 통신사는 특정 포트를 기본으로 차단하는 경우가 있다. 8123이 막혀 있다면 다른 포트 번호로 바꿔서 시도해볼 수 있다.

나중에 고려해볼 만한 선택지 — Cloudflare 터널

포트포워딩 방식이 불편하거나, 보안이 더 걱정된다면 Cloudflare 터널(Cloudflare Tunnel)을 쓰는 방법도 있다. 포트포워딩 없이 외부 접속을 구현할 수 있고, Cloudflare가 중간에서 트래픽을 처리해주기 때문에 실제 공인 IP가 노출되지 않는다는 장점이 있다.

다만 설정이 조금 더 복잡하고, Cloudflare 계정과 도메인이 필요하다. 지금 단계에서 DuckDNS + 포트포워딩으로 잘 돌아가고 있다면 굳이 바꿀 필요는 없다. 나중에 보안을 더 강화하고 싶을 때 선택지로 알아두는 정도면 충분하다.


정리하면서

처음 외부 접속 설정을 할 때 가장 많이 막히는 부분이 ‘어디서 오류가 난 건지 모르겠다’는 상황이다. 설정 항목이 여러 군데에 흩어져 있다 보니 한 곳을 고쳐도 다른 곳이 문제인 경우가 많다. 그래서 순서대로 하나씩 확인하는 게 제일 빠른 방법이다.

DuckDNS 도메인 → 포트포워딩 → HTTPS 설정 → 보안 체크 순서를 지키면서 각 단계가 정상인지 확인하고 넘어가면, 대부분은 결국 연결된다. 외부에서 처음으로 HA에 접속되는 순간의 뿌듯함이 꽤 크다. 그 이후에 HomeKit 연동이나 자동화 설정으로 넘어가면 스마트홈이 비로소 ‘진짜 쓸 수 있는 것’이 된다.

다음 글에서는 HA와 HomeKit을 연동해서 아이폰 홈 앱과 시리로도 제어할 수 있게 만드는 과정을 정리할 예정이다. HA OS VM 설치 과정이 궁금하다면 이전 글을 먼저 보고 오는 것도 좋다.


같이 보면 좋은 글


시리즈 글 모아보기

댓글 남기기