Proxmox와 Tailscale로 구축하는 Zero-Trust 홈 인프라 (feat. WOL 원격 대시보드 만들기)


1. 개요

안쓰는 노트북을 홈서버로 개조해보자 (feat. Windows를 밀고 Ubuntu Server 세팅하기)

이전 글에서 노트북으로 서버를 만들었다고 했는데, 흠 집안을 뒤져보니 안쓰는 PC가 있네? 그래서 제대로 된 서버를 만들어봤다.

글을 읽어보면 이렇게까지 할 필요가 있냐 싶기도 했지만… 분명 동생이 공부하다보면 높은 확률로 사고를 칠 것 같고, 괜히 고친답시고 이것저것 건들였다가 서버가 아예 터질 수도 있겠다는 생각이 들어 그냥 처음부터 고생길을 선택했다.
이 정도로 설계해줬음 터져도 자기꺼만 터지겠지 ㅎㅎ 터지면 혼자 고쳐보렴ㅎㅎㅎㅎ 미안하다 나에겐 너의 신뢰도가 매우 바닥이구나

포트폴리오로 쓰기엔 애매해서 블로그에 있어보이게 남기는거니 혹시나 홈서버 세팅에 관심있어서 들어오신 분들은 각 항목의 비하인드 /쉬운 설명 파트만 보심 됩니다.


2. 시스템 아키텍처 (System Architecture)

보통 홈 서버를 운영하다 보면 두 가지 큰 고민에 직면하게 된다.

  1. 보안: 외부 접속을 위해 포트 포워딩을 하는 순간, 전 세계 봇들의 스캔 대상이 됨
  2. 효율: 24시간 가동은 전기세와 하드웨어 수명에 부담이 됨

이를 해결하기 위해 Type-1 하이퍼바이저(Proxmox)Mesh VPN(Tailscale) 을 결합하여, 포트 노출 없는 Zero Trust 환경과 원격 전원 제어 시스템을 구축했다.

[ Tailscale Mesh VPN (Tailnet) ]
             │
      ┌──────┴──────┐
      ▼             ▼
┌──────────────┐   ┌──────────────────────────────────────────┐
│ [ Laptop ]   │   │ [ Proxmox Main Server ]                  │
│ (auto)       │   │                                          │
├──────────────┤   ├──────────────────────────────────────────┤
│ WOL Dash     │   │ ┌──────────┐ ┌──────────┐ ┌──────────┐   │
│ (Flask)      │   │ │ AI VM    │ │ Dev VM   │ │ Win VM   │   │
│              │   │ │ (GPU)    │ │          │ │          │   │
│              │   │ └──────────┘ └──────────┘ └──────────┘   │
├──────────────┤   ├──────────────────────────────────────────┤
│ Tailscale    │   │ Tailscale Serve (home-proxmox)           │
│ Serve        │   │                                          │
│   (auto/wol) │   │                                          │
└──────────────┘   └──────────────────────────────────────────┘

인프라는 크게 가상화 계층과 네트워크 계층으로 설계해봤다.

  • 가상화 계층 - Virtualization (Proxmox):

    • Bare-metal 환경에 Type-1 하이퍼바이저인 Proxmox를 구성하여 자원 효율성 및 하드웨어 추상화 달성
    • 핵심 포인트: AI 서버(GPU Passthrough), Dev 서버, Windows VM 등 목적별 VM 격리를 통해 운영 안정성을 확보하고, 스냅샷 기반의 빠른 복구 환경 구축
  • 네트워크 계층 - Networking (Tailscale):

    • 공유기 Port Forwarding을 완전히 배제하고 Tailscale 기반의 Mesh VPN으로 제로 트러스트(Zero Trust) 접속 환경 구현
    • 핵심 포인트: Subnet Router 설정을 통해 외부에서도 별도 클라이언트 설치 없이 내부 대역에 직접 접근 가능하도록 라우팅 최적화
  • 제어 및 자동화 계층 - Control Plane (Laptop/Flask):

    • 메인 서버가 다운된 상태에서도 상시 가동되는 저전력 노트북을 Control Plane으로 별도 분리하여 물리적 가용성 확보
    • 핵심 포인트(OOB Management): 고가의 서버 관리 솔루션(IPMI) 대신 L2(WOL) 및 L7(SSH) 프로토콜을 결합하여 가성비 높은 원격 전원 제어 및 상태 모니터링 자동화

