1. 前言
WireGuard 是由 Jason Donenfeld 等人用 C 語(yǔ)言編寫(xiě)的一個(gè)開(kāi)源 威屁恩 協(xié)議,被視為下一代 威屁恩 協(xié)議,旨在解決許多困擾 IPSec/IKEv2、Open威屁恩 或 L2TP 等其他 威屁恩 協(xié)議的問(wèn)題。它與 Tinc 和 MeshBird 等現(xiàn)代 威屁恩 產(chǎn)品有一些相似之處,即加密技術(shù)先進(jìn)、配置簡(jiǎn)單。從 2020 年 1 月開(kāi)始,它已經(jīng)并入了 Linux 內(nèi)核的 5.6 版本,這意味著大多數(shù) Linux 發(fā)行版的用戶將擁有一個(gè)開(kāi)箱即用的 WireGuard。
1.1. WireGuard 優(yōu)點(diǎn)
配置精簡(jiǎn),可直接使用默認(rèn)值
只需最少的密鑰管理工作,每個(gè)主機(jī)只需要 1 個(gè)公鑰和 1 個(gè)私鑰。
就像普通的以太網(wǎng)接口一樣,以 Linux 內(nèi)核模塊的形式運(yùn)行,資源占用小。
能夠?qū)⒉糠至髁炕蛩辛髁客ㄟ^(guò) 威屁恩 傳送到局域網(wǎng)內(nèi)的任意主機(jī)。
能夠在網(wǎng)絡(luò)故障恢復(fù)之后自動(dòng)重連,戳到了其他 威屁恩 的痛處。
比目前主流的 威屁恩 協(xié)議,連接速度要更快,延遲更低(見(jiàn)上圖)。
使用了更先進(jìn)的加密技術(shù),具有前向加密和抗降級(jí)攻擊的能力。
支持任何類(lèi)型的二層網(wǎng)絡(luò)通信,例如 ARP、DHCP 和 ICMP,而不僅僅是 TCP/HTTP。
可以運(yùn)行在主機(jī)中為容器之間提供通信,也可以運(yùn)行在容器中為主機(jī)之間提供通信。
1.2. WireGuard 工作原理
中繼服務(wù)器工作原理
中繼服務(wù)器(Bounce Server)和普通的對(duì)等節(jié)點(diǎn)一樣,它能夠在 NAT 后面的 威屁恩 客戶端之間充當(dāng)中繼服務(wù)器,可以將收到的任何 威屁恩 子網(wǎng)流量轉(zhuǎn)發(fā)到正確的對(duì)等節(jié)點(diǎn)。事實(shí)上 WireGuard 并不關(guān)心流量是如何轉(zhuǎn)發(fā)的,這個(gè)由系統(tǒng)內(nèi)核和 iptables 規(guī)則處理。
如果所有的對(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)聽(tīng)一個(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ō),雙方不管誰(shuí)的地址變動(dòng)了,WireGuard 在看到對(duì)方從新地址說(shuō)話的時(shí)候,就會(huì)記住它的新地址(跟 mosh 一樣,不過(guò)是雙向的)。所以雙方要是一直保持在線,并且通信足夠頻繁的話(比如配置 persistent-keepalive),兩邊的 IP 都不固定也不影響的。
2. 安裝wireguard
2.1. 前提條件
需要有公網(wǎng)IP, VPS, 而且公網(wǎng)IP需要直接綁定在VPS上,
公網(wǎng)IP綁定在網(wǎng)關(guān), 然后通過(guò)端口轉(zhuǎn)發(fā), 配置不能成功, 因?yàn)橹欣^服務(wù)器必須知道對(duì)端的公網(wǎng)IP, 如果中繼服務(wù)器放在網(wǎng)關(guān)后面, 對(duì)端IP對(duì)中繼服務(wù)器來(lái)說(shuō)已經(jīng)不可見(jiàn).
系 統(tǒng): centos 7.x
內(nèi)核要求: > 3.10 (uname -r)
三種安裝方式, 根據(jù)具體情況任選其一
2.2. 安裝方法 1: a signed module is available as built-in to CentOS's kernel-plus
sudo yum install yum-utils epel-releasesudo yum-config-manager --setopt=centosplus.includepkgs=kernel-plus --enablerepo=centosplus --savesudo sed -e 's/^DEFAULTKERNEL=kernel$/DEFAULTKERNEL=kernel-plus/' -i /etc/sysconfig/kernelsudo yum install kernel-plus wireguard-toolssudo reboot
2.3. 安裝方法 2: users wishing to stick with the standard kernel may use ELRepo's pre-built module
sudo yum install epel-release elrepo-releasesudo yum install yum-plugin-elreposudo yum install kmod-wireguard wireguard-toolssudo reboot
2.4. 安裝方法 3: users running non-standard kernels may wish to use the DKMS package instead
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmsudo curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.reposudo yum install wireguard-dkms wireguard-toolssudo reboot
3. 服務(wù)器端配置
3.1. 首先為wireguard節(jié)點(diǎn)創(chuàng)建密鑰對(duì)
cd /etc/wireguardumask 077wg genkey > node1_priv_keywg pubkey < node1_priv_key > node1_pub_keycat node1_priv_key && cat node1_pub_key
創(chuàng)建wireguard節(jié)點(diǎn)1配置文件
/etc/wireguard/wg0.conf
[Interface]Address = 192.168.2.100DNS = 114.114.114.114PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADEListenPort = 8888PrivateKey = private_key from node1_priv_key # 將上一步生成的private_key拷貝過(guò)來(lái)[Peer]PublicKey = zy3IkHgq6SdM ## Peer節(jié)點(diǎn)的公鑰AllowedIPs = 192.168.2.101/32
說(shuō)明:
Address為wireguard新生成的網(wǎng)卡的IP地址;
PostUp為wireguard服務(wù)啟動(dòng)后的執(zhí)行的命令, 即一些iptables規(guī)則
PostDown為wireguard服務(wù)關(guān)閉時(shí)需要清理的規(guī)則
其中的參數(shù)eth0為網(wǎng)卡名稱(chēng), 需要根據(jù)節(jié)點(diǎn)的實(shí)際情況替換
ListenPort 可用為任意可用的端口, 只有中繼服務(wù)器(Bounce Server)才需要配置, 其它節(jié)點(diǎn)不需要配置, 它主要是為了內(nèi)網(wǎng)穿透時(shí)UDP打洞使用.
服務(wù)啟動(dòng)后將監(jiān)聽(tīng)在udp端口, 所以防火墻需要放開(kāi)對(duì)應(yīng)的UDP端口而不是TCP端口
[Peer] 用來(lái)配置對(duì)端信息例如Node2
PublicKey 為Node2的公鑰
AllowedIPs 為節(jié)點(diǎn)Node2的ip(單臺(tái)主機(jī)) 或Node2節(jié)點(diǎn)的網(wǎng)段, 可參考為節(jié)點(diǎn)1生成密鑰對(duì)
3.2. 啟動(dòng)node1
wg-quick up wg0
查查啟動(dòng)是否成功,
啟動(dòng)成功后, 使用ifconfig查看, 應(yīng)該會(huì)多出一塊wg0的網(wǎng)卡.
使用wg命令可用查看到wireguard的當(dāng)前狀態(tài).
如果要重啟, 使用如下命令組合
wg-quick down wg0wg-quick up wg0
3.3. 設(shè)置為開(kāi)機(jī)啟動(dòng)
systemctl enable wg-quick@wg0
通過(guò)服務(wù)啟動(dòng)wireguard
systemctl start wg-quick@wg0
查看服務(wù)狀態(tài)
systemctl start wg-quick@wg0
查看日志
journalctl -u wg-quick@wg0
3.4. 配置node2
在配置node2之前需要在節(jié)點(diǎn)2上安裝wireguard, 方法參照前面介紹的安裝方法
說(shuō)明, 我的節(jié)點(diǎn)都是Linux主機(jī), 而且是redhat系列主機(jī)
在windows, 安裝方法稍有不同, 具體請(qǐng)參考官網(wǎng)的安裝指南
創(chuàng)建配置文件/etc/wireguard/wg0.conf
[Interface]Address = 192.168.2.40PrivateKey = node2_private_keyDNS = 114.114.114.114[Peer]PublicKey = node1_public_keyAllowedIPs = 192.168.2.0/24Endpoint = 1.1.1.1:8888 ## 1.1.1.1代表公網(wǎng)IPPersistentKeepalive = 25
說(shuō)明: Address 是Node2的地址, 和之前配置的Node1處在同一個(gè)網(wǎng)段
PrivateKey: 為node2節(jié)點(diǎn)的私鑰
DNS: DNS服務(wù)器IP
PublicKey: 為Node1的公鑰
AllowedIPs: Node1節(jié)點(diǎn)所處網(wǎng)段, 如果只允許Node1節(jié)點(diǎn)連接該節(jié)點(diǎn)可用指定Node1的IP
Endpoint: 1.1.1.1 為公網(wǎng)IP, 替換成你自己的公網(wǎng)IP
PersistentKeepalive: keepalive 時(shí)間, 單位秒, 這是斷線后自動(dòng)重連的關(guān)鍵.
3.5. 在Node2上啟動(dòng)wireguard
啟動(dòng)wireguard的方法跟在Node1上啟動(dòng)wireguard的方法一樣
wg-quick up wg0
設(shè)置為開(kāi)機(jī)啟動(dòng)
systemctl enable wg-quick@wg0
4. 說(shuō)明
本文原文位于鵬叔的技術(shù)博客空間 - 使用WireGuard內(nèi)網(wǎng)穿透, 需要獲得最近更新及反饋問(wèn)題請(qǐng)?jiān)L問(wèn)原文.
5. 參考文檔
使用NPS搭建內(nèi)網(wǎng)(穿透(保姆級(jí)教程)
Centos 7 安裝 Wireguard
WireGuard 教程:WireGuard 的工作原理
基于Wireguard組網(wǎng)技術(shù)的內(nèi)網(wǎng)穿透教程