# 🌐 FARMQ Headscale μ™„μ „ κ°€μ΄λ“œ ## πŸ“š λͺ©μ°¨ 1. [κ°œλ… 정리](#κ°œλ…-정리) 2. [μ•„ν‚€ν…μ²˜ κ°œμš”](#μ•„ν‚€ν…μ²˜-κ°œμš”) 3. [포트 ꡬ성](#포트-ꡬ성) 4. [μ„€μΉ˜ 및 ꡬ성](#μ„€μΉ˜-및-ꡬ성) 5. [ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° μ›Œν¬ν”Œλ‘œμš°](#ν΄λΌμ΄μ–ΈνŠΈ-μ—°κ²°-μ›Œν¬ν”Œλ‘œμš°) 6. [μ‹€μ œ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€](#μ‹€μ œ-μ‚¬μš©-μ‹œλ‚˜λ¦¬μ˜€) 7. [문제 ν•΄κ²°](#문제-ν•΄κ²°) --- ## 🧠 κ°œλ… 정리 ### Tailscale vs Headscale vs Headplane #### 1. **Tailscale** (원본 μ„œλΉ„μŠ€) - **μ •μ˜**: μƒμš© VPN μ„œλΉ„μŠ€ (SaaS) - **νŠΉμ§•**: - ν΄λΌμš°λ“œ 기반 coordination server μ‚¬μš© - ꡬ독 기반 유료 μ„œλΉ„μŠ€ - μžλ™ν™”λœ 관리 - **단점**: - 데이터가 μ™ΈλΆ€ μ„œλ²„λ₯Ό κ±°μΉ¨ - λΉ„μš© λ°œμƒ - ν”„λΌμ΄λ²„μ‹œ 우렀 #### 2. **Headscale** (μ˜€ν”ˆμ†ŒμŠ€ μ„œλ²„) - **μ •μ˜**: Tailscale의 coordination serverλ₯Ό λŒ€μ²΄ν•˜λŠ” μ˜€ν”ˆμ†ŒμŠ€ κ΅¬ν˜„ - **νŠΉμ§•**: - 자체 ν˜ΈμŠ€νŒ… κ°€λŠ₯ - μ™„μ „ν•œ ν”„λΌμ΄λ²„μ‹œ μ œμ–΄ - 무료 μ‚¬μš© - REST API 제곡 - **μ—­ν• **: - ν΄λΌμ΄μ–ΈνŠΈ 인증 및 등둝 - IP μ£Όμ†Œ ν• λ‹Ή - λΌμš°νŒ… ν…Œμ΄λΈ” 관리 - ν‚€ κ΅ν™˜ coordination #### 3. **Headplane** (μ›Ή UI) - **μ •μ˜**: Headscale을 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ›Ή μΈν„°νŽ˜μ΄μŠ€ - **νŠΉμ§•**: - λΈŒλΌμš°μ €μ—μ„œ λ…Έλ“œ 관리 - μ‹œκ°μ  λ„€νŠΈμ›Œν¬ μƒνƒœ 확인 - μ‚¬μš©μž 및 ν‚€ 관리 #### 4. **ν΄λΌμ΄μ–ΈνŠΈ (Tailscale ν΄λΌμ΄μ–ΈνŠΈ)** - **μ •μ˜**: μ‹€μ œ VPN 연결을 λ‹΄λ‹Ήν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨ - **μ€‘μš”**: Tailscale의 **ν΄λΌμ΄μ–ΈνŠΈ μ†Œν”„νŠΈμ›¨μ–΄**λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš© - **변경점**: μ„œλ²„ μ£Όμ†Œλ§Œ Headscale μ„œλ²„λ‘œ μ§€μ • --- ## πŸ—οΈ μ•„ν‚€ν…μ²˜ κ°œμš” ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ν΄λΌμ΄μ–ΈνŠΈ PC β”‚ β”‚ Headscale β”‚ β”‚ ν΄λΌμ΄μ–ΈνŠΈ PC β”‚ β”‚ β”‚ β”‚ μ„œλ²„ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Tailscale │◄────┼── Headscale │─┼───── β”‚ Tailscale β”‚ β”‚ β”‚ β”‚ Client β”‚ β”‚ β”‚ β”‚ Server β”‚ β”‚ β”‚ β”‚ Client β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Headplane β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Web UI β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FARMQ Flask β”‚ β”‚ Admin Panel β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### 데이터 흐름 1. **등둝**: ν΄λΌμ΄μ–ΈνŠΈ β†’ Headscale μ„œλ²„ (인증) 2. **ν‚€ κ΅ν™˜**: Headscale μ„œλ²„ β†’ ν΄λΌμ΄μ–ΈνŠΈλ“€ (P2P ν‚€ 정보) 3. **μ‹€μ œ 톡신**: ν΄λΌμ΄μ–ΈνŠΈ ↔ ν΄λΌμ΄μ–ΈνŠΈ (직접 P2P) 4. **관리**: Headplane/Flask UI β†’ Headscale API --- ## πŸ”Œ 포트 ꡬ성 ### ν˜„μž¬ FARMQ μ„€μ • | μ„œλΉ„μŠ€ | 포트 | ν”„λ‘œν† μ½œ | μš©λ„ | μ ‘κ·Ό | |--------|------|----------|------|------| | **Headscale Server** | `8070` | HTTP | ν΄λΌμ΄μ–ΈνŠΈ 등둝/관리 | ν΄λΌμ΄μ–ΈνŠΈ ← β†’ μ„œλ²„ | | **Headplane UI** | `3000` | HTTP | μ›Ή 관리 μΈν„°νŽ˜μ΄μŠ€ | κ΄€λ¦¬μž β†’ μ›ΉλΈŒλΌμš°μ € | | **FARMQ Admin** | `5001` | HTTP | ν•œκ΅­μ–΄ 관리 νŽ˜μ΄μ§€ | κ΄€λ¦¬μž β†’ μ›ΉλΈŒλΌμš°μ € | ### μ€‘μš”ν•œ 포인트 - **ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‚¬μš©ν•˜λŠ” 포트**: `8070` (Headscale μ„œλ²„) - **κ΄€λ¦¬μžκ°€ μ‚¬μš©ν•˜λŠ” 포트**: `3000` (Headplane), `5001` (FARMQ Admin) - **λ‚΄λΆ€ μ»¨ν…Œμ΄λ„ˆ 포트**: `8080` (Docker λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©) --- ## πŸ› οΈ μ„€μΉ˜ 및 ꡬ성 ### 1. μ„œλ²„ ꡬ성 (이미 μ™„λ£Œ) ```bash # μ„œλ²„ μ‹œμž‘ cd /srv/headscale-setup docker-compose up -d # μ„œλΉ„μŠ€ 확인 docker-compose ps ``` ### 2. ν΄λΌμ΄μ–ΈνŠΈ μ„€μΉ˜ κ³Όμ • #### Step 1: Tailscale ν΄λΌμ΄μ–ΈνŠΈ μ„€μΉ˜ ```bash # Ubuntu/Debian curl -fsSL https://tailscale.com/install.sh | sh # λ˜λŠ” μˆ˜λ™ μ„€μΉ˜ curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/$(lsb_release -cs).noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/$(lsb_release -cs).tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list sudo apt update sudo apt install tailscale ``` #### Step 2: Headscale μ„œλ²„μ— 등둝 ```bash # κΈ°λ³Έ λͺ…λ Ήμ–΄ ν˜•μ‹ sudo tailscale up --login-server=http://[μ„œλ²„IP]:8070 --authkey=[PreAuthν‚€] # FARMQ μ‹€μ œ λͺ…λ Ήμ–΄ μ˜ˆμ‹œ sudo tailscale up \ --login-server=http://192.168.0.151:8070 \ --authkey=YOUR_PREAUTH_KEY_HERE \ --hostname=pharmacy-busan-pc1 \ --accept-dns=false ``` --- ## πŸ”„ ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° μ›Œν¬ν”Œλ‘œμš° ### 전체 ν”„λ‘œμ„ΈμŠ€ ```mermaid sequenceDiagram participant Admin as κ΄€λ¦¬μž participant Server as Headscale μ„œλ²„ participant Client as ν΄λΌμ΄μ–ΈνŠΈ PC participant Network as VPN λ„€νŠΈμ›Œν¬ Admin->>Server: 1. μ‚¬μš©μž 생성 Admin->>Server: 2. PreAuth ν‚€ 생성 Admin->>Client: 3. PreAuth ν‚€ 전달 Client->>Client: 4. Tailscale ν΄λΌμ΄μ–ΈνŠΈ μ„€μΉ˜ Client->>Server: 5. 등둝 μš”μ²­ (PreAuth ν‚€ 포함) Server->>Client: 6. 인증 μ™„λ£Œ 및 μ„€μ • 전달 Client->>Network: 7. VPN λ„€νŠΈμ›Œν¬ μ°Έμ—¬ Network->>Client: 8. λ‹€λ₯Έ λ…Έλ“œλ“€κ³Ό P2P μ—°κ²° ``` ### 상세 단계별 μ„€λͺ… #### 1. μ„œλ²„ μΈ‘ μž‘μ—… (κ΄€λ¦¬μž) ```bash # 1-1. μ‚¬μš©μž 생성 (ν•œ 번만) docker exec headscale headscale users create pharmacy-busan # 1-2. μ‚¬μš©μž λͺ©λ‘ 확인 docker exec headscale headscale users list # 1-3. PreAuth ν‚€ 생성 docker exec headscale headscale preauthkeys create --user 1 --expiration 1h # 좜λ ₯ μ˜ˆμ‹œ: # f8d9c7e4b2a6c8f4d9e7b3a5c8f4d9e7b3a5c8f4d9e7b3a5c8f4d9e7b3a5c8f4 ``` #### 2. ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μž‘μ—… ```bash # 2-1. κΈ°μ‘΄ μ—°κ²° ν•΄μ œ (μžˆλ‹€λ©΄) sudo tailscale logout sudo tailscale down # 2-2. Headscale μ„œλ²„μ— 등둝 sudo tailscale up \ --login-server=http://192.168.0.151:8070 \ --authkey=f8d9c7e4b2a6c8f4d9e7b3a5c8f4d9e7b3a5c8f4d9e7b3a5c8f4d9e7b3a5c8f4 \ --hostname=pharmacy-busan-pc1 \ --accept-dns=false # 2-3. μ—°κ²° μƒνƒœ 확인 tailscale status # 2-4. IP μ£Όμ†Œ 확인 tailscale ip -4 ``` #### 3. κ²°κ³Ό 확인 ```bash # μ„œλ²„μ—μ„œ λ…Έλ“œ λͺ©λ‘ 확인 docker exec headscale headscale nodes list # μ›Ή UIμ—μ„œ 확인 # - Headplane: http://192.168.0.151:3000 # - FARMQ Admin: http://192.168.0.151:5001 ``` --- ## πŸ₯ μ‹€μ œ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€ ### μ‹œλ‚˜λ¦¬μ˜€ 1: μƒˆ μ•½κ΅­ 등둝 ```bash # μ„œλ²„ μž‘μ—… (κ΄€λ¦¬μž) docker exec headscale headscale users create pharmacy-seoul docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 2h # ν΄λΌμ΄μ–ΈνŠΈ μž‘μ—… (μ•½κ΅­ PC) curl -O http://192.168.0.151:8000/add-client.sh chmod +x add-client.sh ./add-client.sh pharmacy-seoul pos-terminal-1 # PreAuth ν‚€ μž…λ ₯ μ‹œ μœ„μ—μ„œ μƒμ„±ν•œ ν‚€ μ‚¬μš© ``` ### μ‹œλ‚˜λ¦¬μ˜€ 2: μ—¬λŸ¬ PCκ°€ μžˆλŠ” μ•½κ΅­ ```bash # 같은 μ‚¬μš©μžλ‘œ μ—¬λŸ¬ λ¨Έμ‹  등둝 κ°€λŠ₯ sudo tailscale up --login-server=http://192.168.0.151:8070 --authkey=[KEY] --hostname=busan-pos1 sudo tailscale up --login-server=http://192.168.0.151:8070 --authkey=[KEY] --hostname=busan-pos2 sudo tailscale up --login-server=http://192.168.0.151:8070 --authkey=[KEY] --hostname=busan-office ``` ### μ‹œλ‚˜λ¦¬μ˜€ 3: μž„μ‹œ 접속 (λ…ΈνŠΈλΆ) ```bash # 짧은 λ§Œλ£Œμ‹œκ°„μœΌλ‘œ ν‚€ 생성 docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 30m # λ…ΈνŠΈλΆμ—μ„œ μž„μ‹œ μ—°κ²° sudo tailscale up --login-server=http://192.168.0.151:8070 --authkey=[TEMP_KEY] --hostname=manager-laptop ``` --- ## πŸ” μƒνƒœ 확인 및 관리 ### λͺ…λ Ήμ–΄ λͺ¨μŒ ```bash # === μ„œλ²„ μΈ‘ (Headscale) === # μ‚¬μš©μž 관리 docker exec headscale headscale users list docker exec headscale headscale users create [username] # λ…Έλ“œ 관리 docker exec headscale headscale nodes list docker exec headscale headscale nodes expire [node_id] # PreAuth ν‚€ 관리 docker exec headscale headscale preauthkeys list --user [user_id] docker exec headscale headscale preauthkeys create --user [user_id] --expiration [time] # === ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ (Tailscale) === # μƒνƒœ 확인 tailscale status # λ„€νŠΈμ›Œν¬ μƒνƒœ 및 μ—°κ²°λœ λ…Έλ“œλ“€ tailscale ip # λ‚΄ IP μ£Όμ†Œλ“€ tailscale netcheck # λ„€νŠΈμ›Œν¬ μ—°κ²°μ„± ν…ŒμŠ€νŠΈ tailscale ping [node] # νŠΉμ • λ…Έλ“œ ping # μ—°κ²° 관리 tailscale up # μ—°κ²° μ‹œμž‘ tailscale down # μ—°κ²° 쀑단 tailscale logout # λ‘œκ·Έμ•„μ›ƒ # 둜그 확인 sudo journalctl -u tailscaled -f ``` ### μ›Ή UI μ ‘κ·Ό ```bash # Headplane (κΈ°λ³Έ 관리 UI) http://192.168.0.151:3000 # API ν‚€: 8qRr1IB.tV95CmA0fLaCiGGIgBfeoN9daHceFkzI # FARMQ κ΄€λ¦¬μž νŽ˜μ΄μ§€ (ν•œκ΅­μ–΄) http://192.168.0.151:5001 ``` --- ## ⚠️ μ€‘μš”ν•œ μ£Όμ˜μ‚¬ν•­ ### 1. 포트 ν˜Όλ™ λ°©μ§€ - **ν΄λΌμ΄μ–ΈνŠΈ 등둝**: `8070` 포트 μ‚¬μš© - **μ›Ή 관리**: `3000`, `5001` 포트 μ‚¬μš© - **Docker λ‚΄λΆ€**: `8080` 포트 (μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Ό λΆˆκ°€) ### 2. PreAuth ν‚€ λ³΄μ•ˆ - ν‚€λŠ” 일회용 λ˜λŠ” μ œν•œλœ 횟수만 μ‚¬μš© κ°€λŠ₯ - 짧은 λ§Œλ£Œμ‹œκ°„ μ„€μ • ꢌμž₯ (1h ~ 24h) - ν‚€ λ…ΈμΆœ μ‹œ μ¦‰μ‹œ μƒˆ ν‚€ 생성 ### 3. λ„€νŠΈμ›Œν¬ ꡬ성 - λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈλŠ” `100.64.0.0/10` λŒ€μ—­ IP ν• λ‹Ή - 첫 번째 ν΄λΌμ΄μ–ΈνŠΈ: `100.64.0.1` (μ„œλ²„ 역할도 함) - 이후 ν΄λΌμ΄μ–ΈνŠΈλ“€: `100.64.0.2`, `100.64.0.3`, ... ### 4. λ°©ν™”λ²½ μ„€μ • ```bash # μ„œλ²„ μΈ‘ λ°©ν™”λ²½ (ν•„μš”μ‹œ) sudo ufw allow 8070/tcp # Headscale sudo ufw allow 3000/tcp # Headplane sudo ufw allow 5001/tcp # FARMQ Admin # ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ (Tailscale이 μžλ™ 처리) sudo ufw allow in on tailscale0 ``` --- ## 🚨 문제 ν•΄κ²° ### 일반적인 λ¬Έμ œλ“€ #### 1. "connection refused" 였λ₯˜ ```bash # 원인: μ„œλ²„ 포트 μ ‘κ·Ό λΆˆκ°€ # ν•΄κ²°: docker-compose ps # μ„œλ²„ μ‹€ν–‰ 확인 sudo ufw status # λ°©ν™”λ²½ 확인 ping 192.168.0.151 # μ„œλ²„ μ—°κ²° 확인 ``` #### 2. "invalid auth key" 였λ₯˜ ```bash # 원인: PreAuth ν‚€ 만료 λ˜λŠ” 잘λͺ»λœ ν‚€ # ν•΄κ²°: docker exec headscale headscale preauthkeys create --user [user_id] --expiration 1h ``` #### 3. "user not found" 였λ₯˜ ```bash # 원인: μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μž # ν•΄κ²°: docker exec headscale headscale users list # μ‚¬μš©μž 확인 docker exec headscale headscale users create [username] # μ‚¬μš©μž 생성 ``` #### 4. IP ν• λ‹Ήλ˜μ§€ μ•ŠμŒ ```bash # 진단: tailscale status # μ—°κ²° μƒνƒœ 확인 tailscale netcheck # λ„€νŠΈμ›Œν¬ ν…ŒμŠ€νŠΈ sudo journalctl -u tailscaled -f # 둜그 확인 # ν•΄κ²°: sudo systemctl restart tailscaled # μ„œλΉ„μŠ€ μž¬μ‹œμž‘ ``` ### 둜그 μœ„μΉ˜ ```bash # Headscale μ„œλ²„ 둜그 docker logs headscale # Headplane 둜그 docker logs headplane # Tailscale ν΄λΌμ΄μ–ΈνŠΈ 둜그 sudo journalctl -u tailscaled -f ``` --- ## πŸ“‹ 체크리슀트 ### μ„œλ²„ μ„€μΉ˜ μ™„λ£Œ 확인 - [ ] Docker 및 Docker Compose μ„€μΉ˜λ¨ - [ ] Headscale μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑 (포트 8070) - [ ] Headplane μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑 (포트 3000) - [ ] FARMQ Admin μ‹€ν–‰ 쀑 (포트 5001) - [ ] λ°©ν™”λ²½μ—μ„œ ν•„μš” 포트 μ—΄λ¦Ό ### ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° 확인 - [ ] Tailscale ν΄λΌμ΄μ–ΈνŠΈ μ„€μΉ˜λ¨ - [ ] μ„œλ²„μ— μ‚¬μš©μž 생성됨 - [ ] PreAuth ν‚€ 생성됨 (μœ νš¨ν•œ λ§Œλ£Œμ‹œκ°„) - [ ] `tailscale up` λͺ…λ Ήμ–΄ 성곡 - [ ] `tailscale status`μ—μ„œ λ‹€λ₯Έ λ…Έλ“œλ“€ λ³΄μž„ - [ ] VPN IP μ£Όμ†Œ 할당됨 (`100.64.0.x`) ### λ„€νŠΈμ›Œν¬ μ—°κ²° 확인 - [ ] μ„œλ²„ ping 성곡 (`ping 100.64.0.1`) - [ ] λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈμ™€ ping 성곡 - [ ] μ›Ή UI μ ‘κ·Ό κ°€λŠ₯ --- ## 🎯 λ‹€μŒ 단계 1. **μžλ™ν™” 슀크립트 ν™œμš©**: `add-client.sh`, `create-preauth-key.sh` μ‚¬μš© 2. **λͺ¨λ‹ˆν„°λ§ μ„€μ •**: FARMQ Adminμ—μ„œ μ‹€μ‹œκ°„ μƒνƒœ 확인 3. **λ°±μ—… μ „λž΅**: Headscale μ„€μ • 및 λ°μ΄ν„°λ² μ΄μŠ€ λ°±μ—… 4. **ν™•μž₯**: μƒˆλ‘œμš΄ μ•½κ΅­ 및 지점 μΆ”κ°€ --- **🎊 이제 μ™„μ „ν•œ 프라이빗 VPN λ„€νŠΈμ›Œν¬λ₯Ό μš΄μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€!**