← กลับ
VPNSecurityNetworkSelf-hosted

Tailscale + WireGuard — VPN ที่ DevOps ต้องลอง

เลิกเปิด port 22 / 5432 สู่ public ใช้ private network ระหว่าง server แทน ตั้ง 5 นาที ฟรีถึง 100 device

2026-05-01อ่าน 8 นาทีใหม่

ปัญหาที่ public IP มีให้

ทุกครั้งที่เปิด port สู่ internet — มีคนพยายาม brute force/scan ทันที

ลอง tail -f /var/log/auth.log บน server ใหม่ — ภายใน 5 นาทีจะเห็น login attempt จาก IP ทั่วโลกหลายร้อยครั้ง bot scan internet ตลอดเวลา

แม้จะตั้ง fail2ban + key-only auth ก็ยังเสี่ยง:

  • 0-day exploit ของ SSH (rare แต่เคยเกิด)
  • Key หลุด
  • Misconfig firewall

ทางที่ดีกว่า: ปิด public port หมด เข้า server ผ่าน private network เท่านั้น

VPN แบบเก่า vs Mesh VPN

VPN รุ่นเก่า (OpenVPN, IPSec):

  • Hub-and-spoke — ทุก client เชื่อมไปที่ central server
  • Central server ตายทั้งหมดล่ม
  • Setup ซับซ้อน

Mesh VPN (Tailscale, Nebula, ZeroTier):

  • ทุก device เชื่อมตรงกันแบบ peer-to-peer
  • ไม่มี single point of failure
  • Setup ง่ายมาก

Tailscale คืออะไร

Tailscale = mesh VPN ที่สร้างจาก WireGuard (protocol ที่เร็วและ secure ที่สุดใน 2026)

ตัว Tailscale ทำให้ setup ง่าย:

  • Coordination server จัดการ key exchange + NAT traversal
  • ทุก device install client ตัวเดียว — login ผ่าน Google/GitHub/SSO
  • ได้ private IP ในช่วง 100.x.x.x ที่ทุก device ในเครือข่ายคุยกันได้

ฟรี: 100 device, 3 user — เพียงพอสำหรับ project ส่วนตัว/ทีมเล็ก

ตั้ง Tailscale ใน 5 นาที

Step 1: สมัคร + login

  1. ไปที่ tailscale.com → Sign in with Google/GitHub
  2. ใน admin console เห็น overview เครือข่ายของเรา (ชื่อว่า "tailnet")

Step 2: ติดตั้งบนเครื่องแต่ละตัว

บน Mac:

brew install --cask tailscale
# เปิด app → login

บน Linux server:

curl -fsSL https://tailscale.com/install.sh | sh

# เริ่ม tailscale
sudo tailscale up

# จะเห็น URL → เปิดในเบราว์เซอร์ login

หลัง login รัน tailscale ip เห็น IP ในช่วง 100.x.x.x แล้ว

บนมือถือ: ดาวน์โหลด Tailscale app

Step 3: ทดสอบ

จากเครื่อง Mac:

ssh [email protected]   # IP ที่ tailscale ของ server ให้

หรือใช้ MagicDNS — ตั้งใน admin console จะเรียก server ด้วยชื่อได้:

ssh deploy@my-server

Step 4: ปิด port public

ตอนนี้เข้าผ่าน Tailscale ได้แล้ว — ปิด SSH port public:

sudo ufw deny 22/tcp                  # ปิด SSH from internet
sudo ufw allow in on tailscale0       # อนุญาต Tailscale interface
sudo ufw reload

ตรวจสอบ:

sudo ufw status
# ควรเห็น 22/tcp DENY
# Tailscale interface ALLOW

ลองจาก IP สาธารณะ — connect ไม่ได้ ผ่าน Tailscale — ได้

ใช้กับ Database / Internal Service

ก่อน: เปิด port 5432 ของ Postgres สู่ internet → เสี่ยงโดน brute force

หลัง: Postgres listen เฉพาะ Tailscale interface

/etc/postgresql/16/main/postgresql.conf:

listen_addresses = '127.0.0.1, 100.64.0.5'   # Tailscale IP

/etc/postgresql/16/main/pg_hba.conf:

host    all     all     100.0.0.0/8     md5
sudo systemctl restart postgresql

ตอนนี้ database connect ได้แค่จาก Tailscale network — public ไม่ผ่าน

Tailscale Funnel — expose service public ผ่าน Tailscale

ถ้าอยากให้ public reach service บางตัวที่อยู่บน private:

# expose service บน port 3000 ผ่าน https://your-machine.your-tailnet.ts.net
sudo tailscale serve --bg --https=443 3000
sudo tailscale funnel 443 on

