介紹
WireGuard是一款輕量級的虛擬私人網絡(VPN),支持IPv4和IPv6連接。VPN允許您在不受信任的網絡上穿越,就像您在私人網絡上一樣。當連接到不受信任的網絡時,例如酒店或咖啡店的WiFi,它使您能夠安全地從智能手機或筆記本電腦訪問互聯網。
WireGuard的加密依賴於用於對等方建立加密隧道的公鑰和私鑰。每個WireGuard版本使用特定的加密密碼套件來確保簡單性、安全性和與對等方的兼容性。
相比之下,其他VPN軟件(如OpenVPN和IPSec)使用傳輸層安全性(TLS)和證書來驗證並在系統之間建立加密隧道。不同版本的TLS包括對數百種不同的加密套件和算法的支持,雖然這可以提供極大的靈活性來支持不同的客戶端,但也使得配置使用TLS的VPN更加耗時、複雜且容易出錯。
在這個教程中,您將在Ubuntu 22.04服務器上設置WireGuard,然後配置另一台機器作為對等端,使用IPv4和IPv6連接(通常稱為雙棧連接)。您還將學習如何在網關配置中將對等端的互联网流量路由通過WireGuard服務器,並使用VPN進行加密的點對點隧道。
對於本教程,我們將配置另一個Ubuntu 22.04系統作為WireGuard服務器的對等端(也稱為客戶端)。本系列的後續教程將解釋如何在Windows、macOS、Android和iOS系統和設備上安裝和運行WireGuard。
注意:如果您打算在DigitalOcean Droplet上設置WireGuard,請注意我們和許多托管提供商一樣,將對流量超額收費。因此,請注意您的服務器處理了多少流量。請參閱此頁面了解更多信息。
先決條件
要按照本教程進行操作,您需要:
- 一台具有sudo非root用戶和啟用了防火墻的Ubuntu 22.04服務器。要完成此操作,您可以參考我們的使用Ubuntu 22.04進行初始服務器設置教程。在本指南中,我們將其稱為WireGuard服務器。
- 您需要一台客戶端機器來連接到您的WireGuard服務器。在本教程中,我們將將此機器稱為WireGuard對等端。為了本教程的目的,建議您使用本地機器作為WireGuard對等端,但如果您喜歡,也可以使用遠程服務器或手機作為客戶端。如果您使用遠程系統,請務必在本教程後面的所有可選部分中進行遵循,否則可能會被系統鎖定。
- 要使用IPv6與WireGuard,您還需要確保您的服務器配置為支持該類流量。如果您想啟用WireGuard的IPv6支持,並且正在使用DigitalOcean Droplet,請參閱此文檔頁面如何在Droplets上啟用IPv6。您可以在創建Droplet時添加IPv6支持,或者在該頁面上使用說明進行後續操作。
步驟1 — 安裝WireGuard並生成密鑰對
本教程的第一步是在您的服務器上安裝WireGuard。首先,更新您的WireGuard服務器的套件索引,然後使用以下命令安裝WireGuard。如果這是您在本會話中首次使用sudo
,系統可能會提示您輸入sudo用戶的密碼:
現在您已安裝了 WireGuard,下一步是為伺服器生成私鑰和公鑰對。您將使用內建的 wg genkey
和 wg pubkey
命令來創建這些金鑰,然後將私鑰添加到 WireGuard 的配置文件中。
您還需要使用 chmod
命令更改您剛創建的金鑰的權限,因為默認情況下,該文件可由服務器上的任何用戶讀取。
使用以下命令創建 WireGuard 的私鑰並更改其權限:
sudo chmod go=...
命令會移除文件對除了 root 用戶之外的用戶和群組的任何權限,以確保僅 root 用戶能夠訪問私鑰。
您應該收到一行 base64
編碼的輸出,這是私鑰。輸出的副本還存儲在 /etc/wireguard/private.key
文件中,供命令的 tee
部分以後參考。請仔細記下輸出的私鑰,因為稍後在本節中您需要將其添加到 WireGuard 的配置文件中。
下一步是創建相應的公鑰,該公鑰是從私鑰派生的。使用以下命令創建公鑰文件:
此命令由三個單獨的命令組成,使用 |
(管道)運算符連接在一起:
sudo cat /etc/wireguard/private.key
:此命令讀取私鑰檔並將其輸出到標準輸出流。wg pubkey
:第二個命令將第一個命令的輸出作為其標準輸入並處理以生成公鑰。sudo tee /etc/wireguard/public.key
:最後一個命令將公鑰生成命令的輸出重定向到名為/etc/wireguard/public.key
的文件中。
執行該命令時,您將再次收到一行base64
編碼的輸出,這是您的WireGuard Server的公鑰。將其複製到某個位置以供參考,因為您需要將公鑰分發給連接到服務器的任何對等方。
步驟 2 — 選擇 IPv4 和 IPv6 地址
在上一節中,您安裝了WireGuard並生成了一對用於加密與服務器之間流量的金鑰。在本節中,您將為服務器創建一個配置文件,並設置WireGuard在您的服務器重新啟動時自動啟動。您還將定義私有IPv4和IPv6地址以與您的WireGuard Server和對等方一起使用。
如果您計劃同時使用IPv4和IPv6地址,請遵循這兩個部分。否則,請按照您的VPN網絡需求的相應部分進行操作。
步驟2(a) — 選擇IPv4範圍
如果您將您的WireGuard服務器與IPv4對等端一起使用,則服務器需要一個範圍的私有IPv4地址,以供客戶端使用,並用於其隧道接口。您可以從以下保留的地址塊中選擇任何範圍的IP地址(如果您想了解有關這些塊如何分配的更多信息,請訪問RFC 1918規範):
10.0.0.0
到10.255.255.255
(10/8前綴)172.16.0.0
到172.31.255.255
(172.16/12前綴)192.168.0.0
到192.168.255.255
(192.168/16前綴)
為了本教程的目的,我們將使用10.8.0.0/24
作為來自第一範圍保留IP的IP地址塊。該範圍將允許最多255個不同的對等連接,通常不應與其他私有IP範圍的地址重疊或衝突。如果此示例範圍與您的網絡配置不兼容,請隨意選擇適合您網絡配置的地址範圍。
WireGuard 服务器將使用一個 IP 地址範圍中的單個 IP 地址作為其私有隧道 IPv4 地址。 我們在這裡將使用 10.8.0.1/24
,但範圍內的任何地址從 10.8.0.1
到 10.8.0.255
都可以使用。 如果您選擇與 10.8.0.1/24
不同的地址,請記下所選的 IP 地址。 您將把此 IPv4 地址添加到您在 步驟 3 — 創建 WireGuard 服務器配置 中定義的配置文件中。
步驟 2(b) — 選擇 IPv6 範圍
如果您使用 WireGuard 與 IPv6,則需要根據 RFC 4193 中的算法生成一個獨特的本地 IPv6 單播地址前綴。 您使用的地址將與虛擬隧道接口關聯。 您需要完成一些步驟來在保留的私有 IPv6 地址塊 fd00::/8
中生成一個隨機的、唯一的 IPv6 前綴。
根據 RFC,獲取唯一 IPv6 前綴的推薦方法是將當天的時間與來自系統(如序列號或設備 ID)的唯一識別值結合。 然後對這些值進行哈希處理並截斷,從而產生一組位,可用作保留私有 fd00::/8
IP 地址塊內的唯一地址。
要開始為您的WireGuard伺服器生成IPv6範圍,請使用以下命令使用date
工具收集64位時間戳:
您將收到一個類似以下的數字,這是自1970-01-01 00:00:00 UTC以來的秒數(date
命令中的%s
),以及納秒數(%N
)的組合:
Output1650301699497770167
將值記錄在某個地方以供稍後在本節中使用。接下來,從/var/lib/dbus/machine-id
文件中複製您的伺服器的machine-id
值。此標識符對您的系統是唯一的,並且只要伺服器存在就不應該更改。
您將收到如下輸出:
/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb
現在,您需要將時間戳與machine-id
結合並使用SHA-1算法對結果值進行哈希。命令將使用以下格式:
printf <timestamp><machine-id> | sha1sum
運行命令,並替換其中的時間戳和機器標識值:
您將收到以下哈希值:
Output442adea1488d96388dae9ab816045b24609a6c18 -
請注意,sha1sum
命令的輸出是十六進制的,因此輸出使用兩個字符表示一個字節的數據。例如,示例輸出中的4f
和26
是哈希數據的前兩個字節。
RFC中的算法僅需要哈希輸出的最低有效(尾部)40位,即5個字節。使用cut
命令打印哈希的最後5個十六進制編碼字節:
使用-c
參數告訴cut
命令僅選擇一組指定的字符。31-
參數告訴cut
從位置31到輸入行的末尾打印所有字符。
您應該收到以下類似的輸出:
Output24609a6c18
在此示例輸出中,字節集為:24 60 9a 6c 18
。
現在,您可以通過使用fd
前綴附加生成的5個字節來構建您獨特的IPv6網絡前綴,使用:
冒號將每2個字節進行分隔以便閱讀。因為您獨特前綴中的每個子網可以容納18,446,744,073,709,551,616個可能的IPv6地址,所以您可以將子網限制為標準大小的/64
以簡化。
使用先前生成的字節與/64
子網大小,結果前綴將如下:
Unique Local IPv6 Address Prefixfd24:609a:6c18::/64
此fd24:609a:6c18::/64
範圍將用於將單獨的IP地址分配給伺服器和對等方上的WireGuard隧道介面。為了為伺服器分配一個IP,請在最後的::
字符後添加一個1
。結果地址將是fd24:609a:6c18::1/64
。對等方可以使用範圍內的任何IP,但通常每次添加對等方時,您都會將值增加一個,例如fd24:609a:6c18::2/64
。記下IP並繼續配置本教程的下一部分中的WireGuard伺服器。
步驟3 — 建立一個 WireGuard 伺服器配置
在建立您的 WireGuard 伺服器配置之前,您需要以下資訊:
-
確保您從步驟1 — 安裝 WireGuard 和生成金鑰對中獲得了私鑰。
-
如果您正在使用 IPv4 的 WireGuard,您將需要在步驟2(a) — 選擇 IPv4 範圍中為伺服器選擇的 IP 地址,例如此示例中的
10.8.0.1/24
。 -
如果您正在使用 IPv6 的 WireGuard,您將需要在步驟2(b) — 選擇 IPv6 範圍中生成的伺服器 IP 地址。例如,此示例中的 IP 是
fd24:609a:6c18::1/64
。
一旦您获得了所需的私钥和IP地址,通过运行以下命令使用nano
或您喜欢的编辑器创建一个新的配置文件:
将以下行添加到文件中,将您的私钥替换为突出显示的base64_encoded_private_key_goes_here
值,并在Address
行上替换IP地址(es)。您还可以更改ListenPort
行,如果您想要WireGuard在不同端口上可用:
/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.8.0.1/24, fd24:609a:6c18::1/64
ListenPort = 51820
SaveConfig = true
SaveConfig
行确保当WireGuard接口关闭时,任何更改都将保存到配置文件中。
保存并关闭/etc/wireguard/wg0.conf
文件。如果您使用的是nano
,可以使用CTRL+X
,然后Y
和ENTER
来执行此操作。现在您拥有一个初始的服务器配置,您可以根据您计划如何使用WireGuard VPN服务器进行构建。
步骤4 – 调整WireGuard服务器的网络配置
如果您正在使用WireGuard连接对WireGuard服务器的对等端以访问服务器上的服务,那么您不需要完成此部分。如果您想要通过WireGuard服务器路由您的WireGuard对等端的互联网流量,那么您需要按照本教程的此部分配置IP转发。
要配置转发,请使用nano
或您喜欢的编辑器打开/etc/sysctl.conf
文件:
如果您正在使用IPv4与WireGuard,请在文件底部添加以下行:
net.ipv4.ip_forward=1
如果您正在使用IPv6与WireGuard,请在文件底部添加此行:
net.ipv6.conf.all.forwarding=1
如果您同时使用IPv4和IPv6,请确保包括两行。完成后保存并关闭文件。
要读取文件并加载新值以供您当前的终端会话使用,请运行:
Outputnet.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
现在您的WireGuard服务器将能够将来自虚拟VPN以太网设备的入站流量转发到服务器上的其他设备,并从那里转发到公共互联网。使用此配置将允许您通过服务器的IP地址路由所有来自您的WireGuard对等端的Web流量,并且您的客户端的公共IP地址将被有效隐藏。
但是,在正确路由流量通过您的服务器之前,您需要配置一些防火墙规则。这些规则将确保与您的WireGuard服务器和对等端之间的流量正常流动。
步驟 5 — 配置 WireGuard 伺服器的防火牆
在本節中,您將編輯 WireGuard 伺服器的配置,添加防火牆規則,以確保從伺服器到客戶端的流量路由正確。與前一節一樣,如果您只是將 WireGuard VPN 用於機器對機器的連接以訪問僅限於您的 VPN 的資源,則跳過此步驟。
要通過伺服器的防火牆允許 WireGuard VPN 流量,您需要啟用 masquerading,這是一個 iptables 概念,提供即時動態網絡地址轉換 (NAT) 以正確路由客戶端連接。
首先,使用 ip route
子命令查找您的 WireGuard 伺服器的公共網絡介面:
公共介面是此命令輸出中跟隨單詞 “dev” 的字符串。例如,此結果顯示了名為 eth0
的介面,如下所示:
Outputdefault via 203.0.113.1 dev eth0 proto static
請記下您的設備名稱,因為您將在下一步中將其添加到 iptables
規則中。
要向您的 WireGuard 伺服器添加防火牆規則,請再次使用 nano
或您偏好的編輯器打開 /etc/wireguard/wg0.conf
文件。
在文件底部的 SaveConfig = true
行之後,粘貼以下行:
/etc/wireguard/wg0.conf. . .
PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostUp
行將在WireGuard服務器啟動虛擬VPN隧道時運行。在此示例中,它將添加三個ufw
和iptables
規則:
ufw route allow in on wg0 out on eth0
– 這條規則將允許在wg0
VPN介面上進入的IPv4和IPv6流量轉發到服務器上的eth0
網絡介面。它與您在上一節中配置的net.ipv4.ip_forward
和net.ipv6.conf.all.forwarding
sysctl值一起工作。iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– 這個規則配置了masquerading,並重寫了通過wg0
VPN介面進入的IPv4流量,使其看起來像是直接源自WireGuard服務器的公共IPv4地址。ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– 這個規則配置了masquerading,並重寫了通過wg0
VPN介面進入的IPv6流量,使其看起來像是直接源自WireGuard服務器的公共IPv6地址。
PreDown
規則在WireGuard服務器停止虛擬VPN隧道時運行。這些規則是PostUp
規則的反向,用於當VPN停止時取消VPN介面的轉發和masquerading規則。
在這兩種情況下,編輯配置以包含或排除適合您的VPN的IPv4和IPv6規則。例如,如果您只使用IPv4,則可以排除具有ip6tables
命令的行。
相反地,如果您只使用IPv6,則編輯配置以僅包括ip6tables
命令。 ufw
行應存在於IPv4和IPv6網路的任何組合中。完成後保存並關閉文件。
配置WireGuard服務器防火墻的最後一部分是允許流量往返於WireGuard UDP端口本身。如果您沒有在服務器的/etc/wireguard/wg0.conf
文件中更改端口,則要打開的端口是51820
。如果您在編輯配置時選擇了不同的端口,請務必在下面的UFW命令中進行替換。
如果您在遵循先決條件教程時忘記打開SSH端口,也在這裡添加它:
注意:如果您使用不同的防火牆或自定義了您的UFW配置,您可能需要添加額外的防火牆規則。例如,如果您決定將所有網絡流量隧道化到VPN連接上,則需要確保允許端口53
的流量進行DNS請求,以及端口80
和443
分別用於HTTP和HTTPS流量。如果有其他您在VPN上使用的協議,則您還需要為它們添加規則。
添加這些規則後,禁用並重新啟用UFW以重新啟動它並加載您修改的所有文件中的更改:
您可以通過運行ufw status
命令來確認規則是否生效。運行它,您應該會收到如下類似的輸出:
OutputStatus: active
To Action From
-- ------ ----
51280/udp ALLOW Anywhere
22/tcp ALLOW Anywhere
51280/udp (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
您的WireGuard服务器现已配置正确,可处理VPN流量,包括为对等方进行转发和伪装。通过设置防火墙规则,您可以启动WireGuard服务本身以侦听对等方连接。
步骤6 — 启动WireGuard服务器
可以使用内置的wg-quick
脚本将WireGuard配置为作为systemd
服务运行。虽然您可以在想使用VPN时每次手动使用wg
命令创建隧道,但这样做是一个重复性和容易出错的手动过程。相反,您可以使用systemctl
通过wg-quick
脚本来管理隧道。
使用systemd
服务意味着您可以配置WireGuard在启动时启动,这样只要服务器正在运行,您就可以随时连接到您的VPN。为此,请将wg0
隧道的wg-quick
服务添加到systemctl
以启用它:
请注意,命令指定了隧道名称wg0
设备名称作为服务名称的一部分。该名称映射到/etc/wireguard/wg0.conf
配置文件。这种命名方法意味着您可以使用服务器创建任意数量的独立VPN隧道。
例如,您可以有一个名称为prod
的隧道设备,其配置文件将是/etc/wireguard/prod.conf
。每个隧道配置可以包含不同的IPv4、IPv6和客户端防火墙设置。通过这种方式,您可以支持多个不同的对等连接,每个连接都有自己独特的IP地址和路由规则。
现在启动服务:
使用以下命令双重检查WireGuard服务是否处于活动状态。您应该在输出中看到active (running)
:
Output● [email protected] - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 98834 (code=exited, status=0/SUCCESS)
CPU: 193ms
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6)
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
输出显示用于创建虚拟wg0
设备并为其分配您添加到配置文件中的IPv4和IPv6地址的ip
命令。您可以使用这些规则来排除隧道问题,或者如果您希望尝试手动配置VPN接口,则可以直接使用wg
命令。
配置好并运行服务器后,下一步是将客户机配置为WireGuard对等体并连接到WireGuard服务器。
步骤7 — 配置WireGuard对等体
配置WireGuard对等体类似于设置WireGuard服务器。一旦安装了客户端软件,您将生成公钥和私钥对,为对等体定义IP地址或地址,定义对等体的配置文件,然后使用wg-quick
脚本启动隧道。
您可以通過以下步驟生成金鑰對和配置,將您的VPN添加多個對等方。如果您將多個對等方添加到VPN,請務必記錄它們的私有IP地址,以防止衝突。
要配置WireGuard對等方,請確保您已安裝WireGuard套件,使用以下apt
命令。在WireGuard對等方上運行:
創建WireGuard對等方的金鑰對
接下來,您需要使用與在服務器上相同的步驟在對等方上生成金鑰對。從將用作對等方的本地機器或遠程服務器上繼續,使用以下命令為對等方創建私有金鑰:
同樣,您將收到一行base64
編碼的輸出,這是私有金鑰。輸出的副本也存儲在/etc/wireguard/private.key
中。仔細記錄輸出的私有金鑰,因為您稍後需要將其添加到WireGuard的配置文件中。
接下來,使用以下命令創建公鑰文件:
您將再次收到一行base64
編碼的輸出,這是您的WireGuard對等方的公鑰。將其複製到某個位置以供參考,因為您需要將公鑰分發給WireGuard服務器,以建立加密連接。
創建 WireGuard 對等體的配置文件
現在您已經有了一對金鑰,您可以為對等體創建一個配置文件,其中包含它建立與 WireGuard 服務器連接所需的所有信息。
您將需要配置文件的一些信息:
-
在對等體上生成的
base64
編碼的私鑰。 -
在 WireGuard 服務器上定義的 IPv4 和 IPv6 地址範圍。
-
來自 WireGuard 服務器的
base64
編碼的公鑰。 -
WireGuard 服務器的公共 IP 地址和端口號。通常這將是 IPv4 地址,但如果您的服務器具有 IPv6 地址且您的客戶端機器與互聯網有 IPv6 連接,則可以使用此選項而非 IPv4。
將所有這些信息整理好後,使用 nano
或您偏好的編輯器,在 WireGuard 對等機器上打開一個新的 /etc/wireguard/wg0.conf
檔案:
將以下行添加到文件中,在需要時將各種數據替換為突出顯示的部分:
/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_peer_private_key_goes_here
Address = 10.8.0.2/24
Address = fd24:609a:6c18::2/64
[Peer]
PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64
Endpoint = 203.0.113.1:51820
請注意,第一個 Address
行使用您之前選擇的 10.8.0.0/24
子網中的一個 IPv4 地址。只要與服務器的 IP 不同,這個 IP 地址可以是子網中的任何內容。每次添加對等體時將地址增加 1 是一般分配 IP 的最簡單方法。
同樣,請注意,第二個 Address
行使用您之前生成的子網中的一個 IPv6 地址,並將服務器的地址增加 1。如果您決定使用不同的地址,則範圍內的任何 IP 都是有效的。
文件中的另一個值得注意的部分是最後一行的 AllowedIPs
。這兩個 IPv4 和 IPv6 範圍指示對等體僅在目的地系統的 IP 地址在任一範圍內時才通過 VPN 發送流量。使用 AllowedIPs
指令,您可以將對等體上的 VPN 限制為僅連接到 VPN 上的其他對等體和服務,或者您可以配置該設置將所有流量通過 VPN 進行隧道傳輸,並將 WireGuard 服務器用作網關。
如果您僅使用 IPv4,則省略尾隨的 fd24:609a:6c18::/64
範圍(包括逗號 ,
)。反之,如果您僅使用 IPv6,則僅包括 fd24:609a:6c18::/64
前綴,並省略 10.8.0.0/24
IPv4 範圍。
在這兩種情況下,如果你想將所有同儕的流量都通過VPN發送並使用WireGuard服務器作為所有流量的網關,那麼你可以使用0.0.0.0/0
代表整個IPv4地址空間,以及::/0
代表整個IPv6地址空間。
(可選) 配置同儕將所有流量路由到隧道上
如果你選擇使用0.0.0.0/0
或::/0
路由將所有同儕的流量路由到隧道上,並且該同儕是遠程系統,那麼你需要完成本部分的步驟。如果你的同儕是本地系統,最好跳過本部分。
對於通過SSH或其他協議使用公共IP地址訪問的遠程同儕,你需要向同儕的wg0.conf
文件添加一些額外的規則。這些規則將確保當隧道連接時,你仍然可以從隧道外部連接到系統。否則,當建立隧道時,所有通常在公共網絡接口上處理的流量將無法正確路由繞過wg0
隧道接口,導致無法訪問遠程系統。
首先,你需要確定系統使用的默認網關的IP地址。執行以下ip route
命令:
你將收到如下輸出:
Outputdefault via 203.0.113.1 dev eth0 proto static
請注意閘道器的突顯 IP 地址 203.0.113.1
以供稍後使用,以及設備 eth0
。您的設備名稱可能不同。如果是這樣,請在以下命令中以您的設備名稱替換 eth0
。
接下來,通過使用 ip address show
命令檢查設備找到系統的公共 IP:
您將收到以下類似的輸出:
Outputeth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64
在此示例輸出中,突出顯示的 203.0.113.5
IP(不包括尾部的 /20
)是分配給您需要添加到 WireGuard 配置中的 eth0
設備的公共地址。
現在使用 nano
或您喜歡的編輯器打開 WireGuard Peer 的 /etc/wireguard/wg0.conf
文件。
在 [Peer]
行之前,添加以下 4 行:
PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1
[Peer]
. . .
這些行將創建一個自定義路由規則,並添加一個自定義路由,以確保系統的公共流量使用默認閘道器。
PostUp = ip rule add table 200 from 203.0.113.5
– 此命令創建一個規則,當 IP 符合系統的公共203.0.113.5
地址時,將檢查表號為200
的任何路由項目。PostUp = ip route add table 200 default via 203.0.113.1
– 此命令確保由200
表處理的任何流量將使用203.0.113.1
閘道器進行路由,而不是使用 WireGuard 介面。
PreDown
行會在隧道關閉時移除自定義規則和路由。
注意:建立這些規則時,表號 200
是任意的。您可以使用介於 2 和 252 之間的值,或者您可以通過在 /etc/iproute2/rt_tables
文件中添加標籤,然後引用該名稱而不是數字值來使用自定義名稱。
有關 Linux 中路由表的工作原理的更多信息,請參閱《Linux IP 層網絡管理指南》的路由表部分。
如果您正在將所有對等方的流量路由到 VPN 上,請確保您已在第 4 步 — 調整 WireGuard 服務器的網絡配置和第 5 步 — 配置 WireGuard 服務器的防火牆上配置正確的sysctl
和iptables
規則。
(可選)配置 WireGuard 對等方的 DNS 解析器
如果您将WireGuard服务器用作所有对等方流量的VPN网关,则需要在[Interface]
部分添加一行,指定DNS解析器。如果您不添加此设置,则您的DNS请求可能不会受到VPN的保护,或者可能会被透露给您的互联网服务提供商或其他第三方。
如果您只是使用WireGuard访问VPN网络上的资源或在点对点配置中,则可以跳过此部分。
要将DNS解析器添加到您的对等方配置中,请首先确定WireGuard服务器正在使用哪些DNS服务器。在WireGuard服务器上运行以下命令,将您的以太网设备名称替换为eth0
,如果与此示例不同:
您应该收到如下输出:
OutputLink 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
输出的IP地址是服务器正在使用的DNS解析器。您可以选择使用任何一个或所有这些解析器,或仅根据您的需要使用IPv4或IPv6。记下您将要使用的解析器。
接下来,您需要将您选择的解析器添加到WireGuard对等方的配置文件中。回到WireGuard对等方,使用nano
或您喜欢的编辑器打开/etc/wireguard/wg0.conf
文件:
在[Peer]
行之前,添加以下内容:
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
. . .
根据您的偏好或IPv4和IPv6的要求,您可以根据自己的需要编辑列表。
一旦您在以下步驟中連接到 VPN,您可以使用像 DNS leak test.com 這樣的網站檢查您是否正在通過 VPN 發送 DNS 查詢。
您還可以使用像您在服務器上運行的 resolvectl dns
命令檢查對端是否使用配置的解析器。您應該會收到以下類似的輸出,顯示您為 VPN 隧道配置的 DNS 解析器:
OutputGlobal: 67.207.67.2 67.207.67.3
. . .
擁有所有這些 DNS 解析器設置後,您現在已準備將對端的公鑰添加到服務器,然後在對端上啟動 WireGuard 隧道。
第 8 步 — 添加對端的公鑰到 WireGuard 服務器
在將對端連接到服務器之前,將對端的公鑰添加到 WireGuard 服務器非常重要。此步驟確保您能夠連接並通過 VPN 路由流量。若未完成此步驟,WireGuard 服務器將不允許對端通過隧道發送或接收任何流量。
確保您通過運行以下命令獲取 WireGuard 對端的 base64
編碼的公鑰的副本:
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
現在登錄到 WireGuard 服務器,然後運行以下命令:
請注意,命令的 allowed-ips
部分接受一個以逗號分隔的 IPv4 和 IPv6 地址列表。如果您想要限制對等方可以分配給自己的 IP 地址,可以指定個別的 IP,或者像示例中那樣指定範圍,如果您的對等方可以使用 VPN 範圍中的任何 IP 地址。還請注意,沒有兩個對等方可以具有相同的 allowed-ips
設置。
如果您想要更新現有對等方的 allowed-ips
,可以再次運行相同的命令,但更改 IP 地址。支持多個 IP 地址。例如,要更改剛剛添加的 WireGuard 對等方以將 IP 10.8.0.100
添加到現有的 10.8.0.2
和 fd24:609a:6c18::2
IP 中,您將運行以下命令:
一旦您運行了添加對等方的命令,請使用 wg
命令檢查服務器上隧道的狀態:
Outputinterface: wg0
public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
private key: (hidden)
listening port: 51820
peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128
請注意 peer
行顯示了 WireGuard 對等方的公鑰,以及它被允許用於分配自己 IP 的 IP 地址或地址範圍。
現在您已在服務器上定義了對等方的連接參數,下一步是在對等方上啟動隧道。
步驟 9 — 將 WireGuard 對等方連接到隧道
現在您的伺服器和對等端都已配置為支持您選擇的IPv4、IPv6、封包轉發和DNS解析,是時候將對等端連接到VPN隧道了。
由於您可能只想在某些用例中使用VPN,我們將使用wg-quick
命令手動建立連接。如果您想自動啟動隧道,就像您在伺服器上所做的那樣,在第6步 — 啟動WireGuard伺服器部分中按照那些步驟操作,而不是使用wq-quick
命令。
如果您正在通過VPN路由所有流量並已設置DNS轉發,則需要在啟動隧道之前在WireGuard對等端上安裝resolvconf
工具。運行以下命令來設置這一點:
要啟動隧道,在WireGuard對等端上運行以下命令:
您將收到如下輸出:
Output[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
請注意您分配給對等端的突出顯示的IPv4和IPv6地址。
如果您將對等端上的AllowedIPs
設置為0.0.0.0/0
和::/0
(或者使用不同於您為VPN選擇的範圍),則您的輸出將類似於以下:
Output[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n
在此示例中,請注意命令添加的突出顯示的路由,這些路由對應於對等端配置中的AllowedIPs
。
您可以使用wg
命令在對等端上檢查隧道的狀態:
Outputinterface: wg0
public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
private key: (hidden)
listening port: 49338
fwmark: 0xca6c
peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
endpoint: 203.0.113.1:51820
allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
latest handshake: 1 second ago
transfer: 6.50 KiB received, 15.41 KiB sent
您還可以再次在伺服器上檢查狀態,您將收到類似的輸出。
驗證同儕是否使用 VPN,請使用 ip route
和 ip -6 route
命令。如果您正在使用 VPN 作為所有互聯網流量的網關,請檢查將用於傳送到 CloudFlare 的 1.1.1.1
和 2606:4700:4700::1111
DNS 解析器的流量的接口。
如果您只是使用 WireGuard 來訪問 VPN 上的資源,請將有效的 IPv4 或 IPv6 地址(例如網關本身)替換為這些命令。例如 10.8.0.1
或 fd24:609a:6c18::1
。
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
cache
請注意使用了 wg0
設備和您分配給同儕的 IPv4 地址 10.8.0.2
。同樣,如果您使用 IPv6,請運行以下命令:
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
再次注意使用了 wg0
接口,以及您分配給同儕的 IPv6 地址 fd24:609a:6c18::2
。
如果您的同儕安裝了瀏覽器,您也可以訪問 ipleak.net 和 ipv6-test.com 來確認同儕是否將其流量路由到 VPN 上。
當您準備斷開同儕上的 VPN 連接時,請使用 wg-quick
命令:
您將收到以下類似的輸出,指示 VPN 隧道已關閉:
Output[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
如果您將同儕上的 AllowedIPs
設置為 0.0.0.0/0
和 ::/0
(或者使用與您選擇的 VPN 不同的範圍),則您的輸出將類似於以下內容:
Output[#] ip rule delete table 200 from 203.0.113.5
[#] ip route delete table 200 default via 203.0.113.1
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
[#] iptables-restore -n
[#] ip6tables-restore -n
重新連接到VPN,請在對等端再次運行wg-quick up wg0
命令。如果您想從WireGuard伺服器完全移除對等端的配置,您可以運行以下命令,請務必替換要移除的對等端的正確公鑰:
通常情況下,您只需要移除對等端配置,如果對等端不再存在,或者其加密金鑰被破壞或更改。否則,最好保留配置,以便對等端可以重新連接到VPN,而無需每次都添加其金鑰和allowed-ips
。
結論
在本教程中,您在伺服器和客戶端Ubuntu 22.04系統上安裝了WireGuard套件和工具。您設置了WireGuard的防火牆規則,並使用伺服器上的sysctl
命令配置了核心設置以允許封包轉發。您學會了如何生成私人和公共WireGuard加密金鑰,以及如何配置伺服器和對等端(或多個對等端)以相互連接。
如果您的網絡使用IPv6,您還學會了如何生成用於對等端連接的唯一本地地址範圍。最後,您學會了如何通過限制對等端可以使用的網絡前綴,以及如何使用WireGuard伺服器作為VPN網關來處理對等端的所有互聯網流量,限制哪些流量應該通過VPN。
如果您想了解更多關於WireGuard的資訊,包括如何配置更高級的隧道,或者如何在容器中使用WireGuard,請參閱 官方WireGuard文檔。
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04