Headscale - โอเพนซอร์สสำหรับโฮสต์เองที่นำคอนโทรลเซิร์ฟเวอร์ของ Tailscale มาใช้งาน
(github.com/juanfont)- Headscale เป็นโปรเจกต์ที่นำคอนโทรลเซิร์ฟเวอร์ของ Tailscale มาใช้งานในรูปแบบโอเพนซอร์สและโฮสต์เองได้ โดยมุ่งเป้าไปที่ self-hoster และสภาพแวดล้อมโปรเจกต์/แล็บของนักพัฒนาสายงานอดิเรก
- Tailscale เป็น VPN สมัยใหม่ที่ใช้ WireGuard เป็นพื้นฐาน และทำงานเหมือนเครือข่าย overlay ระหว่างคอมพิวเตอร์ในเครือข่ายด้วยการใช้ NAT traversal
- คอนโทรลเซิร์ฟเวอร์ของ Tailscale รับผิดชอบการ แลกเปลี่ยน public key ของ WireGuard ของโหนด, การจัดสรร IP ให้ไคลเอนต์, การสร้างขอบเขตผู้ใช้, การแชร์เครื่องระหว่างผู้ใช้ และการเปิดเผย route ที่โหนดประกาศไว้
- Headscale มีขอบเขตแคบ โดยให้การใช้งาน เครือข่าย Tailscale เดียว (tailnet) ที่เหมาะกับการใช้งานส่วนบุคคลหรือองค์กรโอเพนซอร์สขนาดเล็ก
- โปรเจกต์นี้ไม่เกี่ยวข้องกับ Tailscale Inc. และการรัน Headscale ไม่รองรับหรือไม่แนะนำให้ใช้ reverse proxy และคอนเทนเนอร์
จุดประสงค์และขอบเขตของ Headscale
- Headscale มุ่งเป็นทางเลือกแบบโอเพนซอร์สที่โฮสต์เองได้สำหรับคอนโทรลเซิร์ฟเวอร์ของ Tailscale
- ผู้ใช้เป้าหมายคือ self-hoster, นักพัฒนาสายงานอดิเรก, ผู้ใช้โปรเจกต์ส่วนตัวและสภาพแวดล้อมแล็บ
- ขอบเขตการใช้งานถูกกำหนดไว้แคบ โดยให้บริการ tailnet เดียว
- เหมาะกับการใช้งานส่วนบุคคล
- เหมาะกับองค์กรโอเพนซอร์สขนาดเล็กด้วย
บทบาทของ Tailscale และคอนโทรลเซิร์ฟเวอร์
- Tailscale เป็น VPN สมัยใหม่ ที่สร้างอยู่บน WireGuard
- Tailscale ทำงานเหมือน เครือข่าย overlay ระหว่างคอมพิวเตอร์ในเครือข่าย และใช้ NAT traversal
- ใน Tailscale องค์ประกอบทั้งหมดเป็นโอเพนซอร์ส ยกเว้นบางส่วนของ GUI client และคอนโทรลเซิร์ฟเวอร์
- GUI client ที่ระบุเป็นข้อยกเว้นคือไคลเอนต์สำหรับระบบปฏิบัติการ proprietary เช่น Windows และ macOS/iOS
- คอนโทรลเซิร์ฟเวอร์ ทำหน้าที่เป็นจุดแลกเปลี่ยน public key ของ WireGuard ระหว่างโหนดในเครือข่าย Tailscale
- จัดสรรที่อยู่ IP ให้ไคลเอนต์
- สร้างขอบเขตระหว่างผู้ใช้
- ทำให้แชร์เครื่องระหว่างผู้ใช้ได้
- เปิดเผย route ที่โหนดประกาศไว้
- เครือข่าย Tailscale หรือ tailnet คือเครือข่ายส่วนตัวที่ Tailscale จัดสรรให้ผู้ใช้รายบุคคลหรือองค์กร
เอกสารและข้อควรระวังเรื่องเวอร์ชัน
- หากต้องการดูตัวอย่างการตั้งค่าที่ตรงกับเวอร์ชัน release ที่ใช้อยู่ ต้องเลือก GitHub tag เดียวกันเสมอ
- branch
mainอาจมีการเปลี่ยนแปลงที่ยังไม่ถูก release อยู่ - เอกสารมีทั้งเวอร์ชันเสถียรและเวอร์ชันพัฒนา
- แนะนำให้ดูรายการฟีเจอร์ได้ที่ เอกสาร Features
- แนะนำให้ดูขอบเขตการรองรับไคลเอนต์และระบบปฏิบัติการได้ที่ เอกสาร Client and operating system support
การรันและการ build
- การรัน Headscale ไม่รองรับหรือไม่แนะนำให้ใช้ reverse proxy และคอนเทนเนอร์
- แนะนำให้ดูวิธีรันได้จาก เอกสารทางการ
- โมดูลสำหรับผู้ใช้ NixOS อยู่ในไดเรกทอรี
nix/ - development build ของ branch
mainมีให้ในรูปแบบ container image และ binary- ดูรายละเอียดได้ที่ เอกสาร development builds
ความสัมพันธ์ของโปรเจกต์และการมีส่วนร่วม
- โปรเจกต์นี้ ไม่เกี่ยวข้องกับ Tailscale Inc.
- หนึ่งใน main maintainer ที่ยังทำงานอยู่ของ Headscale ได้รับการจ้างงานโดย Tailscale และสามารถมีส่วนร่วมกับโปรเจกต์ในเวลางานได้
- การมีส่วนร่วมของ maintainer รายดังกล่าวจะถูก review โดย maintainer คนอื่น
- maintainer ร่วมกันกำหนดทิศทางโปรเจกต์ภายใต้หลักการสร้างโปรเจกต์ที่ยั่งยืน พร้อมสนับสนุนชุมชน self-hoster, ผู้ใช้ที่กระตือรือร้น และนักพัฒนาสายงานอดิเรก
- ผู้มีส่วนร่วมควรอ่าน CONTRIBUTING.md
สภาพแวดล้อมการพัฒนาและ workflow
- การมีส่วนร่วมต้องใช้ Go และ Buf เวอร์ชันล่าสุด
- Buf ใช้เป็นตัวสร้าง Protobuf
- แนะนำให้ใช้ Nix ในการตั้งค่าสภาพแวดล้อมการพัฒนา
- เมื่อรัน
nix developระบบจะติดตั้งเครื่องมือที่จำเป็นและให้ shell พร้อมใช้งาน - วิธีนี้รับประกันสภาพแวดล้อมการพัฒนาแบบเดียวกับ maintainer ของ Headscale
- เมื่อรัน
- โค้ด Go lint ด้วย
golangci-lintและ format ด้วยgolines,gofumpt- ความกว้างของ
golinesตั้งไว้ที่ 88 - แนะนำให้รัน
make lintและmake fmtก่อน commit
- ความกว้างของ
- โค้ด Proto lint ด้วย
bufและ format ด้วยclang-format - เอกสาร format ด้วย
mdformatส่วนไฟล์ที่เหลือ เช่น Markdown และ YAML format ด้วยprettier - เมื่อเปลี่ยนแปลง
proto/ต้องสร้างโค้ด Go จาก Protobuf ใหม่- คำสั่งคือ
make generate - แนะนำให้ใส่การเปลี่ยนแปลงใน
gen/เป็น commit แยกต่างหากเพื่อให้ review ง่ายขึ้น
- คำสั่งคือ
- การทดสอบและการ build รันด้วย
make testและmake buildตามลำดับ - workflow ที่แนะนำคือหลังจาก
nix developให้รันmake testและmake build- หากจัดการ dependency เอง สามารถใช้ Make ได้โดยตรง
- Makefile จะเตือนหากไม่มีเครื่องมือที่จำเป็น และแนะนำให้รัน
nix develop - ดู target ที่ใช้ได้ด้วย
make help
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ทุก ๆ ไม่กี่เดือน ผมจะกลับมาดู repository นี้ว่า Tailnet lock ใช้งานได้ในที่สุดหรือยัง และระหว่างนั้นมีใครทำ security audit แล้วหรือไม่
น่าเสียดายที่ทั้งสองอย่างดูเหมือนยังไม่มีความคืบหน้า เลยทำให้ยิ่งไม่แน่ใจว่าผมจะเชื่อใจสิ่งนี้ให้เป็นองค์ประกอบหลักของโครงสร้างพื้นฐานของผมได้แค่ไหน
หลักคิดของ Tailscale SaaS คือการสร้าง tunnel ที่อ้อมผ่าน firewall และให้ผู้ใช้ควบคุมได้ว่าจะ route อะไรผ่าน tunnel นั้น ด้วยวิธีที่เข้าใจง่ายและรวมศูนย์
Headscale ดูเหมือนจะทำเรื่องการอ้อมผ่าน firewall และ NAT traversal ขั้นสูงได้ดี แต่ยังน่าสงสัยว่ามันให้ความปลอดภัยของตัวเองได้เพียงพอที่จะชดเชยความปลอดภัยที่เพิ่งอ้อมผ่านไปหรือไม่
ถ้าผู้ใช้ไม่มีทางเข้าใจหรือปฏิเสธได้ว่า control server สั่งให้ client ทำอะไร และไม่มีการ audit ความปลอดภัยของโค้ด server เลย ก็ดูเป็นตัวเลือกที่ค่อนข้างกล้าเสี่ยง
ผมเคยคิดว่านี่เป็น control layer ที่วางอยู่บนบริการ backend พื้นฐานของ Tailscale แล้วมันทำหน้าที่เป็นตัวกลางเชื่อมต่อด้วยวิธีใหม่หรือ?
ผมใช้ ZeroTier ค่อนข้างบ่อย แต่ไม่คุ้นกับ Tailscale คำถามนี้อาจจะพื้น ๆ ก็ได้
ถ้าสนใจ orchestration server แบบ self-hosted ก็น่าดู Netbird เช่นกัน
เป็นเครื่องมือคล้าย ๆ กัน แต่ server ก็เปิดเป็น open source ด้วย และ control server แบบ self-hosted มาพร้อม GUI ที่ใช้ได้ดีและฟีเจอร์จากเวอร์ชันเสียเงิน
https://netbird.io/knowledge-hub/tailscale-vs-netbird
ดูแข็งแรง ทรงพลัง และมีฟีเจอร์เยอะ แต่ Headscale แบบ self-hosted นั้นเรียบง่ายกว่าและต้องการสิ่งต่าง ๆ น้อยกว่ามาก
ตอนนี้ยังรัน Tailscale อยู่ด้วย แต่ค่อย ๆ เข้าใกล้การเลิกใช้แล้วเปลี่ยนไป Netbird ทั้งหมดมากขึ้น
issue ที่เกี่ยวข้องใน GitHub อยู่ที่นี่
https://github.com/netbirdio/netbird/issues/1103
น่าจะใส่ชื่อโปรเจกต์ Headscale ไว้ในหัวข้อด้วย
Headscale เป็นโปรเจกต์ที่เคยขึ้น HN มาหลายครั้งแล้ว
ถ้า Headscale รองรับ peering/federation ระหว่าง instance ได้คงเจ๋งมาก อาจจะหลังจากปรับ ACL ใหม่แล้วก็ได้
หนึ่งในปัญหาหลักคือ address collision
ข้อเสนอคือ: กำหนดให้เป็น overlay network เฉพาะ IPv6 ในช่วง Unique Local Address (ULA) แล้วแบ่ง 121 บิตที่เหลือเป็น 20 บิตล่างสำหรับ address ของอุปกรณ์ (ประมาณ 1 ล้านเครื่อง) และ 101 บิตบนเป็น hash ของ public key ของ server
เพิ่ม public key ของ instance อื่นเพื่อทำ federation แล้วจัดการการสื่อสารระหว่าง node ด้วย policy และ ACL
ผมคิดว่าเป็นไอเดียที่ดี แต่ตอนเสนอในปี 2023 maintainer ชื่อ kradalby บอกว่าอยู่นอก scope: https://github.com/juanfont/headscale/issues/1370
ใช้ Headscale มาได้ครึ่งปีแล้วและใช้งานได้ดี
ชอบมาก จนถึงขั้นไม่รู้ว่าเมื่อก่อนใช้ชีวิตโดยไม่มี เครือข่าย Tailscale ได้อย่างไร
มีแพ็กเกจบน OpenBSD และผมใช้แพ็กเกจนั้นเป็น server อยู่
ชอบ Headscale และเพิ่งเอาขึ้น production ซึ่งทำงานได้ดีมาก
ใช้โดเมน Gmail สำหรับ login ซึ่งมีข้อดีใหญ่คือผู้ใช้ลงทะเบียนอุปกรณ์ของตัวเองได้เอง
สมัยใช้ OpenVPN ทีมปฏิบัติการต้องส่ง certificate และ config ให้เอง
ข้อเสียอย่างเดียวคือบางครั้งผู้ใช้เผลอไปเชื่อมต่อกับ login server ของ Tailscale แทนที่จะเป็น server ของเราเอง แล้วงงว่าทำไมเข้า service ไม่ได้
กำลังตั้งค่า service ที่เข้าถึงได้ตาม user group
ยังใช้ Headscale เวอร์ชันเก่าอยู่ เพราะมี integration ที่ต้อง port ไปยัง control plane ใหม่
ตาม
headscale node list | wcมี node ประมาณ 250 ตัว และส่วนใหญ่เป็น serverไม่ค่อยชอบที่ Tailscale ไปแตะ routing table กับ firewall rule แบบเหมือนเวทมนตร์ แต่โดยรวมแล้วไม่ค่อยเป็นปัญหาและทำงานได้ค่อนข้างดี
ในหลายกรณีการใช้งาน เช่น การเข้าถึงจากมือถือหรือ GUI บน macOS จะใช้ Headscale ได้ก็ต่อเมื่อ ไคลเอนต์ Tailscale อย่างเป็นทางการ ยังคงมีฟีเจอร์ให้ตั้งค่าเซิร์ฟเวอร์ควบคุมได้
ทันทีที่ Tailscale เริ่มลดคุณภาพลงอย่างหลีกเลี่ยงไม่ได้ ฟีเจอร์นี้ก็จะหายไป
ตอนนี้ผมเป็นลูกค้าที่พอใจกับ Tailscale มาก แต่พูดจากประสบการณ์ที่เคยเจอหลายครั้งในอดีต ตอนที่บริษัทอื่น ๆ ถูกขายหรือเงินทุน VC หมด
ก็น่าจะเป็นไปได้ Headscale ส่วนใหญ่ใช้โดยผู้ใช้โฮมแล็บและผู้ใช้สายงานอดิเรกขนาดเล็ก และไม่ได้แข่งกับ Pulsesecure, Cisco Anyconnect, GlobalProtect แต่แข่งกับ OpenVPN หรือ WireGuard ที่โฮสต์เอง
มันเป็นช่องทางแนะนำ Tailscale ให้กับคนที่ชอบเทคโนโลยีใหม่ ๆ ในเวลาว่าง แต่ไม่อยากยอมเสียการควบคุมโครงสร้างพื้นฐาน
คนเหล่านั้นก็จะนำความเชี่ยวชาญและความกระตือรือร้นต่อ Tailscale ไปยังที่ทำงาน
บริษัทต่าง ๆ มักไม่ค่อยอยากจัดการโครงสร้างพื้นฐาน IT เอง เว้นแต่มันจะเป็นความสามารถหลักขององค์กร
แน่นอนว่าบางบริษัทจะเลือก Headscale แทนผลิตภัณฑ์หลักของ Tailscale แต่เมื่อดูจากขนาดบริษัทและมูลค่าเงินแล้ว น่าจะเป็นส่วนน้อย
นั่นใกล้เคียงกับต้นทุนเพื่อสร้างรายได้ และไม่ได้ต่างจากโฆษณา Facebook หรือป้ายโฆษณาข้างถนนในซิลิคอนแวลลีย์มากนัก
เหตุผลที่ที่ทำงานใช้ Tailscale ไม่ได้คือทราฟฟิกถูกกำหนดเส้นทางผ่านเซิร์ฟเวอร์ที่เราไม่สามารถควบคุมได้
ผมอยากใช้ Tailscale ที่ที่ทำงานจริง ๆ และมันจะช่วยแก้ปัญหาได้หลายอย่าง
ถ้าต้องเปิดพอร์ตก็พอรับได้ แต่การทำ tunnel ทราฟฟิกผ่านพอร์ตนั้นเป็นเรื่องที่น่ากังวลมาก
ดูน่าสนใจ อยากรู้ว่ามีมูลค่าเพิ่มอะไรเมื่อเทียบกับการตั้งค่า WireGuard + OpenWrt
มันทำงานได้เลยภายใต้ข้อจำกัดของ ACL ที่จัดการจากส่วนกลาง
บางคนลดค่าของ Tailscale ว่าเป็น “แค่ตัว orchestrate WireGuard” แต่จริง ๆ แล้วมันมีมากกว่านั้นมาก
ในมุมมองผลิตภัณฑ์ WireGuard เป็นเพียงรายละเอียดการนำไปใช้งานเท่านั้น
เมื่อก่อนผมเลือก Netbird เพราะรู้สึกว่า UI ของ Headscale พื้นฐานเกินไป แต่ช่วงไม่กี่ปีที่ผ่านมาอาจดีขึ้นแล้วก็ได้
มันทำงานได้บนไคลเอนต์จำนวนมาก และ Apple TV ของผมก็เชื่อมต่อกับเครือข่าย Tailscale อยู่ด้วย
ใช้เวลาตั้งค่าประมาณ 1 นาที และยังทำหน้าที่เป็นเกตเวย์ได้ด้วย
ถ้าใช้ Tailscale หรือ Headscale ที่โฮสต์ไว้ภายนอก ก็ใช้งานแบบนั้นได้
สงสัยว่าถ้าเซิร์ฟเวอร์ประสานงานของ Tailscale ถูกเจาะ และเปิด Tailnet lock ไว้ อุปกรณ์ของผมจะมีความเสี่ยงถูกเจาะมากแค่ไหน