ติดตั้ง Headscale VPN บน VPS แทน Tailscale Cloud
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
--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
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 ต้องจ่าย