Tailscale Networking Windows Python Self-hosted

เปิด Local Server สู่อินเทอร์เน็ต
ด้วย Tailscale Funnel

ไม่ต้องพอร์ตฟอร์เวิร์ด ไม่ต้อง Public IP — แค่ติดตั้ง Tailscale แล้วรันคำสั่งเดียว ใครก็เข้าถึง local service ของคุณได้จากทั่วโลก

เวลาอ่าน ~8 นาที ระดับ: Beginner–Intermediate ทดสอบบน Windows 11
// สารบัญ
  1. Tailscale Funnel คืออะไร?
  2. หลักการทำงาน
  3. สิ่งที่ต้องมี
  4. ขั้นตอนที่ 1 — ติดตั้ง Tailscale
  5. ขั้นตอนที่ 2 — เปิด MagicDNS และ HTTPS
  6. ขั้นตอนที่ 3 — เพิ่ม Funnel ใน Policy
  7. ขั้นตอนที่ 4 — รัน Python Web Server
  8. ขั้นตอนที่ 5 — เปิด Funnel
  9. Bonus: หน้า HTML นาฬิกา
  10. เคล็ดลับและข้อควรระวัง

01 Tailscale Funnel คืออะไร?

ปกติถ้าเราต้องการให้คนภายนอกเข้าถึง web server บนเครื่องของเรา เราต้องทำ Port Forwarding บน router ซึ่งยุ่งยาก และหลายๆ ISP ก็ไม่อนุญาต โดยเฉพาะถ้าเราอยู่หลัง CGNAT

Tailscale Funnel แก้ปัญหานี้ได้อย่างสวยงาม — มันสร้าง encrypted tunnel จากอินเทอร์เน็ตสาธารณะเข้ามาหา service บนเครื่องเราโดยตรง โดยที่ IP จริงของเราจะถูกซ่อนอยู่ตลอดเวลา

💡

เปรียบเทยบง่ายๆ: Tailscale Funnel เหมือน ngrok หรือ Cloudflare Tunnel แต่ผูกกับ VPN network ของ Tailscale ทำให้ตั้งค่าง่ายมากและได้ HTTPS อัตโนมัติ

02 หลักการทำงาน

เมื่อมีคนเข้า Funnel URL ของเรา การเดินทางของ request จะเป็นดังนี้:

ผู้ใช้ทั่วไป
🌐 Browser
Tailscale
Funnel Relay
Tailscale VPN
TCP Proxy
เครื่องเรา
localhost:3000

จุดสำคัญคือ Funnel Relay ไม่สามารถอ่านเนื้อหา ของ traffic ได้เลย เพราะข้อมูลถูก encrypt ด้วย TLS ตั้งแต่ browser จนถึง service บนเครื่องเรา (End-to-End Encryption)

03 สิ่งที่ต้องมี

รายการ รายละเอียด สถานะ
Tailscale Account สมัครฟรีที่ tailscale.com (ใช้ได้ทุก plan) ต้องมี
Tailscale Client Version 1.38.3 ขึ้นไป ต้องมี
Python ใช้สำหรับรัน HTTP Server (ฟรี) ต้องมี
OS Windows / Linux / macOS (บทความนี้ใช้ Windows) ใช้ได้ทุกระบบ
Port Forwarding ไม่จำเป็น — Tailscale จัดการให้ทั้งหมด ไม่ต้อง

04 ขั้นตอนที่ 1 — ติดตั้ง Tailscale

เข้าไปที่ tailscale.com/download แล้วดาวน์โหลด installer ตาม OS ที่ใช้ ในบทความนี้ใช้ Windows

หลังติดตั้งเสร็จ ให้ login ด้วย Google, GitHub, Microsoft หรือ email ตรวจสอบ version ด้วยคำสั่ง:

PowerShell (Admin)
tailscale version
⚠️

ต้องได้ version 1.38.3 หรือใหม่กว่า เท่านั้นถึงจะใช้ Funnel ได้ ถ้าเก่ากว่าให้อัปเดตก่อน

05 ขั้นตอนที่ 2 — เปิด MagicDNS และ HTTPS

เข้า Tailscale Admin Console ที่ login.tailscale.com/admin/dns

1

เปิด MagicDNS

หาส่วน MagicDNS แล้วคลิก Enable — ฟีเจอร์นี้ทำให้ทุกเครื่องใน tailnet มีชื่อ DNS ใช้งานได้ทันที

2

เปิด HTTPS Certificates

ยังอยู่ในหน้าเดิม หาส่วน HTTPS Certificates แล้วคลิก Enable — Tailscale จะออก TLS certificate จาก Let's Encrypt ให้อัตโนมัติ

06 ขั้นตอนที่ 3 — เพิ่ม Funnel ใน Policy File

เข้าหน้า login.tailscale.com/admin/acls แล้วคลิก JSON editor

เพิ่ม block nodeAttrs เข้าไปใน JSON โดยวางไว้ก่อน } ปิดสุดท้าย:

