WireGuard 教程:WireGuard 的工作原理
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
無(wú)論你是想破墻而出,還是想在服務(wù)器之間組網(wǎng),WireGuard 都不會(huì)讓你失望,它就是組網(wǎng)的『樂高積木』,就像 ZFS 是構(gòu)建文件系統(tǒng)的『樂高積木』一樣。 WireGuard 與其他 威屁恩 協(xié)議的性能測(cè)試對(duì)比: 可以看到 WireGuard 直接碾壓其他 威屁恩 協(xié)議。再來說說 WireGuard 優(yōu)點(diǎn):
WireGuard 不能做的事:
當(dāng)然,你可以使用 WireGuard 作為底層協(xié)議來實(shí)現(xiàn)自己想要的功能,從而彌補(bǔ)上述這些缺憾。 本系列 WireGuard 教程分為兩個(gè)部分,第一部分偏理論,第二部分偏實(shí)踐。本文是第一部分,下面開始正文教程。 1. WireGuard 術(shù)語(yǔ) Peer/Node/Device連接到 威屁恩 并為自己注冊(cè)一個(gè) 威屁恩 子網(wǎng)地址(如 192.0.2.3)的主機(jī)。還可以通過使用逗號(hào)分隔的 CIDR 指定子網(wǎng)范圍,為其自身地址以外的 IP 地址選擇路由。 中繼服務(wù)器(Bounce Server)一個(gè)公網(wǎng)可達(dá)的對(duì)等節(jié)點(diǎn),可以將流量中繼到 子網(wǎng)(Subnet)一組私有 IP,例如 CIDR 表示法這是一種使用掩碼表示子網(wǎng)大小的方式,這個(gè)不用解釋了。 NAT子網(wǎng)的私有 IP 地址由路由器提供,通過公網(wǎng)無(wú)法直接訪問私有子網(wǎng)設(shè)備,需要通過 NAT 做網(wǎng)絡(luò)地址轉(zhuǎn)換。路由器會(huì)跟蹤發(fā)出的連接,并將響應(yīng)轉(zhuǎn)發(fā)到正確的內(nèi)部 IP。 公開端點(diǎn)(Public Endpoint)節(jié)點(diǎn)的公網(wǎng) IP 地址:端口,例如 私鑰(Private key)單個(gè)節(jié)點(diǎn)的 WireGuard 私鑰,生成方法是: 公鑰(Public key)單個(gè)節(jié)點(diǎn)的 WireGuard 公鑰,生成方式為: DNS域名服務(wù)器,用于將域名解析為 威屁恩 客戶端的 IP,不讓 DNS請(qǐng)求泄漏到 威屁恩 之外。 2. WireGuard 工作原理 中繼服務(wù)器工作原理中繼服務(wù)器(Bounce Server)和普通的對(duì)等節(jié)點(diǎn)一樣,它能夠在 如果所有的對(duì)等節(jié)點(diǎn)都是公網(wǎng)可達(dá)的,則不需要考慮中繼服務(wù)器,只有當(dāng)有對(duì)等節(jié)點(diǎn)位于 NAT 后面時(shí)才需要考慮。 在 WireGuard 里,客戶端和服務(wù)端基本是平等的,差別只是誰(shuí)主動(dòng)連接誰(shuí)而已。雙方都會(huì)監(jiān)聽一個(gè) UDP 端口,誰(shuí)主動(dòng)連接,誰(shuí)就是客戶端。主動(dòng)連接的客戶端需要指定對(duì)端的公網(wǎng)地址和端口,被動(dòng)連接的服務(wù)端不需要指定其他對(duì)等節(jié)點(diǎn)的地址和端口。如果客戶端和服務(wù)端都位于 NAT 后面,需要加一個(gè)中繼服務(wù)器,客戶端和服務(wù)端都指定中繼服務(wù)器作為對(duì)等節(jié)點(diǎn),它們的通信流量會(huì)先進(jìn)入中繼服務(wù)器,然后再轉(zhuǎn)發(fā)到對(duì)端。 WireGuard 是支持漫游的,也就是說,雙方不管誰(shuí)的地址變動(dòng)了,WireGuard 在看到對(duì)方從新地址說話的時(shí)候,就會(huì)記住它的新地址(跟 mosh 一樣,不過是雙向的)。所以雙方要是一直保持在線,并且通信足夠頻繁的話(比如配置 Wireguard 如何路由流量利用 WireGuard 可以組建非常復(fù)雜的網(wǎng)絡(luò)拓?fù)洌@里主要介紹幾個(gè)典型的拓?fù)洌?/p> ① 端到端直接連接 這是最簡(jiǎn)單的拓?fù)洌械墓?jié)點(diǎn)要么在同一個(gè)局域網(wǎng),要么直接通過公網(wǎng)訪問,這樣 ② 一端位于 NAT 后面,另一端直接通過公網(wǎng)暴露 這種情況下,最簡(jiǎn)單的方案是:通過公網(wǎng)暴露的一端作為服務(wù)端,另一端指定服務(wù)端的公網(wǎng)地址和端口,然后通過 ③ 兩端都位于 NAT 后面,通過中繼服務(wù)器連接 大多數(shù)情況下,當(dāng)通信雙方都在 NAT 后面的時(shí)候,NAT 會(huì)做源端口隨機(jī)化處理,直接連接可能比較困難。可以加一個(gè)中繼服務(wù)器,通信雙方都將中繼服務(wù)器作為對(duì)端,然后維持長(zhǎng)連接,流量就會(huì)通過中繼服務(wù)器進(jìn)行轉(zhuǎn)發(fā)。 ④ 兩端都位于 NAT 后面,通過 UDP NAT 打洞 上面也提到了,當(dāng)通信雙方都在 NAT 后面的時(shí)候,直接連接不太現(xiàn)實(shí),因?yàn)榇蠖鄶?shù) NAT 路由器對(duì)源端口的隨機(jī)化相當(dāng)嚴(yán)格,不可能提前為雙方協(xié)調(diào)一個(gè)固定開放的端口。必須使用一個(gè)信令服務(wù)器( 如果某一端同時(shí)連接了多個(gè)對(duì)端,當(dāng)它想訪問某個(gè) IP 時(shí),如果有具體的路由可用,則優(yōu)先使用具體的路由,否則就會(huì)將流量轉(zhuǎn)發(fā)到中繼服務(wù)器,然后中繼服務(wù)器再根據(jù)系統(tǒng)路由表進(jìn)行轉(zhuǎn)發(fā)。你可以通過測(cè)量 ping 的時(shí)間來計(jì)算每一跳的長(zhǎng)度,并通過檢查對(duì)端的輸出( WireGuard 報(bào)文格式WireGuard 使用加密的 UDP 報(bào)文來封裝所有的數(shù)據(jù),UDP 不保證數(shù)據(jù)包一定能送達(dá),也不保證按順序到達(dá),但隧道內(nèi)的 TCP 連接可以保證數(shù)據(jù)有效交付。WireGuard 的報(bào)文格式如下圖所示: 關(guān)于 WireGuard 報(bào)文的更多信息可以參考下面幾篇文檔: WireGuard 的性能WireGuard 聲稱其性能比大多數(shù) 威屁恩 協(xié)議更好,但這個(gè)事情有很多爭(zhēng)議,比如某些加密方式支持硬件層面的加速。 WireGuard 直接在內(nèi)核層面處理路由,直接使用系統(tǒng)內(nèi)核的加密模塊來加密數(shù)據(jù),和 Linux 原本內(nèi)置的密碼子系統(tǒng)共存,原有的子系統(tǒng)能通過 關(guān)于性能比較的更多信息可以參考下面幾篇文檔:
WireGuard 安全模型WireGuard 使用以下加密技術(shù)來保障數(shù)據(jù)的安全:
WireGuard 的加密技術(shù)本質(zhì)上是 關(guān)于 WireGuard 加密的更多資料請(qǐng)參考下方鏈接: WireGuard 密鑰管理WireGuard 通過為每個(gè)對(duì)等節(jié)點(diǎn)提供簡(jiǎn)單的公鑰和私鑰來實(shí)現(xiàn)雙向認(rèn)證,每個(gè)對(duì)等節(jié)點(diǎn)在設(shè)置階段生成密鑰,且只在對(duì)等節(jié)點(diǎn)之間共享密鑰。每個(gè)節(jié)點(diǎn)除了公鑰和私鑰,不再需要其他證書或預(yù)共享密鑰。 在更大規(guī)模的部署中,可以使用 下面是一些有助于密鑰分發(fā)和部署的服務(wù): 如果你不想在
從技術(shù)上講,多個(gè)服務(wù)端之間可以共享相同的私鑰,只要客戶端不使用相同的密鑰同時(shí)連接到兩個(gè)服務(wù)器。但有時(shí)客戶端會(huì)需要同時(shí)連接多臺(tái)服務(wù)器,例如,你可以使用 該文章在 2024/7/24 18:54:39 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |