เอกสารนี้เขียนขึ้นสำหรับผู้สนใจที่เป็นนักพัฒนาซอฟต์แวร์ สำหรับข้อมูลเกี่ยวกับการใช้ ZeroTier โปรดดูที่: เว็บไซต์ ไซต์เอกสาร และกระดานสนทนา
ZeroTier คือสวิตช์อีเทอร์เน็ตแบบตั้งโปรแกรมได้อัจฉริยะสำหรับดาวเคราะห์โลก ช่วยให้อุปกรณ์เครือข่าย VM คอนเทนเนอร์ และแอปพลิเคชันทั้งหมดสามารถสื่อสารได้เสมือนว่าทั้งหมดอยู่ในศูนย์ข้อมูลจริงหรือภูมิภาคคลาวด์เดียวกัน
ซึ่งสามารถทำได้โดยการรวมเครือข่ายเพียร์ทูเพียร์ที่ปลอดภัยที่ได้รับแอดเดรสแบบเข้ารหัสลับ (เรียกว่า VL1) เข้ากับเลเยอร์การจำลองอีเธอร์เน็ตที่ค่อนข้างคล้ายกับ VXLAN (เรียกว่า VL2) เลเยอร์การจำลองเสมือนอีเทอร์เน็ต VL2 ของเรามีคุณสมบัติ SDN ระดับองค์กรขั้นสูง เช่น กฎการควบคุมการเข้าถึงที่ละเอียดสำหรับการแบ่งส่วนย่อยของเครือข่ายและการตรวจสอบความปลอดภัย
การรับส่งข้อมูล ZeroTier ทั้งหมดได้รับการเข้ารหัสจากต้นทางถึงปลายทางโดยใช้คีย์ลับที่คุณควบคุมเท่านั้น การรับส่งข้อมูลส่วนใหญ่ไหลแบบเพียร์ทูเพียร์ แม้ว่าเราจะเสนอการส่งต่อฟรี (แต่ช้า) สำหรับผู้ใช้ที่ไม่สามารถสร้างการเชื่อมต่อแบบเพียร์ทูเพียร์ได้
เป้าหมายและหลักการออกแบบของ ZeroTier ได้รับแรงบันดาลใจจากเอกสารต้นฉบับของ Google BeyondCorp และ Jericho Forum ที่มีแนวคิดเรื่อง "การลดขอบเขต"
เยี่ยมชมเว็บไซต์ของ ZeroTier เพื่อดูข้อมูลเพิ่มเติมและแพ็คเกจไบนารีที่สร้างไว้ล่วงหน้า แอปสำหรับ Android และ iOS มีให้บริการฟรีใน Google Play และ Apple App Store
ZeroTier ได้รับอนุญาตภายใต้ BSL เวอร์ชัน 1.1 ดู LICENSE.txt และหน้าราคา ZeroTier เพื่อดูรายละเอียด ZeroTier ใช้งานได้ฟรีภายในธุรกิจและสถาบันการศึกษา และเพื่อวัตถุประสงค์ที่ไม่ใช่เชิงพาณิชย์ การใช้งานเชิงพาณิชย์บางประเภท เช่น การสร้างแอปและอุปกรณ์แบบปิดโดยใช้ ZeroTier หรือการเสนอตัวควบคุมเครือข่าย ZeroTier และการจัดการเครือข่ายเป็นบริการ SaaS จำเป็นต้องมีใบอนุญาตเชิงพาณิชย์
รหัสบุคคลที่สามจำนวนเล็กน้อยยังรวมอยู่ใน ZeroTier และไม่อยู่ภายใต้ใบอนุญาต BSL ของเรา ดู AUTHORS.md เพื่อดูรายการรหัสบุคคลที่สาม ซึ่งมีรหัสดังกล่าวรวมอยู่ด้วย และใบอนุญาตที่ใช้กับรหัสดังกล่าว รหัสบุคคลที่สามทั้งหมดใน ZeroTier ได้รับอนุญาตอย่างเสรี (MIT, BSD, Apache, โดเมนสาธารณะ ฯลฯ)
ทุกสิ่งในโลก ZeroTier ถูกควบคุมโดยตัวระบุสองประเภท: ที่อยู่ ZeroTier 40 บิต/10 หลัก และ ID เครือข่าย 64 บิต/16 หลัก ตัวระบุเหล่านี้แยกแยะได้ง่ายตามความยาว ที่อยู่ ZeroTier ระบุโหนดหรือ "อุปกรณ์" (แล็ปท็อป โทรศัพท์ เซิร์ฟเวอร์ VM แอป ฯลฯ) ในขณะที่รหัสเครือข่ายระบุเครือข่ายอีเทอร์เน็ตเสมือนที่อุปกรณ์สามารถเข้าร่วมได้
ที่อยู่ ZeroTier ถือได้ว่าเป็นหมายเลขพอร์ตบนสวิตช์อัจฉริยะอีเธอร์เน็ตระดับองค์กรขนาดมหึมาทั่วโลกที่รองรับ VLAN รหัสเครือข่ายคือรหัส VLAN ที่อาจกำหนดพอร์ตเหล่านี้ให้ พอร์ตเดียวสามารถกำหนดให้กับ VLAN ได้มากกว่าหนึ่งพอร์ต
ที่อยู่ ZeroTier ดูเหมือน 8056c2e21c
และรหัสเครือข่ายดูเหมือน 8056c2e21c000001
รหัสเครือข่ายประกอบด้วยที่อยู่ ZeroTier ของตัวควบคุมหลักของเครือข่ายนั้นและรหัส 24 บิตที่กำหนดเองซึ่งระบุเครือข่ายบนตัวควบคุมนี้ ตัวควบคุมเครือข่ายมีความคล้ายคลึงกับตัวควบคุม SDN ในโปรโตคอล SDN เช่น OpenFlow โดยประมาณ แม้ว่าจะไม่ควรอ่านในลักษณะเดียวกับการเปรียบเทียบระหว่าง VXLAN และ VL2 เพื่อบอกเป็นนัยว่าโปรโตคอลหรือการออกแบบเหมือนกัน คุณสามารถใช้ตัวควบคุมที่โฮสต์โดย SaaS ที่สะดวกและราคาไม่แพงของเราได้ที่ my.zerotier.com หรือเรียกใช้ตัวควบคุมของคุณเอง หากคุณไม่รังเกียจที่จะยุ่งกับไฟล์การกำหนดค่า JSON หรือเขียนสคริปต์เพื่อดำเนินการดังกล่าว
พาธพื้นฐานประกอบด้วยจุดเข้าหลักของบริการ ZeroTier One ( one.cpp
), โค้ดทดสอบตัวเอง, makefiles ฯลฯ
artwork/
: ไอคอน โลโก้ ฯลฯattic/
: ของเก่าและโค้ดทดลองที่เราต้องการเก็บไว้ใช้อ้างอิงcontroller/
: การใช้งานตัวควบคุมเครือข่ายอ้างอิงซึ่งสร้างและรวมไว้ตามค่าเริ่มต้นบนเป้าหมายการสร้างเดสก์ท็อปและเซิร์ฟเวอร์debian/
: ไฟล์สำหรับสร้างแพ็คเกจ Debian บน Linuxdoc/
: หน้าคู่มือและเอกสารอื่นๆext/
: ไลบรารีบุคคลที่สาม ไบนารีที่เราจัดส่งเพื่อความสะดวกบนบางแพลตฟอร์ม (Mac และ Windows) และไฟล์สนับสนุนการติดตั้งinclude/
: รวมไฟล์สำหรับแกน ZeroTierjava/
: wrapper JNI ที่ใช้กับแอปมือถือ Android ของเรา (แอป Android ทั้งหมดไม่ใช่โอเพ่นซอร์ส แต่อาจเปิดตัวในอนาคต)node/
: แกนสวิตช์อีเทอร์เน็ตเสมือน ZeroTier ซึ่งได้รับการออกแบบให้แยกจากส่วนที่เหลือของโค้ดโดยสิ้นเชิง และสามารถสร้างเป็นไลบรารีที่ไม่ขึ้นกับระบบปฏิบัติการแบบสแตนด์อโลนได้ หมายเหตุสำหรับนักพัฒนา: อย่าใช้คุณสมบัติ C++11 ในที่นี้ เนื่องจากเราต้องการให้สิ่งนี้สร้างบนแพลตฟอร์มแบบฝังตัวเก่าที่ขาดการรองรับ C++11 C ++ 11 สามารถใช้ที่อื่นได้osdep/
: โค้ดเพื่อรองรับและผสานรวมกับระบบปฏิบัติการ รวมถึงสิ่งเฉพาะแพลตฟอร์มที่สร้างขึ้นสำหรับเป้าหมายบางอย่างเท่านั้นrule-compiler/
: กฎ JavaScript คอมไพเลอร์ภาษาสำหรับการกำหนดกฎระดับเครือข่ายservice/
: บริการ ZeroTier One ซึ่งล้อมรอบแกน ZeroTier และมอบการเชื่อมต่อเหมือน VPN ไปยังเครือข่ายเสมือนสำหรับเดสก์ท็อป แล็ปท็อป เซิร์ฟเวอร์ VM และคอนเทนเนอร์windows/
: ไฟล์โซลูชัน Visual Studio, รหัสบริการ Windows และ UI ของแอปแถบงาน Windowszeroidc/
: การใช้งาน OIDC ที่บริการ ZeroTier ใช้เพื่อเข้าสู่ระบบเครือข่ายที่เปิดใช้งาน SSO (ส่วนนี้เขียนด้วยภาษา Rust และ Rust เพิ่มเติมจะปรากฏในพื้นที่เก็บข้อมูลนี้ในอนาคต) โปรดดึงคำขอออกจากสาขา dev
การเผยแพร่ทำได้โดยการรวม dev
เข้ากับ main
จากนั้นจึงแท็กและทำ builds
หากต้องการสร้างบน Mac และ Linux เพียงพิมพ์ make
. บน FreeBSD และ OpenBSD จำเป็นต้องมี gmake
(GNU make) และสามารถติดตั้งได้จากแพ็คเกจหรือพอร์ต สำหรับ Windows มีโซลูชัน Visual Studio ใน windows/
.
gmake
เพื่อสร้างbinutils
พิมพ์ pkg install binutils
เพื่อติดตั้ง/dev/tap0
ถึง /dev/tap3
)gmake
เพื่อสร้าง การพิมพ์ make selftest
จะสร้างไบนารี ทดสอบตัวเองระดับศูนย์ ซึ่งหน่วยทดสอบภายในต่างๆ และรายงานเกี่ยวกับบางแง่มุมของสภาพแวดล้อมการสร้าง เป็นความคิดที่ดีที่จะลองใช้แพลตฟอร์มหรือสถาปัตยกรรมใหม่ๆ
การรัน Zerotier-one ด้วยตัวเลือก -h
จะแสดงความช่วยเหลือ
บน Linux และ BSD หากคุณสร้างจากแหล่งที่มา คุณสามารถเริ่มบริการด้วย:
sudo ./zerotier-one -d
ในระบบปฏิบัติการส่วนใหญ่, macOS และ Windows ตัวติดตั้งจะเริ่มบริการและตั้งค่าให้เริ่มทำงานเมื่อบู๊ตเครื่อง
โฮมโฟลเดอร์สำหรับระบบของคุณจะถูกสร้างขึ้นโดยอัตโนมัติ
บริการนี้ควบคุมผ่าน JSON API ซึ่งตามค่าเริ่มต้นจะพร้อมใช้งานที่ 127.0.0.1:9993
นอกจากนี้ยังฟังบน 0.0.0.0:9993
ซึ่งใช้ได้ก็ต่อเมื่อ allowManagementFrom
ได้รับการกำหนดค่าอย่างเหมาะสมใน local.conf
เรามียูทิลิตีบรรทัดคำสั่ง zerotier-cli เพื่อทำการเรียก API สำหรับสิ่งมาตรฐาน เช่น การเข้าร่วมและออกจากเครือข่าย ไฟล์ authtoken.secret ในโฟลเดอร์หลักมีโทเค็นลับสำหรับการเข้าถึง API นี้ ดูบริการ/README.mdสำหรับเอกสารประกอบ API
นี่คือที่ที่โฟลเดอร์หลักแสดงอยู่ (โดยค่าเริ่มต้น) ในแต่ละระบบปฏิบัติการ:
/var/lib/zerotier-one
/var/db/zerotier-one
/Library/Application Support/ZeroTier/One
ProgramDataZeroTierOne
(นั่นคือค่าเริ่มต้น โฟลเดอร์ 'ข้อมูลแอปที่แชร์' พื้นฐานอาจแตกต่างกันหากติดตั้ง Windows ด้วยการกำหนดอักษรระบุไดรฟ์หรือเค้าโครงที่ไม่เป็นมาตรฐาน)สำหรับผู้ใช้ส่วนใหญ่ มันก็ใช้งานได้
หากคุณใช้ไฟร์วอลล์ระบบในเครื่อง เราขอแนะนำให้เพิ่มกฎที่อนุญาตระดับศูนย์ หากคุณติดตั้งไบนารีสำหรับ Windows สิ่งนี้ควรทำโดยอัตโนมัติ แพลตฟอร์มอื่นๆ อาจต้องมีการแก้ไขกฎไฟร์วอลล์ในเครื่องด้วยตนเอง ทั้งนี้ขึ้นอยู่กับการกำหนดค่าของคุณ
ดูเว็บไซต์เอกสารสำหรับข้อมูลเพิ่มเติม
ไฟร์วอลล์ Mac สามารถพบได้ภายใต้ "ความปลอดภัย" ในการตั้งค่าระบบ Linux มีระบบและเครื่องมือกำหนดค่าไฟร์วอลล์ที่หลากหลาย
บน CentOS ให้ตรวจสอบ /etc/sysconfig/iptables
สำหรับกฎ IPTables สำหรับการแจกจ่ายอื่นๆ โปรดดูเอกสารประกอบการแจกจ่ายของคุณ นอกจากนี้ คุณจะต้องตรวจสอบ UI หรือเอกสารประกอบสำหรับแอปพลิเคชันไฟร์วอลล์บุคคลที่สามเชิงพาณิชย์ เช่น Little Snitch (Mac), McAfee Firewall Enterprise (Windows) ฯลฯ หากคุณใช้งานสิ่งเหล่านี้ สภาพแวดล้อมองค์กรบางแห่งอาจมีซอฟต์แวร์ไฟร์วอลล์ที่จัดการจากส่วนกลาง ดังนั้นคุณอาจต้องติดต่อฝ่ายไอทีด้วย
เพียร์ ZeroTier One จะค้นหาซึ่งกันและกันโดยอัตโนมัติและสื่อสารโดยตรงผ่าน LAN แบบมีสายในพื้นที่ หากพอร์ต UDP 9993 ขาเข้าเปิดอยู่ หากพอร์ตนั้นถูกกรอง พวกเขาจะไม่สามารถเห็นแพ็กเก็ตประกาศ LAN ของกันและกันได้ หากคุณประสบปัญหาประสิทธิภาพต่ำระหว่างอุปกรณ์บนเครือข่ายทางกายภาพเดียวกัน ให้ตรวจสอบการตั้งค่าไฟร์วอลล์ของอุปกรณ์เหล่านั้น หากไม่มีเพียร์การระบุตำแหน่งอัตโนมัติของ LAN จะต้องพยายามข้ามผ่าน NAT แบบ "ย้อนกลับ" ซึ่งบางครั้งล้มเหลว และไม่ว่าในกรณีใด กำหนดให้ทุกแพ็กเก็ตเคลื่อนที่ผ่านเราเตอร์ภายนอกของคุณสองครั้ง
ผู้ใช้ที่อยู่หลังไฟร์วอลล์บางประเภทและอุปกรณ์ NAT แบบ "สมมาตร" อาจไม่สามารถเชื่อมต่อกับเพียร์ภายนอกได้โดยตรงเลย ZeroTier มีการสนับสนุนที่จำกัดสำหรับการคาดการณ์พอร์ต และจะ พยายาม สำรวจ NAT แบบสมมาตร แต่ก็ไม่ได้ผลเสมอไป หากการเชื่อมต่อ P2P ล้มเหลว คุณจะเด้งแพ็กเก็ต UDP ออกจากเซิร์ฟเวอร์รีเลย์ของเรา ส่งผลให้ประสิทธิภาพช้าลง เราเตอร์ NAT บางตัวมีโหมด NAT ที่กำหนดค่าได้ และการตั้งค่านี้เป็น "เต็มกรวย" จะช่วยขจัดปัญหานี้ หากคุณทำเช่นนี้ คุณอาจเห็นการปรับปรุงอย่างน่าอัศจรรย์สำหรับสิ่งต่าง ๆ เช่น โทรศัพท์ VoIP, Skype, BitTorrent, WebRTC, เกมบางเกม ฯลฯ เนื่องจากสิ่งเหล่านี้ใช้เทคนิคการแวะผ่าน NAT ที่คล้ายกับของเรา
หากไฟร์วอลล์ระหว่างคุณและอินเทอร์เน็ตบล็อกการรับส่งข้อมูล UDP ของ ZeroTier คุณจะถอยกลับไปใช้ช่องทาง TCP ช่องทางสุดท้ายไปยังเซิร์ฟเวอร์รูทบนพอร์ต 443 (การเลียนแบบ https) สิ่งนี้จะทำงานได้เกือบทุกที่ แต่ ช้ามาก เมื่อเทียบกับ UDP หรือการเชื่อมต่อแบบเพียร์ทูเพียร์โดยตรง
ความช่วยเหลือเพิ่มเติมสามารถพบได้ในฐานความรู้ของเรา
Prometheus Metrics พร้อมใช้งานที่ตำแหน่ง /metrics
API ตำแหน่งข้อมูลนี้ได้รับการปกป้องโดยคีย์ API ที่จัดเก็บไว้ใน metricstoken.secret
เพื่อป้องกันการรั่วไหลของข้อมูลที่ไม่ต้องการ ข้อมูลที่สามารถรวบรวมได้จากตัววัด ได้แก่ เครือข่ายที่เข้าร่วมและเพื่อนที่อินสแตนซ์ของคุณกำลังพูดคุยด้วย
การควบคุมการเข้าถึงทำได้ผ่านอินเทอร์เฟซการควบคุม ZeroTier และ metricstoken.secret
ซึ่งสามารถส่งเป็นโทเค็นการตรวจสอบสิทธิ์ผู้ถือผ่านฟิลด์ส่วนหัว HTTP X-ZT1-Auth
หรือต่อท้าย URL เป็น ?auth=<token>
คุณสามารถดูเมตริกปัจจุบันได้ผ่านทาง cURL
ด้วยคำสั่งต่อไปนี้:
// Linux
curl -H "X-ZT1-Auth: $(sudo cat /var/lib/zerotier-one/metricstoken.secret)" http://localhost:9993/metrics
// macOS
curl -H "X-ZT1-Auth: $(sudo cat /Library/Application Support/ZeroTier/One/metricstoken.secret)" http://localhost:9993/metrics
// Windows PowerShell (Admin)
Invoke-RestMethod -Headers @{'X-ZT1-Auth' = "$(Get-Content C:ProgramDataZeroTierOnemetricstoken.secret)"; } -Uri http://localhost:9993/metrics
หากต้องการกำหนดค่างานขูดใน Prometheus บนเครื่อง ZeroTier กำลังทำงานอยู่ ให้เพิ่มสิ่งนี้ลงใน Prometheus scrape_config
:
- job_name: zerotier-one
honor_labels: true
scrape_interval: 15s
metrics_path: /metrics
static_configs:
- targets:
- 127.0.0.1:9993
labels:
group: zerotier-one
node_id: $YOUR_10_CHARACTER_NODE_ID
authorization:
credentials: $YOUR_METRICS_TOKEN_SECRET
หากไม่ต้องการใช้วิธีใดวิธีหนึ่งเหล่านี้ ก็อาจเป็นไปได้ที่จะกระจายตัววัดผ่าน Prometheus Proxy หรือเครื่องมืออื่นๆ หมายเหตุ: เรายังไม่ได้ทดสอบสิ่งนี้เป็นการภายใน แต่อาจจะใช้งานได้กับการกำหนดค่าที่ถูกต้อง
เมตริกยังมีอยู่บนดิสก์ในไดเร็กทอรีการทำงานของ ZeroTier:
// Linux /var/lib/zerotier-one/metrics.prom
// macOS /Library/Application Support/ZeroTier/One/metrics.prom
//Windows C:ProgramDataZeroTierOnemetrics.prom
ชื่อเมตริก | ป้ายกำกับ | ประเภทเมตริก | คำอธิบาย |
---|---|---|---|
zt_packet | packet_type ทิศทาง | เคาน์เตอร์ | การนับประเภทแพ็กเก็ต ZeroTier |
zt_packet_error | error_type ทิศทาง | เคาน์เตอร์ | ข้อผิดพลาดของแพ็กเก็ต ZeroTier |
zt_data | โปรโตคอลทิศทาง | เคาน์เตอร์ | จำนวนไบต์ที่ ZeroTier ส่งหรือรับ |
zt_num_networks | วัด | จำนวนเครือข่ายที่อินสแตนซ์นี้เข้าร่วม | |
zt_network_multicast_groups_subscribed | network_id | วัด | จำนวนเครือข่ายกลุ่มมัลติคาสต์ที่สมัครเป็นสมาชิก |
zt_network_packets | network_id ทิศทาง | เคาน์เตอร์ | จำนวนแพ็กเก็ตขาเข้า/ขาออกต่อเครือข่าย |
zt_peer_latency | node_id | ฮิสโตแกรม | เวลาแฝงของเพียร์ (มิลลิวินาที) |
zt_peer_path_count | node_id สถานะ | วัด | จำนวนเส้นทางที่จะเพียร์ |
zt_peer_packets | node_id ทิศทาง | เคาน์เตอร์ | จำนวนแพ็กเก็ตที่ส่งถึง/จากเพียร์ |
zt_peer_packet_errors | node_id | เคาน์เตอร์ | จำนวนข้อผิดพลาดของแพ็กเก็ตขาเข้าจากเพียร์ |
หากมีตัวชี้วัดอื่นๆ ที่คุณต้องการติดตาม โปรดสอบถามเราในประเด็นหรือส่งคำขอดึงมาให้เรา!
มีไฟล์เซิร์ฟเวอร์ http แบบคงที่ เหมาะสำหรับการโฮสต์ Single Page Apps ที่ http://localhost:9993/app/
ใช้ zerotier-cli info -j
เพื่อค้นหา homeDir ของบริการ zerotier-one ของคุณ
cd $ZT_HOME
sudo mkdir -p app/app1
sudo mkdir -p app/appB
echo ' <html><meta charset=utf-8><title>appA</title><body><h1>hello world A ' | sudo tee app/appA/index.html
echo ' <html><meta charset=utf-8><title>app2</title><body><h1>hello world 2 ' | sudo tee app/app2/index.html
curl -sL http://localhost:9993/app/appA http://localhost:9993/app/app2
จากนั้นไปที่ http://localhost:9993/app/app1/ และ http://localhost:9993/app/appB/
ไม่มีการร้องขอไปยังเส้นทางส่งคืนรูทของแอปindex.html ตามปกติสำหรับ SPA หากต้องการ คุณสามารถเขียนจาวาสคริปต์ที่พูดถึงบริการหรือ API ตัวควบคุมได้ หากต้องการ