Tailscale Policy JSON
{
  // ... ส่วนอื่นที่มีอยู่แล้ว ...

  // เพิ่มส่วนนี้เข้าไป
  "nodeAttrs": [
    {
      "target": ["autogroup:member"],
      "attr":   ["funnel"],
    },
  ],
}

กด Save — ระบบจะ validate และบันทึกให้อัตโนมัติ

ℹ️

autogroup:member หมายถึงทุก user ในทีม Tailscale ของเรา สามารถแก้ให้จำกัดเฉพาะบาง user ได้ภายหลัง

07 ขั้นตอนที่ 4 — รัน Python Web Server

Tailscale Funnel ทำหน้าที่เป็น tunnel เท่านั้น — เราต้องมี web server จริงๆ รันอยู่บนเครื่องด้วย Python มี HTTP server built-in ที่ใช้งานได้ทันที

1. สร้างโฟลเดอร์และวางไฟล์

PowerShell (Admin)
# สร้างโฟลเดอร์
mkdir C:\webroot

# วาง index.html ไว้ที่ C:\webroot\index.html

2. รัน Python Server

PowerShell (Admin)
cd C:\webroot
python -m http.server 3000

ถ้าทำงานได้จะเห็น output แบบนี้:

Output
Serving HTTP on 0.0.0.0 port 3000 (http://0.0.0.0:3000/) ...
⚠️

ถ้าพิมพ์ python แล้วไม่พบคำสั่ง ลองใช้ python3 หรือ py แทน หรือดาวน์โหลด Python ที่ python.org

08 ขั้นตอนที่ 5 — เปิด Tailscale Funnel

เปิด PowerShell (Administrator) หน้าต่างใหม่ (อย่าปิดหน้าต่าง Python) แล้วรัน:

PowerShell (Admin) — หน้าต่างใหม่
# รันแบบ foreground (ต้องค้างหน้าต่างไว้)
tailscale funnel 3000

# หรือรันแบบ background (แนะนำ — ปิด terminal ได้)
tailscale funnel --bg 3000

ถ้าสำเร็จจะเห็น output แบบนี้:

Output
Available on the internet:

https://your-machine.tail083038.ts.net/
|-- / proxy http://127.0.0.1:3000

Press Ctrl+C to exit.

เสร็จแล้ว! URL ที่ได้คือ public URL ที่ใครก็เข้าได้จากทั่วโลก ทดสอบโดยเปิดเบราว์เซอร์แล้วไปที่ URL นั้นได้เลย

09 Bonus — หน้า HTML นาฬิกา Real-Time

ลองสร้างไฟล์ index.html ง่ายๆ ที่แสดงเวลาปัจจุบัน วางไว้ที่ C:\webroot\index.html:

HTML / JavaScript
<!DOCTYPE html>
<html lang="th">
<head>
  <meta charset="UTF-8">
  <title>Clock</title>
  <style>
    body { background:#111; color:#00ffe0; font-family:monospace;
           display:flex; align-items:center; justify-content:center;
           height:100vh; margin:0; }
    #clock { font-size: 80px; }
  </style>
</head>
<body>
  <div id="clock"></div>
  <script>
    function tick() {
      document.getElementById('clock').textContent
        = new Date().toLocaleTimeString('th-TH');
    }
    tick();
    setInterval(tick, 1000);
  </script>
</body>
</html>

10 เคล็ดลับและข้อควรระวัง

🔒 ข้อจำกัดของ Funnel

Funnel รองรับเฉพาะ port 443, 8443, และ 10000 เท่านั้น — แต่เราสามารถ map port ใดก็ได้บนเครื่องเราไปหา port เหล่านี้ได้ ในตัวอย่างนี้ Python รันที่ port 3000 และ Funnel expose ออกไปเป็น HTTPS (443) ให้โดยอัตโนมัติ

⏱ DNS Propagation

หลังเปิด Funnel ครั้งแรก อาจต้องรอประมาณ 5–10 นาที ให้ DNS records กระจายออกสู่สาธารณะก่อนที่ URL จะเข้าได้จากภายนอก

🔁 ทำให้ทำงานถาวร (Auto-start)

ถ้าต้องการให้ Funnel + Python server ทำงานตั้งแต่เปิดเครื่อง สามารถสร้าง batch file แล้วใส่ใน Windows Task Scheduler ได้:

start-server.bat
@echo off
cd C:\webroot
start python -m http.server 3000
tailscale funnel --bg 3000

🛑 วิธีปิด Funnel

PowerShell (Admin)
# ปิด Funnel บน port 3000
tailscale funnel --bg 3000 off

# หรือ reset ทั้งหมด
tailscale funnel --reset
🚨

ข้อควรระวัง: เมื่อเปิด Funnel แล้ว ทุกคนบนโลก สามารถเข้าถึง service ของเราได้ อย่า expose service ที่มีข้อมูลสำคัญหรือไม่มี authentication โดยไม่ตั้งใจ

เขียนจากประสบการณ์จริง · ทดสอบบน Windows 11 + Tailscale v1.38+

อ้างอิง: tailscale.com/docs/features/tailscale-funnel