headscale-tailscale-replace.../INSTALLATION_GUIDE.md
시골약사 76e727fb99 📚 Add comprehensive documentation for Headscale setup and testing
 새로운 문서 추가:
- INSTALLATION_GUIDE.md: 완전한 설치 가이드
  * Docker Compose 설정 상세 설명
  * 최신 Headscale 설정 형식 적용
  * 포트 충돌 해결 방법
  * 단계별 설치 과정
  * 문제 해결 가이드

- CLIENT_CONNECTION_TEST.md: 클라이언트 연결 테스트 가이드
  * Tailscale 클라이언트 설치 과정
  * Headscale 서버 연결 방법
  * 네트워크 인터페이스 확인
  * 성능 테스트 및 모니터링
  * 다중 플랫폼 연결 방법

🔧 기술적 세부사항:
- 포트 8070 사용으로 충돌 방지
- IPv4/IPv6 듀얼 스택 지원
- Pre-auth 키 기반 자동 인증
- Magic DNS 설정 포함
- Docker 헬스체크 개선

📊 검증된 기능:
-  VPN 터널 구성 (100.64.0.1/32)
-  실시간 노드 관리
-  0% 패킷 손실 확인
-  WireGuard 암호화 적용

🎯 사용자 가이드:
- 초보자도 쉽게 따라할 수 있는 단계별 안내
- 문제 상황별 해결 방법 제시
- 성능 테스트 및 모니터링 방법
- 다중 클라이언트 연결 가이드

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-09 14:46:29 +09:00

7.4 KiB

🚀 Headscale + Headplane 완전 설치 가이드

📋 프로젝트 개요

  • 목표: Tailscale을 완전히 대체하는 자체 호스팅 VPN 솔루션 구축
  • 기술 스택: Docker, Docker Compose, Headscale, Headplane
  • 환경: Ubuntu 24.04 LTS, Docker 27.2.0

🛠️ 사전 요구사항

  • Docker 및 Docker Compose 설치
  • 8070, 3000 포트 사용 가능
  • root 권한 또는 sudo 권한

📁 프로젝트 구조

headscale-setup/
├── docker-compose.yml      # Docker Compose 설정
├── .env                    # 환경변수 (API 키 포함)
├── .env.example           # 환경변수 템플릿
├── config/
│   └── config.yaml        # Headscale 최신 설정
├── headplane-config/
│   └── config.yaml        # Headplane 설정
├── data/                  # SQLite 데이터베이스 (자동 생성)
├── run/                   # 런타임 파일 (자동 생성)
└── start.sh              # 자동 설치 스크립트

🔧 상세 설치 과정

1단계: 환경 준비

# 작업 디렉토리 생성
mkdir -p headscale-setup
cd headscale-setup

# 필요한 하위 디렉토리 생성
mkdir -p config data run headplane-config

2단계: Docker Compose 설정

docker-compose.yml 작성

version: '3.8'