비하인드 / 쉬운 설명

1️⃣ Proxmox 및 Tailscale 선택 배경
  1. 외국 나가서도 내맘대로 컴퓨터 켰다껐다 쓰고싶은데? 원격으로 컴퓨터 화면도 보고싶고
    • 홈서버라서 VM을 많이 만들지는 않을 것 같은데, 그 중 중소규모 회사에서 Proxmox라는걸 꽤 사용하는 것 같으니 적용해보기로 결정
    • 컴퓨터가 꺼지면 proxmox 서버자체가 안됨. 즉 컴퓨터 전원을 켜고 끄는 프로그램을 proxmox에서 돌리면 전혀 안됨 -> 아예 다른 곳, 그러니까 노트북 ubuntu server에 proxmox를 WOL할 수 있도록 간단한 프로그램을 만들고 24시간 돌리자. 그러면 proxmox가 올려진 컴퓨터는 꺼져있지만, 노트북은 24시간 풀가동이니 프로그램이 잘 작동할 것이다
  2. 괜히 포트 열었다가 해커들이 침입하면? -> Tailscale로 권한 있는 사람만 서버에 접속할 수 있도록 하자
  3. 만약 VM을 더 만들게 된다면? -> proxmox에서 필요할 때 만들면 되겠지
2️⃣ AI VM과 Dev VM을 나눈 이유

일단 이 둘은 모두 Ubuntu Server로 되어있다. 즉 기본 베이스는 똑같은 시스템이다. 원래는 하나의 VM으로 만들어 user를 각각 만들어 관리를 하려고 했는데, GPU가 마음에 걸렸다. 서버 돌리기 전에 컴퓨터를 뜯어보니까 그래픽카드가 있더라고,, 이왕 있는거 써먹어야 하지 않겠나,,

  • 보통 AI모델을 돌리는 순간, VRAM(GPU 메모리)가 꽉 차버리게 된다. 이 때 같은 곳에서 개발 서버를 돌리면 가뜩이나 부족한 자원을 나눠쓰느라 둘 다 버벅거리거나, 한 쪽이 커널 패닉으로 죽어버릴 것 같다는 생각이 들었다.
  • 또한 AI용 라이브러리와 개발용 라이브러리가 한 곳에 있으면 업데이트 하나 잘못 했다가 전체 환경이 깨져버리는 대참사가 일어날거라 생각했다.

그래서 AI VMDev VM으로 각각 Ubuntu server VM을 만들어 세팅을 해놨다.

  • AI VM: Proxmox에서 물리 GPU를 Passthrough하여 이 VM에만 할당했다. 이 경우, 다른 VM은 GPU가 있는지조차 모르기 때문에 최적의 성능을 뽑아낼 수 있을거라 생각했다.
  • Dev VM: CPU와 RAM 위주로 할당하여, 코드를 돌리고 프로그램을 돌리는데 집중하도록 만들었다. AI모델이 아무리 무거워도 개발 서버는 쾌적하겠지,,
3️⃣ Windows VM이 있는 이유

종종 정부사이트를 들락거리는데, 윈도우 최적화다보니 맥북에서 잘 돌아가지 않는 경우가 있음; 그래서 공문서 처리가 필요할 경우를 대비해 만들어놨다. 정부는 각성하라 21세기 AI가 판치는 시대에 이게 말이냐 방귀냐


3. 주요 구현 기술 (Tech Stack)

3.1 Zero Trust Mesh VPN & L7 Routing

