เข้า โฮมเซิร์ฟเวอร์ จากข้างนอกโดยไม่เปิดพอร์ต WireGuard vs Tailscale
เทียบ 3 ทาง: port forward + DDNS, WireGuard ตรง, Tailscale (และ Headscale) พร้อม config ขั้นต่ำบน Ubuntu 24.04 ข้อแลกเปลี่ยน และสิ่งที่ยังต้องกันแม้อยู่หลัง VPN
- พอร์ตที่เปิดสู่อินเทอร์เน็ตโดนสแกนและลองเจาะภายในชั่วโมง ไม่ใช่วัน
- WireGuard เงียบต่อแพ็กเก็ตที่ไม่มีคีย์ถูกต้อง สแกนไม่เห็น แต่ยังต้องเปิด UDP หนึ่งพอร์ตที่เราเตอร์
- Tailscale ทะลุ NAT ให้โดยไม่เปิดพอร์ตเลย แลกกับการมีคนกลางใน control plane (เลี่ยงได้ด้วย Headscale)
- บริการเว็บสาธารณะไม่ควรวิ่งจากเครื่องที่บ้าน ใช้ VPS reverse proxy หรือ tunnel แทน
อยากเข้าเครื่องที่บ้านจากข้างนอก ปัญหามีสองครึ่ง ครึ่ง “ชื่อ” คือ IP บ้านเปลี่ยนตลอด แก้ด้วย DDNS (บทความคู่กัน) ครึ่ง “ทางเข้า” คือจะให้แพ็กเก็ตจากข้างนอกเข้าถึงเครื่องเราได้ยังไงโดยไม่กลายเป็นเป้าของบอททั้งอินเทอร์เน็ต บทนี้ว่าด้วยครึ่งหลัง เทียบ 3 ทาง: port forward แบบเดิม, WireGuard ตั้งเอง, และ Tailscale
คำสั่งทั้งหมดทดสอบบน Ubuntu 24.04
ทำไมเปิดพอร์ตแล้วโดนทันที
ไม่มีใครเล็งบ้านเรา แต่มีบอทสแกนทุก IPv4 ซ้ำ ๆ ทั้งวัน Unit 42 ของ Palo Alto Networks วาง honeypot 320 ตัวบนคลาวด์ (ปี 2021) 80% ถูกเจาะภายใน 24 ชั่วโมง และทุกตัวถูกเจาะภายในหนึ่งสัปดาห์ SSH เป็นบริการที่โดนมากที่สุด บางบริการโดนภายใน 30 วินาทีหลังเปิด เครื่องที่บ้านไม่ต่างกัน แค่เปิด port forward 22 หรือ 3389 ไว้ ล็อกจะเต็มภายในคืนเดียว
port forward + DDNS จึงเป็นทางที่ “ใช้ได้” แต่ต้องรับผิดชอบทุกบริการที่โผล่ออกไป: แพตช์ทัน, ไม่มีรหัสผ่านอ่อน, ไม่มี admin panel ที่ลืมปิด พลาดจุดเดียวคือทั้งบ้าน
WireGuard ทำงานยังไงในย่อหน้าเดียว
WireGuard คือ VPN ระดับ kernel ที่ตัดทุกอย่างเหลือแค่จำเป็น แต่ละฝั่งมีคู่คีย์ Curve25519 (เหมือน SSH key) และรู้ public key ของอีกฝั่งล่วงหน้า วิ่งบน UDP ทำ handshake 1 รอบ (Noise_IK) แล้วเข้ารหัสด้วย ChaCha20-Poly1305 จุดสำคัญด้านความปลอดภัย: ถ้าแพ็กเก็ตที่เข้ามาไม่ผ่านการตรวจคีย์ เซิร์ฟเวอร์จะ ไม่ตอบอะไรเลย ไม่มี banner ไม่มี error ไม่จองหน่วยความจำ เครื่องสแกนจึงเห็นพอร์ตนั้นเหมือนไม่มีอะไรฟังอยู่ ต่างจาก SSH หรือ HTTPS ที่ตอบกลับทุกคนที่เคาะ
เปิด UDP 51820 ที่มี WireGuard ฟังอยู่ ปลอดภัยกว่าเปิด TCP 22 ที่มี sshd ฟังอยู่คนละชั้น เพราะคนไม่มีคีย์ไม่ได้แม้แต่คำตอบ
WireGuard ขั้นต่ำ: เซิร์ฟเวอร์ + 1 peer
ทางนี้ยังต้องเปิด UDP หนึ่งพอร์ต ที่เราเตอร์ชี้มาเครื่องที่บ้าน (และต้องมี DDNS ให้โน้ตบุ๊กรู้ว่าบ้านอยู่ IP ไหน)
บนเซิร์ฟเวอร์ที่บ้าน
sudo apt install wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
ทำแบบเดียวกันบนโน้ตบุ๊ก (ได้ laptop.key / laptop.pub) แล้วแลกเฉพาะ .pub กัน ไฟล์ .key ห้ามออกจากเครื่องตัวเอง
เซิร์ฟเวอร์: /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <เนื้อหา server.key>
[Peer]
# laptop
PublicKey = <เนื้อหา laptop.pub>
AllowedIPs = 10.8.0.2/32
โน้ตบุ๊ก: wg0.conf
[Interface]
Address = 10.8.0.2/24
PrivateKey = <เนื้อหา laptop.key>
[Peer]
PublicKey = <เนื้อหา server.pub>
Endpoint = home.example.net:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
เปิดใช้ทั้งสองฝั่ง
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0 # ให้ขึ้นเองตอนบูต
sudo wg # ดู handshake ล่าสุดและปริมาณข้อมูล
จากโน้ตบุ๊ก ssh dev@10.8.0.1 เข้าได้แปลว่าเสร็จ
จุดที่คนพลาด: AllowedIPs ไม่ใช่แค่ “ปล่อยให้ใครเข้า” แต่คือตารางเส้นทางด้วย (cryptokey routing) ฝั่งเซิร์ฟเวอร์ตั้ง /32 ต่อ peer ฝั่งโน้ตบุ๊กตั้ง /24 ของเครือข่าย VPN ถ้าตั้ง 0.0.0.0/0 จะส่งทราฟฟิกทั้งหมดผ่านบ้าน ซึ่งไม่ใช่สิ่งที่ต้องการในกรณีนี้ ส่วน PersistentKeepalive = 25 จำเป็นเมื่อโน้ตบุ๊กอยู่หลัง NAT ไม่งั้นหลังเงียบไปสักพัก NAT จะลืมทางกลับ
Tailscale เพิ่มอะไร
Tailscale ใช้ WireGuard เหมือนกันใน data plane แต่แก้งานน่าเบื่อสองอย่าง: การแจกคีย์ และ NAT
- coordination server ทำหน้าที่เป็น “กล่องฝาก public key” ทุกเครื่องล็อกอินด้วย identity (Google, GitHub, Microsoft ฯลฯ) สร้างคีย์ในเครื่อง ส่งแค่ public key ขึ้นไป แล้วรับ public key ของเครื่องอื่นในเครือข่ายเดียวกัน ไม่ต้องแลก
.pubเอง - NAT traversal ใช้ STUN/ICE เจาะทางตรงระหว่างเครื่องสองเครื่องที่อยู่หลัง NAT คนละที่ ไม่ต้องเปิดพอร์ตที่เราเตอร์ ถ้าเจาะไม่ได้ (NAT แข็ง หรือบล็อก UDP) จะวิ่งผ่าน DERP relay ซึ่งส่งต่อแพ็กเก็ตที่เข้ารหัสแล้ว อ่านไม่ได้
- MagicDNS ตั้งชื่อให้ทุกเครื่องอัตโนมัติ
ssh home-nasแทน IP - ACL นโยบายกลางว่าใครคุยกับใครได้พอร์ตไหน บังคับที่ทุกเครื่องตอนถอดรหัส
- Tailscale SSH (
tailscale set --ssh) ให้ identity ของ tailnet แทน SSH key และบังคับ MFA ซ้ำได้ด้วย check mode
ติดตั้งบน Ubuntu ใช้สคริปต์ของ Tailscale แล้ว sudo tailscale up เปิดลิงก์ล็อกอินให้ ทุกเครื่องที่ล็อกอินบัญชีเดียวกันคุยกันได้ทันที
ข้อแลกเปลี่ยนของ Tailscale
- คนกลางใน control plane Tailscale อ่านข้อมูลไม่ได้ แต่รู้ว่าเครื่องเรามีกี่ตัว ชื่ออะไร IP สาธารณะไหน และเป็นผู้ตัดสินว่า public key ใครถูกแจกให้ใคร ถ้าบัญชี identity provider หลุด คนนั้นเข้าทุกเครื่องได้
- พึ่งบริการภายนอก control plane ล่ม = เครื่องใหม่เข้าร่วมไม่ได้ (เครื่องที่ต่ออยู่แล้วยังคุยกันได้ เพราะ data plane เป็น peer-to-peer)
- แพลนฟรีมีขอบ ตอนเขียนหน้าราคาระบุ Personal ฟรี 6 ผู้ใช้ อุปกรณ์ไม่จำกัด ตัวเลขนี้เคยเปลี่ยนมาแล้ว ตรวจหน้าราคาปัจจุบัน
- ฟีเจอร์ขั้นสูง บางอย่าง (เช่น ACL แบบละเอียด, log ตรวจสอบ) อยู่ในแพลนเสียเงิน ตรวจกับเอกสารปัจจุบัน
Headscale: control plane ของตัวเอง
Headscale เป็น open source ที่เขียน control server ของ Tailscale ขึ้นใหม่ ใช้ client Tailscale ตัวเดิมได้ ชี้มาที่เซิร์ฟเวอร์เรา (tailscale up --login-server https://hs.example.net) ได้แจกคีย์ ได้ NAT traversal ได้ MagicDNS โดยไม่มีบริษัทไหนอยู่ตรงกลาง
ข้อควรรู้จาก README ของโปรเจกต์: ตั้งใจให้ครอบ tailnet เดียว สำหรับคนทำแล็บส่วนตัวหรือองค์กร open source เล็ก ไม่ได้วางเป้าให้องค์กรใหญ่ และต้องมีเซิร์ฟเวอร์สาธารณะหนึ่งตัวรัน Headscale (VPS เล็ก ๆ พอ) ที่เราต้องดูแลเอง ถ้าใช้ DERP ของ Tailscale ต่อก็ยังมีทราฟฟิก relay ผ่านเขาเวลาเจาะตรงไม่ได้ จะปิดจุดนี้ต้องรัน DERP เองด้วย
ตารางตัดสินใจ
| สถานการณ์ | แนะนำ | เหตุผล |
|---|---|---|
| โฮมแล็บ ใช้คนเดียว 2-5 เครื่อง | Tailscale ฟรี หรือ WireGuard ตรง | Tailscale ติดตั้ง 5 นาที ไม่เปิดพอร์ต; WireGuard ถ้าอยากไม่พึ่งใครและมีแค่ 1-2 peer |
| ทีมเล็ก หลายคน หลายบ้าน | Tailscale (ACL + SSH) หรือ Headscale | identity กลางตัดสิทธิ์ได้ทันทีเมื่อคนออก; Headscale เมื่อนโยบายห้ามคนกลาง |
| เปิดเว็บสาธารณะ 1 บริการให้คนทั่วไป | VPS + reverse proxy หรือ tunnel ไปเครื่องบ้าน | เป้าโดนยิงคือ VPS ไม่ใช่เครือข่ายบ้าน; เครื่องบ้านต่อออกไปหา VPS ผ่าน WireGuard/Tailscale ไม่เปิดพอร์ตขาเข้า |
เครื่องที่บ้านไม่ควรรับทราฟฟิกจากคนแปลกหน้าตรง ๆ ถ้าต้องมีเว็บสาธารณะ ให้ของที่โดนยิงเป็น VPS ราคา 5 ดอลลาร์ ไม่ใช่ NAS ที่มีรูปครอบครัว
อยู่หลัง VPN แล้วยังต้องทำอะไร
VPN ลดคนที่ “เคาะประตูได้” จากทั้งอินเทอร์เน็ตเหลือเครื่องที่มีคีย์ แต่ไม่ได้ทำให้ประตูแข็งขึ้น
- อัปเดต
unattended-upgradesยังจำเป็น เครื่องในเครือข่ายเดียวกันตัวหนึ่งโดนมัลแวร์ อีกตัวก็อยู่ในรัศมี - ไฟร์วอลล์ในเครื่อง
ufwอนุญาตบริการเฉพาะจาก interface VPN เช่นsudo ufw allow in on wg0 to any port 22(Tailscale ใช้tailscale0) และไม่ปล่อย 22 ออก LAN ถ้าไม่จำเป็น - SSH ยังต้องเป็นคีย์ ปิดรหัสผ่าน ปิด root ตามบทตั้งค่า SSH VPN ไม่ใช่ข้ออ้างให้เปิดรหัสผ่านกลับ
- ดูแลคีย์เหมือนรหัสผ่าน โน้ตบุ๊กหาย = ลบ peer ออกจาก
wg0.confหรือลบเครื่องใน admin console ทันที - บริการใน LAN ที่ไม่มี auth (printer, IoT, admin panel) มองเห็นได้จากทุกเครื่องใน VPN ตั้ง ACL หรือ
AllowedIPsให้แคบที่สุด
แหล่งอ้างอิง
คำถามที่พบบ่อย
Tailscale เห็นข้อมูลที่เราส่งไหม
ไม่เห็น ข้อมูลเข้ารหัสด้วย WireGuard ระหว่างเครื่องต่อเครื่อง private key ไม่เคยออกจากเครื่อง coordination server เห็นแค่ public key, IP และนโยบาย ส่วน DERP relay ส่งต่อแพ็กเก็ตที่เข้ารหัสแล้วเท่านั้น
ใช้ WireGuard ตรงแล้วต้องเปิดพอร์ตที่เราเตอร์ไหม
ต้องเปิด UDP หนึ่งพอร์ต (เช่น 51820) ไปที่เซิร์ฟเวอร์ แต่ WireGuard จะไม่ตอบอะไรเลยถ้าแพ็กเก็ตไม่ผ่านการตรวจคีย์ เครื่องสแกนจึงเห็นเหมือนพอร์ตปิด ถ้าไม่อยากเปิดพอร์ตเลยให้ใช้ Tailscale
Tailscale ฟรีใช้ได้กี่คน
ตอนเขียน (ต.ค. 2026) หน้าราคาของ Tailscale ระบุแพลน Personal ฟรี 6 ผู้ใช้ จำนวนอุปกรณ์ไม่จำกัด ตัวเลขนี้เปลี่ยนมาแล้วหลายรอบ ตรวจหน้าราคาปัจจุบันก่อนตัดสินใจ
คำสั่งและค่าตั้งในบทความทดสอบบนระบบตัวอย่าง ลองบนเครื่องทดสอบก่อนใช้กับระบบจริงเสมอ