ปัญหาที่ 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
- ไปที่ tailscale.com → Sign in with Google/GitHub
- ใน 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 ส่วนตัวก่อน เห็นข้อดีแล้วค่อยไปเสนอทีม