services:
  headscale:
    image: headscale/headscale:latest
    container_name: headscale
    restart: unless-stopped
    command: serve
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./config:/etc/headscale
      - ./data:/var/lib/headscale
      - ./run:/var/run/headscale
    ports:
      - "8070:8080"     # 외부:내부 (포트 충돌 방지)
      - "9090:9090"     # 메트릭스
    networks:
      - headscale-net
    healthcheck:
      test: ["CMD-SHELL", "nc -z localhost 8080 || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

  headplane:
    image: ghcr.io/tale/headplane:latest
    container_name: headplane
    restart: unless-stopped
    environment:
      - TZ=Asia/Seoul
      - HOST=0.0.0.0
      - PORT=3000
      - HEADSCALE_URL=http://headscale:8080
      - ROOT_API_KEY=${HEADSCALE_API_KEY}
      - HEADSCALE_INTEGRATION=docker
      - HEADSCALE_CONTAINER=headscale
      - COOKIE_SECRET=headscale-ui-secret-key-change-me
      - COOKIE_SECURE=false
      - DISABLE_API_KEY_LOGIN=false
    volumes:
      - ./headplane-config:/etc/headplane
    ports:
      - "3000:3000"
    depends_on:
      - headscale
    networks:
      - headscale-net

networks:
  headscale-net:
    driver: bridge

3단계: Headscale 설정 파일

config/config.yaml (최신 형식)

---
server_url: http://localhost:8070
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090

private_key_path: /var/lib/headscale/private.key
noise:
  private_key_path: /var/lib/headscale/noise_private.key

# 최신 형식: prefixes 사용
prefixes:
  v4: 100.64.0.0/10
  v6: fd7a:115c:a1e0::/48

derp:
  server:
    enabled: false
  urls:
    - https://controlplane.tailscale.com/derpmap/default

disable_check_updates: false
ephemeral_node_inactivity_timeout: 30m

database:
  type: sqlite3
  sqlite:
    path: /var/lib/headscale/db.sqlite

# 최신 DNS 설정 형식
dns:
  override_local_dns: true
  nameservers:
    global:
      - 1.1.1.1
      - 8.8.8.8
  search_domains: []
  magic_dns: true
  base_domain: headscale.local

# 최신 정책 설정
policy:
  path: ""

log:
  format: text
  level: info

unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"

logtail:
  enabled: false

randomize_client_port: false

# 간소화된 OIDC 설정
oidc:
  only_start_if_oidc_is_available: false
  issuer: ""
  client_id: ""
  client_secret: ""
  scope: ["openid", "profile", "email"]
  extra_params: {}
  allowed_domains: []
  allowed_users: []

4단계: 환경변수 설정

.env.example

# Headscale API Key (설치 후 자동 생성됨)
HEADSCALE_API_KEY=your_api_key_here

# 서버 설정
SERVER_URL=http://localhost:8070
LISTEN_ADDR=0.0.0.0:8080

# 데이터베이스 (SQLite 기본)
DB_TYPE=sqlite3
DB_PATH=/var/lib/headscale/db.sqlite

# Magic DNS
MAGIC_DNS=true
BASE_DOMAIN=headscale.local

# 네트워크 설정
IP_PREFIXES=100.64.0.0/10

# 시간대
TZ=Asia/Seoul

5단계: 설치 실행

환경변수 파일 복사

cp .env.example .env

자동 설치 스크립트 실행

chmod +x start.sh
./start.sh

또는 수동 설치

# 1. Headscale 시작
docker-compose up -d headscale

# 2. API 키 생성 (약 30초 대기 후)
sleep 30
API_KEY=$(docker-compose exec -T headscale headscale apikeys create)
echo "Generated API Key: $API_KEY"

# 3. .env 파일에 API 키 입력
sed -i "s/HEADSCALE_API_KEY=your_api_key_here/HEADSCALE_API_KEY=$API_KEY/" .env

# 4. Headplane 시작
docker-compose up -d headplane

🎯 중요한 설정 변경사항

포트 충돌 해결

  • 기존: 8080:8080 (충돌 발생)
  • 변경: 8070:8080 (외부 8070 포트 사용)

최신 Headscale 설정 형식 적용

  • ip_prefixesprefixes (v4/v6 분리)
  • dns_configdns (구조 변경)
  • acl_policy_pathpolicy.path
  • OIDC strip_email_domain 제거

Docker 헬스체크 개선

  • curlnc (netcat 사용)
  • Headplane 의존성 조건 완화

🔍 설치 확인 및 검증

1. 컨테이너 상태 확인

docker-compose ps

2. Headscale API 테스트

curl -s http://localhost:8070/health
# 응답: {"status":"pass"}

3. 로그 확인

docker-compose logs headscale
docker-compose logs headplane

4. 사용자 생성

docker-compose exec headscale headscale users create myuser

5. 사용자 목록 확인

docker-compose exec headscale headscale users list

6. Pre-auth 키 생성

docker-compose exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24h

🚨 문제 해결

포트 충돌 문제

# 8080 포트 사용 중인 프로세스 확인
lsof -i :8080

# 포트를 8070으로 변경하여 해결

Headplane 설정 파일 문제

# 빈 설정 파일 생성
echo "# Minimal config file for Headplane" > headplane-config/config.yaml

# 환경변수 우선 사용 설정

헬스체크 실패

# wget 대신 netcat 사용
# CMD-SHELL을 사용하여 호환성 개선

📊 최종 설치 결과

접속 정보

생성된 정보

  • 사용자: myuser (ID: 1)
  • API 키: 자동 생성됨
  • Pre-auth 키: 24시간 유효, 재사용 가능

네트워크 설정

  • IPv4: 100.64.0.0/10
  • IPv6: fd7a:115c:a1e0::/48
  • Magic DNS: headscale.local

🔄 Git 관리

브랜치 전략

# 기능 브랜치 생성
git checkout -b feature/working-headscale-setup

# 변경사항 커밋
git add .
git commit -m "🎉 Working Headscale Setup Complete"

# 원격 저장소 푸시
git push -u origin feature/working-headscale-setup

📈 다음 단계

  1. Tailscale 클라이언트 연결 테스트
  2. HTTPS/TLS 인증서 구성
  3. Headplane 한글화 작업
  4. ACL 보안 규칙 설정
  5. 백업 및 모니터링 구성

🎉 결론

Headscale과 Headplane을 사용한 완전한 자체 호스팅 VPN 솔루션이 성공적으로 구축되었습니다. 이제 Tailscale을 완전히 대체할 수 있는 환경이 준비되었습니다.