ติดตั้ง Headscale VPN บน VPS แทน Tailscale Cloud

ติดตั้ง Headscale VPN บน VPS แทน Tailscale Cloud

มิถุนายน 2026 · อ่าน 9 นาที

Headscale คือ open-source implementation ของ Tailscale control server ทำให้รัน mesh VPN เป็น private โดยใช้ Tailscale client app ทุกตัว (iOS, Android, Mac, Windows, Linux) แต่ control plane อยู่บน VPS ตัวเอง ไม่ผ่าน Tailscale cloud ข้อมูล routing ทั้งหมดเป็นของเราเอง

ติดตั้ง Headscale บน VPS

# ดาวน์โหลด headscale binary
HEADSCALE_VERSION=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep tag_name | cut -d'"' -f4)
wget "https://github.com/juanfont/headscale/releases/download/${HEADSCALE_VERSION}/headscale_linux_amd64"
sudo mv headscale_linux_amd64 /usr/local/bin/headscale
sudo chmod +x /usr/local/bin/headscale

# หรือติดตั้งด้วย Docker:
mkdir -p ~/headscale/config ~/headscale/data

สร้าง Config File

sudo mkdir -p /etc/headscale
sudo nano /etc/headscale/config.yaml
server_url: https://hs.yourdomain.com
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 127.0.0.1:9090
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false

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

ip_prefixes:
  - 100.64.0.0/10

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

disable_check_updates: false
ephemeral_node_inactivity_timeout: 30m

db_type: sqlite3
db_path: /var/lib/headscale/db.sqlite

tls_letsencrypt_hostname: hs.yourdomain.com
tls_letsencrypt_cache_dir: /var/lib/headscale/cache

log:
  level: info

ตั้ง systemd Service

sudo useradd -m -d /var/lib/headscale -s /usr/sbin/nologin headscale
sudo mkdir -p /var/lib/headscale
sudo chown headscale:headscale /var/lib/headscale

sudo nano /etc/systemd/system/headscale.service
[Unit]
Description=headscale controller
After=network.target

[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=unless-stopped
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now headscale

สร้าง User และ Preauth Key

# สร้าง namespace/user
sudo headscale users create myteam

# สร้าง preauth key สำหรับ device ใหม่
sudo headscale preauthkeys create --user myteam --reusable --expiration 24h

# ดู key ที่สร้าง
sudo headscale preauthkeys list --user myteam

เพิ่ม Device ด้วย Tailscale Client

# บน Linux device:
curl -fsSL https://tailscale.com/install.sh | sh

# เชื่อมกับ Headscale แทน Tailscale cloud
sudo tailscale up --login-server https://hs.yourdomain.com --authkey PREAUTH_KEY_HERE

# ตรวจ devices ใน Headscale
sudo headscale nodes list
Tip: Headscale รองรับ Exit Node ทำให้ route traffic ทั้งหมดผ่าน VPS ได้ ตั้ง --advertise-exit-node บน VPS ที่ต้องการเป็น exit node แล้ว approve ใน headscale CLI

VPS ที่ใช้รัน Headscale ควรมี latency ต่ำกับ device ส่วนใหญ่ในเครือข่าย สำหรับทีมในไทยและอาเซียน VPS สิงคโปร์จาก asiagb.com ให้ latency ต่ำทั่วภูมิภาค เหมาะสำหรับเป็น Headscale control server ก่อนติดตั้ง ควรตรวจสอบ DNS และ port ด้วยเครื่องมือ dnsxray.com ว่า domain ชี้ถูกและ port 443 เปิดอยู่


ตรวจสอบว่า Headscale ทำงานถูกต้อง

# ตรวจ service
sudo systemctl status headscale

# ดู nodes ที่เชื่อมต่อ
sudo headscale nodes list

# ดู routes
sudo headscale routes list

# ตรวจ connectivity ระหว่าง nodes
# จาก node หนึ่ง ping ไปอีก node ด้วย Tailscale IP
ping 100.64.0.2
Tip: ใช้ tailscale status บนทุก device เพื่อดูว่า peer ทั้งหมดเชื่อมต่อกันถูกต้อง และ tailscale ping PEER_IP ทดสอบ connectivity ระหว่าง device

แก้ปัญหาที่พบบ่อย

Device ไม่สามารถ connect กับ Headscale

ตรวจ DNS ของ hs.yourdomain.com และ port 443 เปิดอยู่ ดู Headscale logs:

sudo journalctl -u headscale -f
# ดู error เกี่ยวกับ TLS หรือ connection refused

SSL Certificate ไม่ออก (LetsEncrypt fail)

Port 80 ต้องเปิดสำหรับ ACME challenge หรือใช้ DNS challenge แทน:

sudo ufw allow 80
sudo systemctl restart headscale

Nodes ไม่สามารถ ping กันได้แม้ connect แล้ว

อาจเป็น DERP server ที่ไม่ได้ตั้ง ลอง enable built-in DERP server:

# /etc/headscale/config.yaml
derp:
  server:
    enabled: true
    region_id: 999
    region_code: "headscale"
    region_name: "Headscale Embedded DERP"
    stun_listen_addr: "0.0.0.0:3478"

Preauth Key หมดอายุ (expired)

สร้าง key ใหม่ preauth key มีอายุจำกัดต้องสร้างใหม่ทุกครั้ง:

sudo headscale preauthkeys create --user myteam --reusable --expiration 7d

คำถามที่พบบ่อย

Headscale กับ WireGuard ตรงๆ ต่างกันอย่างไร?

WireGuard เป็น low-level VPN protocol ที่ต้อง configure manually ทุก peer Headscale/Tailscale ใช้ WireGuard เป็น underlying transport แต่จัดการ key exchange และ routing อัตโนมัติผ่าน control plane เพิ่ม device ใหม่ง่ายกว่ามาก

Headscale รองรับ iOS/Android ไหม?

ได้ ใช้ Tailscale official app บน iOS และ Android จากนั้นไป Settings > เปลี่ยน coordination server เป็น URL ของ Headscale แล้ว login ด้วย preauth key

Headscale ฟรีไหม? มี device limit ไหม?

Headscale เป็น open-source 100% ไม่มีค่าใช้จ่ายและไม่มี device limit ต่างจาก Tailscale Free tier ที่ limit 100 devices และบาง features ต้องจ่าย