前言 如果公司有3個辦公網(wǎng),比如A,B,C,三地,三地之間需要組網(wǎng),那么就可以使用wireguard來實現(xiàn)。本次我們使用wireguard來實現(xiàn)A,B,C三地組網(wǎng)。
?Wireguard介紹 WireGuard 是一種開源、輕量級、高性能的虛擬專用網(wǎng)絡(luò)(VPN)協(xié)議,旨在通過簡潔的設(shè)計和現(xiàn)代加密技術(shù)提供安全、快速的網(wǎng)絡(luò)隧道連接。
核心特性 簡潔高效 ? 簡潔高效:WireGuard 代碼量僅約 4,000 行,相比傳統(tǒng) VPN 協(xié)議(如 OpenVPN 或 IPsec)更易于審計和維護。其設(shè)計去除了復(fù)雜的證書管理,僅依賴公鑰加密實現(xiàn)身份驗證。 ? 內(nèi)核級集成(Linux 5.6+ 版本原生支持),資源占用低,性能優(yōu)異,單核吞吐量可達 10Gbps。 現(xiàn)代加密技術(shù) ? 采用 Curve25519(密鑰交換)、ChaCha20(數(shù)據(jù)加密)和 Poly1305(數(shù)據(jù)完整性校驗)等先進算法,確保傳輸安全且高效。 ? 支持“完美前向保密”(Perfect Forward Secrecy),即使密鑰泄露,歷史通信仍無法被破解。 跨平臺與易用性 ? 兼容 Linux、Windows、macOS、iOS、Android 等主流系統(tǒng),配置文件僅需 Interface(本地配置)和 Peer(對端設(shè)備)兩部分。 ? 部署快捷,通過 wg genkey 和 wg pubkey 命令即可生成密鑰對,并通過 UDP 協(xié)議實現(xiàn)快速連接。 網(wǎng)絡(luò)適應(yīng)性 ? 基于 UDP 協(xié)議傳輸,規(guī)避 TCP 協(xié)議可能存在的連接阻塞問題,同時通過 IP 綁定 Cookie 機制防御拒絕服務(wù)攻擊。 ? 支持動態(tài) IP 漫游,設(shè)備切換網(wǎng)絡(luò)時無需重新建立連接。 典型的應(yīng)用場景 ? 企業(yè)員工可通過 WireGuard 安全接入內(nèi)部網(wǎng)絡(luò),訪問資源(如數(shù)據(jù)庫、文件服務(wù)器)。 ? 用戶可通過 WireGuard 隧道加密所有流量,防止 ISP 監(jiān)控或公共 Wi-Fi 數(shù)據(jù)竊取。 ? 連接不同云服務(wù)商的虛擬機,構(gòu)建混合云網(wǎng)絡(luò)。 ? 通過 IPv6 公網(wǎng)地址直接訪問家庭或企業(yè)內(nèi)網(wǎng),無需第三方中繼。 ? 直接在設(shè)備間建立加密隧道,適用于物聯(lián)網(wǎng)(IoT)設(shè)備或服務(wù)器間數(shù)據(jù)傳輸。 技術(shù)對比與優(yōu)勢 picture 0
工作原理簡析 密鑰交換 ? 使用 NoiseIK 協(xié)議完成單次往返密鑰交換,生成會話密鑰。 數(shù)據(jù)傳輸 ? 加密數(shù)據(jù)通過 UDP 封裝傳輸,支持動態(tài)調(diào)整 MTU 值以優(yōu)化網(wǎng)絡(luò)性能。 會話管理 ? 內(nèi)置狀態(tài)機機制,自動處理連接中斷與恢復(fù),用戶無需手動干預(yù)。 環(huán)境準備 ? 一臺擁有公網(wǎng)IP的機器,用于做中繼 ? 兩個不同網(wǎng)段的局域網(wǎng),用于組網(wǎng) ? 兩臺機器,一臺用于管理,一臺用于組網(wǎng) 組網(wǎng) 網(wǎng)絡(luò)架構(gòu)圖如下 picture 4
配置中繼服務(wù)器 sudo apt install wireguard
生成服務(wù)端密鑰對: 執(zhí)行以下命令后,將在 /etc/wireguard 目錄下生成私鑰文件 privatekey 和公鑰文件 publickey :
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
創(chuàng)建配置文件:在 /etc/wireguard 目錄下創(chuàng)建一個名為 wg0.conf 的配置文件,使用編輯器打開并編寫配置:
sudo vim /etc/wireguard/wg0.conf
配置文件內(nèi)容如下:
[Interface] Address = 10.0.0.1/24 #WireGuard 的接口地址,可以從為專用網(wǎng)絡(luò)保留的地址范圍(10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16)中選擇一個 IP 地址。 ListenPort = 51820 #WireGuard 的監(jiān)聽端口,可以自定義,但需要與客戶端配置文件中的端口一致。 PrivateKey = YOUR_SERVER_PRIVATE_KEY #服務(wù)端私鑰,使用 wg genkey 命令生成。 SaveConfig = true #保存配置文件 PostUp = iptables -A FORWARD -i eth0 -j ACCEPT; iptables -A FORWARD -o eth0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE #啟動時執(zhí)行的命令 PostDown = iptables -D FORWARD -i eth0 -j ACCEPT; iptables -D FORWARD -o eth0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE #關(guān)閉時執(zhí)行的命令 # A機器的公鑰,寫上A機器的內(nèi)網(wǎng)IP段 [Peer] PublicKey = YOUR_CLIENT_PUBLIC_KEY #客戶端公鑰,使用 wg pubkey 命令生成。 AllowedIPs = 10.0.0.0/24,192.168.2.0/24 #允許訪問的 IP 地址范圍,可以是局域網(wǎng)內(nèi)的所有 IP 地址,也可以是特定的 IP 地址,這里我們需要把B地的內(nèi)網(wǎng)IP段加進去。 # B機器的公鑰,寫上B機器的內(nèi)網(wǎng)IP段 [Peer] PublicKey = YOUR_CLIENT_PUBLIC_KEY #客戶端公鑰,使用 wg pubkey 命令生成。 AllowedIPs = 10.0.0.0/24,192.168.1.0/24 #允許訪問的 IP 地址范圍,可以是局域網(wǎng)內(nèi)的所有 IP 地址,也可以是特定的 IP 地址,這里我們需要把A地的內(nèi)網(wǎng)IP段加進去。
設(shè)置 /etc/wireguard 目錄下所有文件的權(quán)限為 600,確保服務(wù)的安全性。
sudo chmod 600 /etc/wireguard/*
啟動 WireGuard 服務(wù):
sudo wg-quick up wg0
查看 WireGuard 服務(wù)狀態(tài):
sudo wg
WireGuard 可以使用 Systemd 進行管理,運行以下命令設(shè)置 WireGuard 接口開機自啟動:
sudo systemctl enable wg-quick@wg0
啟用 IP 轉(zhuǎn)發(fā),打開 /etc/sysctl.conf 文件:
sudo vim /etc/sysctl.conf
添加以下內(nèi)容:
net.ipv4.ip_forward = 1
保存文件并應(yīng)用配置:
sudo sysctl -p
如果系統(tǒng)啟用了防火墻,則需要在防火墻放行 UDP 端口 51820 的流量,我使用的是 ufw 軟件管理防火墻,相應(yīng)的命令如下:
sudo ufw allow 51820/udp
到這里,WireGuard 的服務(wù)端就已經(jīng)設(shè)置好了。
配置機器A客戶端 開啟 IP 地址轉(zhuǎn)發(fā)
sudo vim /etc/sysctl.conf
添加以下內(nèi)容:
net.ipv4.ip_forward = 1
保存文件并應(yīng)用配置:
sudo sysctl -p
安裝 WireGuard 客戶端: 參考上面的方法安裝一個客戶端,這里就不贅述了。
配置客戶端配置文件:
sudo vim /etc/wireguard/wg0.conf
配置文件內(nèi)容如下:
[Interface] PrivateKey = YOUR_CLIENT_PRIVATE_KEY #客戶端私鑰,使用 wg genkey 命令生成。 Address = 10.0.0.2/24 #WireGuard 的接口地址,可以從為專用網(wǎng)絡(luò)保留的地址范圍(10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16)中選擇一個 IP 地址。 DNS = 8.8.8.8,8.8.4.4 #DNS 服務(wù)器地址,可以自定義,也可以使用運營商的 DNS 服務(wù)器。 [Peer] PublicKey = YOUR_SERVER_PUBLIC_KEY #服務(wù)端公鑰,使用 wg pubkey 命令生成。 Endpoint = 8.8.8.8:51820 #服務(wù)端 IP 地址和端口,需要與服務(wù)端配置文件中的 Endpoint 一致。 AllowedIPs = 10.0.0.0/24,192.168.2.0/24 #允許訪問的 IP 地址范圍,可以是局域網(wǎng)內(nèi)的所有 IP 地址,也可以是特定的 IP 地址,這里我們需要把B地的內(nèi)網(wǎng)IP段加進去。
啟動 WireGuard 客戶端:
sudo wg-quick up wg0
查看 WireGuard 客戶端狀態(tài):
sudo wg
到這里,WireGuard 的客戶端就已經(jīng)設(shè)置好了。
配置機器B客戶端 配置機器B客戶端的步驟與機器A客戶端的步驟類似,這里就不贅述了。
說個不一樣的,在配置文件中,需要把A地的內(nèi)網(wǎng)IP段加進去。還有Address需要修改為10.0.0.3/24
AllowedIPs = 10.0.0.0/24,192.168.1.0/24 #允許訪問的 IP 地址范圍,可以是局域網(wǎng)內(nèi)的所有 IP 地址,也可以是特定的 IP 地址,這里我們需要把A地的內(nèi)網(wǎng)IP段加進去。
到這里,WireGuard 的客戶端就已經(jīng)設(shè)置好了。
開啟Nat轉(zhuǎn)發(fā),實現(xiàn)兩地互通 以下命令A(yù)機器和B機器都需要執(zhí)行
iptables -A FORWARD -i wg0 -d 192.168.1.0/24 -j ACCEPT iptables -A FORWARD -o wg0 -s 192.168.1.0/24 -j ACCEPT iptables -A FORWARD -j DROP # 拒絕其他轉(zhuǎn)發(fā)流量
OpenWrt配置[可選] OpenWrt的配置與Linux的配置類似,這里就不贅述了。 新增一個wireguard的虛擬接口,然后配置好配置文件,啟動服務(wù),開啟轉(zhuǎn)發(fā),開啟nat功能。 將wireguard接口加入到LAN規(guī)則中,然后開啟IP轉(zhuǎn)發(fā)和IP 動態(tài)偽裝功能即可。
picture 5
測試 在A機器上ping B機器的內(nèi)網(wǎng)IP,如果能ping通,則說明組網(wǎng)成功。
總結(jié) 其實核心步驟是A,B這兩個機器作為了個兩個網(wǎng)段的網(wǎng)關(guān),所以需要開啟Ip路由轉(zhuǎn)發(fā)以及Nat功能。如果使用OpenWrt,則可以參考上面的OpenWrt配置部分,如果使用Linux,則可以參考非OpenWrt部分上面的配置。
閱讀原文:原文鏈接
該文章在 2025/5/20 9:34:04 編輯過