단순한 포트 포워딩 방식의 외부 접속을 배제하고, 신원 기반의 안전한 인입 경로(Ingress) 를 설계

  • Mesh VPN (Tailscale): WireGuard 프로토콜 기반의 가상 네트워크를 구축하여, 공인 IP 노출 없이 Full-mesh 터널링을 구현 -> 전 세계 어디서든 내부망에 안전하게 인입할 수 있는 환경을 조성
  • L7 Reverse Proxy (Tailscale Serve): 각 물리 노드에서 Tailscale Serve를 독립적으로 운용하여 도메인 기반 경로 매핑(Context Path Routing) 을 적용
    • 내부의 비표준 포트(:5000, :8006)를 은닉하고 HTTPS 표준 포트(443)로 통신을 단일화하여 접근성과 보안성을 동시에 확보

3.2 Out-of-Band Management (OOB) 유사 구현

물리 서버의 라이프사이클(부팅/종료)을 원격에서 제어하기 위해 L2(Data Link)L7(Application) 계층의 프로토콜을 조합

  • L2 Layer (WOL): 관리 노드(Laptop)에서 메인 서버의 MAC 주소를 타겟으로 UDP 브로드캐스트 매직 패킷을 송출하여 하드웨어 부팅을 트리거
  • L7 Layer (SSH/Paramiko): 시스템 종료 시에는 Python의 Paramiko 라이브러리를 통해 SSH 세션을 수립하고 shutdown now 명령을 전달: 단순 전원 차단이 아닌 Graceful Shutdown을 보장하여 가상 머신(VM) 및 데이터의 무결성을 유지
  • State Monitoring: Python socket 라이브러리를 활용해 서버의 특정 서비스 포트 활성 여부를 주기적으로 스캔하여, 대시보드에 실시간 가동 상태(Online/Offline)를 리포팅

3.3 하드웨어 가용성 최적화 (Persistence)

구형 하드웨어를 서버로 재활용할 때 발생할 수 있는 가용성 저하 문제를 물리 계층에서 해결

  • CMOS 배터리(CR2032) 교체: 방전된 배터리로 인해 전원 차단 시 BIOS 설정(WOL, Power Loss Recovery)이 초기화되는 문제를 방지하여 인프라의 지속성(Persistence) 을 확보
  • Workload Isolation: GPU 자원을 과하게 소모하는 AI VM과 서비스 가동률이 중요한 Dev VM을 분리하고, GPU Passthrough를 적용하여 리소스 간섭 없는 고성능 연산 환경을 구축

비하인드 / 쉬운 설명

1️⃣ CMOS 배터리 교체 사건
  • 원래 컴퓨터는 ASUS기반, 윈도우 10이 깔려 있었다. 다 갈아엎고 proxmox로 하려면 BIOS에서 UEFI로 설정을 변경하라네? 인터넷에 검색해보니 Asus에서는 F2나 DEL버튼을 누르면 BIOS에 접속할 수 있다고 나와있어서 했다. 그런데 문제가 발생했다.
  • 문제는 바로 BIOS 화면이 전혀 나오지 않는다 는 것이었다. 안보이는 화면에서 키를 연타해보기, 윈도우에서 직접 UEFI 펌웨어 설정에 들어가기, 전원 케이블을 뽑고 잔류 전원을 다 빼고 재시동을 거는 등 여러 실험을 해봤다. 내린 결론으로는 Windows 자체는 괜찮았지만 그래픽 카드에서 문제가 발생한 것이였다. 왜냐면 조금 기다리면 윈도우는 잘 떴기 때문이다.
  • 1차 시도
    • 인터넷에 검색해보니 Nvidia Graphics Firmware Update Tool for DisplayPort 1.3 and 1.4 Displays에서 파일을 다운받아 드라이버를 업데이트 한다면 해결된다는 얘기가 있었다. 많은 사람들이 댓글로 감사합니다 ㅠㅠ 를 적은 것을 보고, 나도 희망을 품고 업데이트를 해봤다.
    • 하지만 안타깝게도 내 GPU는 최신버전을 갖고 있었다. 그렇게 1차 시도는 실패로 돌아가버렸다.
  • 2차 시도
    • 어쩔 수 없이 AI한테도 물어보고 인터넷에도 검색해봤는데, CMOS를 초기화하면 된다고 하더라. 나는 소프트웨어만 주구장창 팠던 사람이지 컴퓨터 하드웨어는 1도 모르는 사람인데 뭘 어쩌라는ㄱ… 라고 투덜대기 전에 그냥 냅다 해봤다. 되거나 부숴지거나 결과는 두 가지 밖에 없지
    • 어찌저찌 드라이버로 나사를 풀었더니, 듣기로는 CMOS가 그 동전건전지라는데 안보이네? 또 AI와 인터넷에 검색해봤더니 GPU 뒤에 숨겨져 있을 가능성이 있다라고 한다. 그래서 GPU를 분해했다. 부품 자체를 처음 만져보는거라 이게 맞나 싶어 + 부숴질까봐 유튜브를 보면서 해결했다.
    • GPU를 뜯으니 그 동전이 있었는데, 유튜브를 보면서 해도 동전이 전혀 나오지 않았다… 그렇게 또 나는 인터넷 유목민이 되어 AI와 인터넷 검색을 계속 했고, CLRTC 또는 JBAT1 또는 CLR_CMOS 라고 적힌 점퍼에 금속 드라이버로 5-10초 정도 금속을 접촉하면 된다는 정보를 입수했다. CMOS와 한 2cm? 꽤 가까운 곳에 해당 점퍼를 찾을 수 있었다. 웃긴게 GPU 분해 안하고도 밖에서 잘 보이더라ㅋㅋㅋㅠㅠㅠㅠ 괜한 고생을 한거였다. (혹시 초기화할 사람이라면 GPU분해 전에 한 번 보드를 쭉 흝어보기 바란다. 나처럼 고생하지 마세요…) 그렇게 또 희망을 품고 금속 접촉을 한 뒤, 잔류전원을 확실하게 빼주고 전원을 연결하여 BIOS화면이 나오길 기대했다. 그런데 큰일났다. 컴퓨터 화면 자체가 아예 켜지지 않는다는 것이었다. 잘됐던 윈도우도 그렇게 암흑으로 사라졌다…
  • 3차 시도
    • 분명 조심해서 다뤘는데 안된다? 이건 말도 안된다 윈도우라도 살려야 한다는 명목 하에 다시 컴퓨터를 분해하여 RAM을 다시 뺐다 꼽고, 청소를 싹 해줬다. 응 그래도 전혀 안나와~
    • 하지만 컴퓨터 신호가 잘 간다는건 볼 수 있었다. 연결했던 키보드에는 불이 잘 들어왔기 때문이다.
    • 2차 시도에서 AI가 CMOS라는건 모든 컴퓨터 부품에 들어간다며, 못찾는건 말이 안된다라며 내게 고나리를 했었는데, 이 배터리를 교체하면 되지 않을까? 해서 바로 동전 건전지를 구매했다. ECR2032로 샀고, 다시 컴퓨터 -> GPU를 분해하고 CMOS 배터리를 갈아끼웠다. (이때 즈음 부터는 분해에 자신감이 넘치기 시작함) 그렇게 전원을 켰더니 드디어 BIOS에 진입할 수 있게 되었다 😂
2️⃣ WOL 사용: OOB 유사 구현
  • 원래는 집에 미리 구비해둔 스마트플러그로 전원을 키면 자동으로 컴퓨터가 켜지도록 세팅을 했다. 그럼 동생한테 스마트플러그 권한을 줘야하는데, 어차피 Tailscale로 VPN 해놨으니, 내가 웹페이지만 조금 만들어서 노트북 서버로 24시간 가동하면 되는거 아닌가?해서 간단하게 프로그래밍을 해봤다.
  • 켜기: wakeonlansend_magic_packet을 이용해 컴퓨터 맥주소로 쏴줬다. 버튼 누르니까 컴퓨터 전원이 켜져서 신기하더라
  • 끄기: 원래는 끄기 버튼은 구현을 안하려고 했다. 어차피 proxmox 접속해서 사용하려는 VM을 실행해야 할텐데? 그러면 VM를 정리하고 proxmox까지 잘 끄지 않을까? 라고 생각했기 때문이다. 하지만 사람 일은 모르는 것. 혹시나 VM만 켜놓고 proxmox는 안끌 수도 있을 것 같아서, 끄기 신호를 보내면 SSH로 로그인 후 shutdown now 명령어를 보내도록 설정했다.