Tailscale ออก SSL cert ให้อัตโนมัติ + reverse proxy ให้

ดี: ไม่ต้องตั้ง Nginx + Certbot ใช้กับ webhook receiver, demo, dev preview

Tailscale SSH

ลืม SSH key — ใช้ Tailscale identity ทำ auth แทน

ใน admin console เปิด SSH สำหรับ device แล้ว:

tailscale ssh deploy@my-server

ไม่ต้องใช้ key เลย — Tailscale verify identity จากการ login

ACL — จำกัดใครเข้าถึงอะไร

ใน admin console → Access Controls เขียน policy:

{
  "groups": {
    "group:devs": ["[email protected]", "[email protected]"],
    "group:ops": ["[email protected]"],
  },
  "acls": [
    {
      "action": "accept",
      "src": ["group:ops"],
      "dst": ["*:*"]
    },
    {
      "action": "accept",
      "src": ["group:devs"],
      "dst": ["tag:dev:*"]
    }
  ],
  "tagOwners": {
    "tag:dev": ["group:ops"],
    "tag:prod": ["group:ops"]
  }
}

ทีม dev เข้าได้แค่ server ที่ tag dev ทีม ops เข้าได้ทุกที่

Self-host WireGuard เองได้มั้ย

ได้ — ถ้าไม่อยาก depend Tailscale คืน lock-in

WireGuard เป็น protocol ใน Linux kernel ตั้งเองได้:

sudo apt install wireguard

# generate key
wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

แต่ต้องตั้งเอง:

  • Config peer ทุกตัว (key, IP, allowed_ips)
  • DNS / discovery
  • NAT traversal
  • Firewall

Headscale (open-source clone ของ Tailscale coordination server) ทำให้ self-host ง่ายขึ้น — ใช้ Tailscale client แต่ control plane เป็นของเราเอง

# self-host coordination server
docker run -d \
  --name headscale \
  -v ./config:/etc/headscale \
  -p 8080:8080 \
  headscale/headscale:0.23 \
  headscale serve

แล้ว config Tailscale client ให้ไปที่ Headscale แทน:

sudo tailscale up --login-server=https://your-headscale-server.com

ทางเลือกอื่น

ZeroTier — mesh VPN เก่ากว่า Tailscale ฟรี 25 device

Nebula (Slack open source) — performance สูง config ผ่าน YAML

Cloudflare WARP / Tunnel — Zero Trust ของ Cloudflare ดีถ้าใช้ Cloudflare อยู่แล้ว

Twingate — focused ที่ access management

ใช้กับ CI/CD

ตั้ง GitHub Actions ให้ deploy ผ่าน Tailscale (ไม่ต้องเปิด port SSH public):

- name: Tailscale
  uses: tailscale/github-action@v3
  with:
    oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
    oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
    tags: tag:ci

- name: Deploy
  uses: appleboy/[email protected]
  with:
    host: my-server          # MagicDNS name (ไม่ต้องใส่ IP)
    username: deploy
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    script: |
      cd /var/www/myapp && git pull && pm2 reload ecosystem.config.js

GitHub Actions runner join Tailnet ชั่วคราว → SSH ถึง server ผ่าน private IP → จบงาน leave

ปัญหาที่เจอ

tailscale up ค้าง — IPv6 มีปัญหากับบาง ISP ลอง:

sudo tailscale up --netfilter-mode=off

Throughput ต่ำ — บน hetzner หรือ low-end VPS ที่ไม่มี aes-ni — ใช้ chacha20 แทน:

sudo tailscale up --advertise-routes=...
# config ใน admin

Re-key เกิน 100 device — Tailscale ฟรีจำกัด 100 device — เกินต้อง paid

Best Practice

  • ปิด public port ทันทีหลัง Tailscale ใช้ได้
  • ใช้ tag ทุก device + ACL จำกัด access
  • Enable Tailscale SSH แทน manage SSH key
  • Audit log เปิดใน admin console — เห็น activity ทั้งหมด
  • Setup Backup access — ถ้า Tailscale ล่ม — ต้องมีวิธี emergency เข้า server (เช่น ผ่าน console ของ provider)

สรุป

ปี 2026 ไม่มีเหตุผลที่จะเปิด port 22 (หรืออะไรก็ตาม) สู่ internet ตรงๆ

Tailscale ตั้งครั้งเดียว 5 นาที → ทุก server, laptop, มือถือของทีมอยู่ใน private network เดียวกัน → SSH/database/admin tool ทั้งหมด ปลอดภัยขึ้น 10 เท่า

ลองวันนี้ — สมัครฟรี ใช้กับ project ส่วนตัวก่อน เห็นข้อดีแล้วค่อยไปเสนอทีม

← ดูบทความอื่น