本文檔是為軟體開發人員讀者所寫的。有關使用 ZeroTier 的信息,請參閱:網站、文件網站和論壇。
ZeroTier 是一款適用於地球的智慧型可程式乙太網路交換器。它允許所有連網設備、虛擬機、容器和應用程式進行通信,就好像它們都駐留在同一實體資料中心或雲端區域中一樣。
這是透過將加密尋址且安全的對等網路(稱為 VL1)與有點類似於 VXLAN(稱為 VL2)的乙太網路模擬層結合來實現的。我們的 VL2 乙太網路虛擬化層包括先進的企業 SDN 功能,例如用於網路微分段和安全監控的細粒度存取控制規則。
所有 ZeroTier 流量均使用只有您控制的金鑰進行端對端加密。儘管我們為無法建立點對點連線的用戶提供免費(但速度較慢)的中繼,但大多數流量都是點對點流動的。
ZeroTier 的目標和設計原則的靈感來自 Google BeyondCorp 的原始論文和 Jericho 論壇的「去邊界化」概念。
請造訪 ZeroTier 網站以取得更多資訊和預先建置的二進位套件。適用於 Android 和 iOS 的應用程式可在 Google Play 和 Apple 應用程式商店中免費取得。
ZeroTier 根據 BSL 1.1 版獲得許可。有關詳細信息,請參閱 LICENSE.txt 和 ZeroTier 定價頁面。 ZeroTier 可在企業和學術機構內部免費使用,也可用於非商業目的。某些類型的商業用途(例如基於 ZeroTier 建立閉源應用程式和裝置或將 ZeroTier 網路控制器和網路管理作為 SaaS 服務提供)需要商業授權。
ZeroTier 中還包含少量第三方代碼,並且不受我們的 BSL 許可證的約束。請參閱 AUTHORS.md 以取得第三方程式碼的清單、其中包含的程式碼以及適用於它的許可證。 ZeroTier 中的所有第三方代碼均獲得自由許可(MIT、BSD、Apache、公共領域等)。
ZeroTier 世界中的一切都由兩種類型的識別碼控制:40 位元/10 位元ZeroTier 位址和 64 位元/16 位元網路 ID 。這些標識符可以透過其長度輕鬆區分。 ZeroTier 位址標識節點或「裝置」(筆記型電腦、電話、伺服器、虛擬機器、應用程式等),而網路 ID 標識可以由裝置加入的虛擬乙太網路。
ZeroTier 位址可以被視為支援 VLAN 的龐大全球企業乙太網路智慧交換器上的連接埠號碼。網路 ID 是這些連接埠可以指派的 VLAN ID。一個連接埠可以分配給多個 VLAN。
ZeroTier 位址類似於8056c2e21c
,網路 ID 類似於8056c2e21c000001
。網路 ID 由該網路主控制器的 ZeroTier 位址和標識該控制器上的網路的任意 24 位元 ID 組成。網路控制器大致類似於 OpenFlow 等 SDN 協定中的 SDN 控制器,儘管與 VXLAN 和 VL2 之間的類比一樣,這不應被解讀為暗示協定或設計相同。您可以在 my.zerotier.com 使用我們方便且廉價的 SaaS 託管控制器,或執行您自己的控制器(如果您不介意擺弄 JSON 設定檔或編寫腳本來執行此操作)。
基本路徑包含 ZeroTier One 服務主入口點 ( one.cpp
)、自我測試程式碼、makefile 等。
artwork/
:圖標、標誌等。attic/
:我們希望保留以供參考的舊東西和實驗代碼。controller/
:參考網路控制器實現,預設在桌面和伺服器建置目標上建置並包含該實作。debian/
:用於在 Linux 上建立 Debian 軟體包的檔案。doc/
:手冊頁和其他文件。ext/
:第三方程式庫、我們為方便在某些平台(Mac 和 Windows)上發布的二進位檔案以及安裝支援檔案。include/
:包含 ZeroTier 核心的檔案。java/
:與我們的 Android 行動應用程式一起使用的 JNI 包裝器。 (整個 Android 應用程式不是開源的,但將來可能會開源。)node/
:ZeroTier 虛擬乙太網路交換器核心,其設計與其餘程式碼完全分離,並且能夠建置為獨立於作業系統的獨立函式庫。開發人員請注意:不要在此處使用 C++11 功能,因為我們希望它建構在缺乏 C++11 支援的舊嵌入式平台上。 C++11 可以在其他地方使用。osdep/
:支援作業系統並與作業系統整合的程式碼,包括僅為某些目標建構的特定於平台的內容。rule-compiler/
:用於定義網路層級規則的 JavaScript 規則語言編譯器。service/
:ZeroTier One 服務,它封裝了 ZeroTier 核心,並為桌上型電腦、筆記型電腦、伺服器、虛擬機器和容器的虛擬網路提供類似於 VPN 的連接。windows/
:Visual Studio 解決方案檔案、Windows 服務程式碼和 Windows 工作列套用 UI。zeroidc/
:ZeroTier 服務使用 OIDC 實作來登入支援 SSO 的網路。 (這部分是用 Rust 寫的,將來會有更多 Rust 出現在這個儲存庫中。)請從dev
分支中提取請求。
發布是透過將dev
合併到main
中,然後標記並進行建置來完成的。
要在 Mac 和 Linux 上構建,只需輸入make
。在 FreeBSD 和 OpenBSD 上,需要gmake
(GNU make),並且可以從軟體包或 ports 安裝。對於 Windows,在windows/
中有一個 Visual Studio 解決方案。
gmake
進行建置。binutils
。鍵入pkg install binutils
進行安裝。/dev/tap0
到/dev/tap3
)。gmake
進行建置。輸入make selftest
將建立一個Zerotier-selftest二進位文件,該二進位檔案測試各種內部結構並報告建置環境的幾個方面。在新穎的平台或架構上嘗試這一點是個好主意。
使用-h
選項執行Zerotier-one將顯示說明。
在 Linux 和 BSD 上,如果您從原始程式碼構建,則可以使用以下命令啟動服務:
sudo ./zerotier-one -d
在大多數發行版、macOS 和 Windows 上,安裝程式會啟動該服務並將其設定為在啟動時啟動。
將自動建立系統的主資料夾。
該服務透過 JSON API 進行控制,預設可在127.0.0.1:9993
處使用。它也偵聽0.0.0.0:9993
,只有在local.conf
中正確配置了allowManagementFrom
時才可用。我們包含一個Zerotier-cli命令列實用程序,用於為加入和離開網路等標準事物進行 API 呼叫。主資料夾中的authtoken.secret檔案包含用於存取此 API 的秘密令牌。有關 API 文檔,請參閱 service/README.md。
這是每個作業系統上主資料夾的位置(預設):
/var/lib/zerotier-one
/var/db/zerotier-one
/Library/Application Support/ZeroTier/One
ProgramDataZeroTierOne
(這是預設值。如果使用非標準磁碟機代號指派或佈局安裝 Windows,基本「共用應用程式資料」資料夾可能會有所不同。)對於大多數用戶來說,它只是有效的。
如果您正在執行本機系統防火牆,我們建議新增允許 Zerotier 的規則。如果您安裝了 Windows 的二進位文件,這應該會自動完成。其他平台可能需要手動編輯本機防火牆規則,具體取決於您的配置。
請參閱文件網站以取得更多資訊。
Mac 防火牆可以在系統偏好設定的「安全性」下找到。 Linux有多種防火牆設定係統和工具。
在 CentOS 上,檢查/etc/sysconfig/iptables
中的 IPTables 規則。其他發行版,請參閱您的發行版的文件。您還必須檢查商業第三方防火牆應用程式的 UI 或文檔,例如 Little Snitch (Mac)、McAfee Firewall Enterprise (Windows) 等(如果您正在執行這些應用程式)。某些企業環境可能具有集中管理的防火牆軟體,因此您可能還需要聯絡 IT 部門。
如果 UDP 連接埠 9993 入站打開, ZeroTier One 對等點將自動相互定位並透過本地有線 LAN 直接通訊。如果該連接埠被過濾,他們將無法看到彼此的 LAN 公告封包。如果同一實體網路上的裝置之間的效能較差,請檢查其防火牆設定。如果沒有 LAN 自動定位,對等方必須嘗試「環回」NAT 遍歷,這有時會失敗,並且在任何情況下都要求每個封包都經過外部路由器兩次。
某些類型的防火牆和「對稱」NAT 設備後面的使用者可能根本無法直接連接到外部對等點。 ZeroTier 對連接埠預測的支援有限,並且會嘗試遍歷對稱 NAT,但這並不總是有效。如果 P2P 連線失敗,您將從我們的中繼伺服器上退回 UDP 封包,從而導致效能下降。某些 NAT 路由器具有可設定的 NAT 模式,將其設為「全錐」將消除此問題。如果您這樣做,您可能還會看到 VoIP 電話、Skype、BitTorrent、WebRTC、某些遊戲等的神奇改進,因為所有這些都使用與我們類似的 NAT 穿越技術。
如果您和網路之間的防火牆封鎖了 ZeroTier 的 UDP 流量,您將退回到透過連接埠 443 到根伺服器的 TCP 隧道(https 模擬)的最後手段。這幾乎可以在任何地方工作,但與 UDP 或直接點對點連接相比速度非常慢。
您可以在我們的知識庫中找到更多協助。
Prometheus Metrics 可在/metrics
API 端點取得。此端點受到儲存在metricstoken.secret
中的API金鑰的保護,以防止不必要的資訊外洩。可以從指標中收集的資訊包括已加入的網路以及您的實例正在與之通訊的對等點。
存取控制是透過 ZeroTier 控制介面本身和metricstoken.secret
進行的。這可以透過X-ZT1-Auth
HTTP 標頭欄位作為承載身份驗證令牌發送,或作為?auth=<token>
附加到 URL。您可以使用以下命令透過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
若要在執行 ZeroTier 的機器上的 Prometheus 中配置抓取作業,請將其新增至 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_資料包 | 資料包類型、方向 | 櫃檯 | ZeroTier 資料包類型計數 |
zt_封包_錯誤 | 錯誤類型,方向 | 櫃檯 | ZeroTier 資料包錯誤 |
zt_數據 | 協議、方向 | 櫃檯 | ZeroTier 已發送或接收的位元組數 |
zt_num_網絡 | 測量 | 此實例加入的網路數量 | |
zt_network_multicast_groups_subscribed | 網路號碼 | 測量 | 網路訂閱的多播組數量 |
zt_網路_封包 | 網路_id,方向 | 櫃檯 | 每個網路傳入/傳出資料包的數量 |
zt_peer_latency | 節點id | 直方圖 | 對等延遲(毫秒) |
zt_peer_path_count | 節點 ID、狀態 | 測量 | 到對等點的路徑數 |
zt_peer_packets | 節點id,方向 | 櫃檯 | 發送/來自對等方的資料包數量 |
zt_peer_packet_errors | 節點id | 櫃檯 | 來自對等方的傳入資料包錯誤數 |
如果您希望追蹤其他指標,請在問題中詢問我們或向我們發送拉取請求!
有一個靜態 http 檔案伺服器適合託管單頁應用程序,位址為 http://localhost:9993/app/
使用zerotier-cli info -j
查找 Zerotier-one 服務的 homeDir
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 對話的 javascript。