4. 트러블슈팅: 설계와 현실의 간극 해결

4.1 L7 리버스 프록시 경로 매핑 (Flask 404 에러)

  • 문제 상황: Tailscale Serve/wol 경로를 Flask 앱에 매핑했으나, 대시보드 UI만 뜨고 상태 확인 API(api/status)는 404 에러와 함께 무한 로딩됨
  • 원인 분석:
    • Reverse Proxy의 Path Stripping 메커니즘과 브라우저의 Context Path 인식 불일치가 원인
      브라우저는 /wol/api/...를 호출하지만, 프록시 설정에 따라 Flask 앱은 이를 처리할 엔드포인트를 찾지 못했음
  • 해결:
    • Tailscale Serve 설정을 --set-path /wol/로 명시하여 경로 구분을 명확히 함
    • 클라이언트 코드(fetch)의 주소를 절대 경로(/wol/api/...)로 강제하여 프록시 환경에서도 일관된 라우팅을 보장하도록 수정

4.2 vGPU(Shared GPU) 할당 실패 및 Passthrough 선회

  • 문제 상황: 자원 효율성을 위해 하나의 GPU를 여러 VM이 공유하는 vGPU(Shared GPU) 설정을 시도했으나, Proxmox GUI에서 할당 시 Host 커널이 Crash 되는 현상 발생
  • 원인 분석: 사용 중인 Nvidia GeForce GTX 1050Ti는 엔터프라이즈급 라이선스나 특수 드라이버 패치 없이는 하드웨어 차원에서 vGPU 기능을 제한함 -> 이를 강제로 할당하려다 보니 자원 충돌이 발생
  • 해결: 인프라의 최우선 가치는 안정성이라는 판단하에, 복잡한 소프트웨어 가상화 대신 물리 GPU를 특정 VM에 1:1로 매핑하는 GPU Passthrough 방식으로 변경. 결과적으로 성능 오버헤드 없이 AI 연산에 최적화된 환경을 구축

5. 결과 및 기대 효과

  1. 공격 벡터 원천 차단: 포트 포워딩 미사용으로 외부 해킹 위협 최소화
  2. 운영 편의성: 전용 앱 없이 브라우저 주소창만으로 외부에서 홈서버 기동 및 Proxmox 콘솔 접속 가능
  3. 비용 절감: 필요할 때만 원격 부팅하여 가동함으로써 불필요한 전력 낭비 방지

6. 마치며

클라우드 엔지니어로 일하며 실무에서 다루던 리버스 프록시, 가상화, 네트워크 라우팅의 기본 원리들을 홈서버에 직접 녹여본 유익한 시간이었던 것 같다.

TO. 이 글을 보게 될 동생에게

난 널 위해 최선을 다했는데 이 글을 보면 그놈의 알바 그만좀 하고 이제 죽기살기로 공부 좀 해라… 이정도면 너도 잘 알아듣었겠지? 할많하안할게…
그리고 VM서버 터졌다? 어차피 터져도 니쪽에서만 터지는거라 내꺼는 괜찮을거야. 서로 침범 못하게 권한 싹다 막아놨거든. 터지면 니껀 니가 복구해라 난 몰라 헤헤 ^^~~~
마지막으로 가이드 repo 초대했으니 잘 읽어보고 세팅하렴. 물론 질문은 안받을거임 솔직히 그정도로 README 자세하게 써줬으면 감사하다고 절해도 모자라지 않을까 싶네ㅎㅎ 모르면 AI한테 물어봐 나 진짜 바쁨 ㅅㄱ


Author: Ruby Kim
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Ruby Kim !
Comments
 Current
Proxmox와 Tailscale로 구축하는 Zero-Trust 홈 인프라 (feat. WOL 원격 대시보드 만들기) Proxmox와 Tailscale로 구축하는 Zero-Trust 홈 인프라 (feat. WOL 원격 대시보드 만들기)
포트 포워딩 없는 제로 트러스트(Zero Trust) 홈서버 구축기부터 원격 WOL 전원 제어 대시보드 제작까지
Next 
  TOC