Debian 11 WireGuard 配置教程:极速安全VPN设置指南
简介
WireGuard是一种轻量级的虚拟专用网络(VPN),支持IPv4和IPv6连接。VPN能够让您在不受信任的网络环境中,如同在私有网络中一样安全地进行通信。当您连接到酒店或咖啡店等公共WiFi时,WireGuard可以帮助您自由、安全地从智能手机或笔记本电脑访问互联网。此外,您还可以部署VPN来安全访问自己的基础设施,避免开放SSH或其他敏感端口,其工作方式类似于Tailscale。
WireGuard的加密机制依赖于用于对等设备之间建立加密隧道的公钥和私钥。每个WireGuard版本都使用特定的加密密码套件,以确保简单性、安全性以及与对等设备的兼容性。
与此相比,OpenVPN和IPSec等其他VPN软件使用传输层安全(TLS)和证书来验证并建立系统间的加密隧道。TLS的不同版本支持成百上千种不同的加密套件和算法,虽然这为不同的客户端提供了极大的灵活性,但也使得配置基于TLS的VPN更加耗时、复杂且容易出错。
在本教程中,您将在Debian 11服务器上设置WireGuard,然后配置另一台机器以使用IPv4和IPv6连接(通常称为双栈连接)连接到该服务器。您还将学习如何在网关配置中通过WireGuard服务器路由对等设备的互联网流量,以及如何使用该VPN建立加密的点对点隧道。
为了本教程的目的,我们将配置另一个Debian 11系统作为WireGuard服务器的对等设备(也称为客户端)。本系列的后续教程将解释如何在Windows、macOS、Android和iOS系统和设备上安装和运行WireGuard。
注意:如果您计划在Silicon Cloud vServer上设置WireGuard,请注意我们和许多托管提供商一样,会对超出带宽的流量收费。因此,请留意您的服务器处理的流量量。详细信息请参阅此页面。
前提条件
要跟随本教程,您需要:
- 一台已配置sudo非root用户并启用防火墙的Debian 11服务器。您可以按照我们的《Debian 11初始服务器设置教程》来完成此项设置。在本指南中,我们将其称为“WireGuard服务器”。
- 一台客户端机器,您将使用它连接到您的WireGuard服务器。在本教程中,我们将这台机器称为“WireGuard对等设备”。为了本教程的目的,建议您使用本地机器作为WireGuard对等设备,但如果您愿意,也可以使用远程服务器或移动电话作为客户端。如果您使用的是远程系统,请务必遵循本教程后面所有可选部分,否则您可能会被系统锁定。
- 要将WireGuard与IPv6一起使用,您还需要确保您的服务器已配置为支持该类型的流量。如果您希望在WireGuard中启用IPv6支持并正在使用Silicon Cloud vServer,请参阅此文档页面《如何在vServer上启用IPv6》。您可以在创建vServer时添加IPv6支持,也可以之后按照该页面上的说明进行操作。
第一步 – 安装WireGuard并生成密钥对
本教程的第一步是在您的服务器上安装WireGuard。首先,使用以下命令更新WireGuard服务器的软件包索引,并安装WireGuard。如果您是第一次在本次会话中使用sudo,可能会提示您提供sudo用户的密码:
- sudo apt update
- sudo apt install wireguard
现在您已经安装了WireGuard,下一步是为服务器生成私钥和公钥对。您将使用内置的wg genkey
和wg pubkey
命令来创建这些密钥,然后将私钥添加到WireGuard的配置文件中。
您还需要使用chmod
命令更改刚刚创建的密钥的权限,因为默认情况下,该文件可被服务器上的任何用户读取。
使用下列命令生成WireGuard的私钥并更改其权限:
- wg genkey | sudo tee /etc/wireguard/private.key
- sudo chmod go= /etc/wireguard/private.key
sudo chmod go=...
命令会删除文件中除了根用户以外的其他用户和组的所有权限,确保只有根用户可以访问私钥。
您应该会收到一行Base64编码的输出,那是私钥。输出的副本也会存储在/etc/wireguard/private.key
文件中,以备后续命令的tee
部分使用。请注意仔细记录输出的私钥,因为您稍后需要将其添加到WireGuard配置文件中的特定部分。
下一步是创建相应的公钥,它是由私钥派生而来的。使用以下命令创建公钥文件:
- sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
这个命令由三个单独的命令构成,使用 |
(管道)运算符链接在一起。
sudo cat /etc/wireguard/private.key
: 此命令读取私钥文件并将其输出到标准输出流。wg pubkey
: 第二个命令将第一个命令的输出作为其标准输入,并对其进行处理以生成公钥。sudo tee /etc/wireguard/public.key
: 最后一个命令将公钥生成命令的输出重定向到名为/etc/wireguard/public.key
的文件中。
当您运行该命令时,您将再次收到一行经过Base64编码的输出,这是您的WireGuard服务器的公钥。请将其复制到某个地方以备参考,因为您需要将公钥分发给连接到服务器的任何对等设备。
第二步 – 选择IPv4和IPv6地址
在之前的部分中,您安装了WireGuard并生成了一个密钥对,该密钥对将用于加密与服务器之间的流量。在本部分中,您将为服务器创建一个配置文件,并设置WireGuard在服务器重新启动时自动启动。您还将定义用于WireGuard服务器和对等设备的私有IPv4和IPv6地址。
如果您计划同时使用IPv4和IPv6地址,请按照以下两个部分的步骤进行操作。否则,请根据您的VPN网络需求在适当的部分按照说明进行操作。
第二步(a)— 选择一个IPv4范围
这是文章《如何在Debian 11上设置WireGuard》的第2部分(共9部分)。
如果您正在使用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地址范围的一个块。这个范围将允许最多255个不同的对等连接,并且通常不应与其他私有IP地址范围发生重叠或冲突。如果这个示例范围与您的网络配置不兼容,请随意选择与您的网络配置匹配的地址范围。
WireGuard服务器将使用一个IP地址作为其私有隧道IPv4地址。我们将在这里使用 10.8.0.1/24
,但是可以使用从 10.8.0.1
到 10.8.0.255
范围内的任何地址。如果您使用与 10.8.0.1/24
不同的地址,请记下您选择的IP地址。在第三步中的创建WireGuard服务器配置中,您将把这个IPv4地址添加到配置文件中。
第二步骤(b)- 选择一个IPv6范围
如果您正在使用IPv6的WireGuard,那么您需要根据RFC 4193中的算法生成一个唯一的本地IPv6单播地址前缀。您在WireGuard服务器上使用的地址将与虚拟隧道接口关联。您需要完成一些步骤,以在保留的 fd00::/8
私有IPv6地址块内生成一个随机而独特的IPv6前缀。
根据RFC的建议,获取唯一的IPv6前缀的推荐方法是将当天的时间与诸如序列号或设备ID之类的唯一标识值进行组合。然后对这些值进行哈希运算并截断,以生成一组位,可以在保留的私有 fd00::/8
IP地址块内作为唯一地址使用。
要开始为您的WireGuard服务器生成IPv6范围,请使用以下命令使用 date
实用程序收集一个64位时间戳。
date +%s%N
您将收到像下面这样的数字,它是自1970年01月01日00:00:00 UTC以来的秒数(date
命令中的 %s
)和纳秒数(%N
)的组合:
1650301699497770167
在本节中将该值记录在某处,以便将来使用。接下来,从 /var/lib/dbus/machine-id
文件中复制服务器的机器ID值。这个标识符是特定于您的系统的并且在服务器存在期间不应更改。
cat /var/lib/dbus/machine-id
你将会收到类似如下的输出:
610cef4946ed46da8f71dba9d66c67fb
现在,您需要将时间戳与机器ID组合起来,并使用SHA-1算法对结果值进行哈希。命令将采用以下格式:
printf <时间戳><机器ID> | sha1sum
运行命令时,将时间戳和机器身份值代入其中。
printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum
你将会收到一个像以下的哈希值:
442adea1488d96388dae9ab816045b24609a6c18 -
注意,sha1sum
命令的输出是十六进制的,每个字节的数据用两个字符表示。例如,示例输出中的 4f
和 26
是哈希数据的前两个字节。
在RFC中的算法只需要散列输出中最低有效的(末尾的)40位,即5个字节。使用 cut
命令从哈希中打印出最后5个十六进制编码的字节。
printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-
“-c”参数告诉 cut
命令只选择指定的字符集合。31-
参数告诉 cut
命令打印从第31个字符到输入行末尾的所有字符。
你应该收到以下输出:
24609a6c18
在这个示例输出中,字节集合是:24 60 9a 6c 18
。
现在你可以通过将生成的5字节添加到 fd
前缀来构建你独特的IPv6网络前缀,在可读性上,每2字节使用 :
冒号进行分隔。由于在你的独特前缀中,每个子网可以容纳总计18,446,744,073,709,551,616个可能的IPv6地址,所以你可以简化子网,将其限制为标准的 /64
大小。
使用先前生成的包含 /64
子网大小的字节,得到的前缀将如下:
fd24: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服务器配置
这是文章《如何在Debian 11上设置WireGuard》的第3部分(共9部分)。
在创建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
或您喜欢的编辑器运行以下命令来创建一个新的配置文件:
sudo nano /etc/wireguard/wg0.conf
将以下行添加到文件中,将您的私钥替换为突出显示的base64_encoded_private_key_goes_here
值,并将IP地址写入Address
行。您还可以更改ListenPort
行,以便WireGuard在不同端口上可用:
[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服务器在此基础上进一步构建。
第四步 — 调整WireGuard服务器的网络配置
如果您正在使用WireGuard将一个节点连接到WireGuard服务器,以便仅访问服务器上的服务,则无需完成此部分。如果您想通过WireGuard服务器路由WireGuard节点的互联网流量,则需要按照本教程的此部分配置IP转发。
要配置转发,请使用nano
或您喜欢的编辑器打开您的WireGuard服务器上的/etc/sysctl.conf
文件。
sudo nano /etc/sysctl.conf
如果您正在使用IPv4与WireGuard,将以下行添加到文件底部:
net.ipv4.ip_forward=1
如果您正在使用WireGuard和IPv6,请在文件底部添加以下行:
net.ipv6.conf.all.forwarding=1
如果您同时使用IPv4和IPv6,请确保包含这两行。完成后保存并关闭文件。
运行以下命令以读取文件并将新值加载到当前终端会话中:
sudo sysctl -p
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
现在您的WireGuard服务器将能够将来自虚拟VPN以太网设备的传入流量转发到服务器上的其他设备,然后通过公共互联网传送。使用此配置将允许您通过服务器的IP地址路由所有网络流量,而您的客户端的公共IP地址将被有效隐藏起来。
然而,在流量能正确地通过您的服务器路由之前,您需要配置一些防火墙规则。这些规则将确保与您的WireGuard服务器和对等方之间的流量正常传输。
第五步 — 配置WireGuard服务器的防火墙
在此章节中,您将编辑WireGuard服务器的配置,添加防火墙规则,以确保服务器和客户端之间的流量正确路由。如果您仅使用WireGuard VPN进行机器之间的连接以访问仅限于您的VPN的资源,则可以跳过此步骤,与先前的章节一样。
为了让WireGuard VPN流量通过服务器防火墙,您需要启用masquerading
,这是一种iptables
概念,提供即时动态网络地址转换(NAT)以正确路由客户端连接。
首先,使用ip route
子命令找到您的WireGuard服务器的公共网络接口。
ip route list default
公共接口是命令输出中紧随“dev”一词的字符串。例如,此结果显示了名为eth0
的接口,如下所示:
default via 203.0.113.1 dev eth0 proto static
请记下您设备的名称,因为您将在下一步中将其添加到iptables
规则中。
要为您的WireGuard服务器添加防火墙规则,再次使用nano
或您喜欢的编辑器打开/etc/wireguard/wg0.conf
文件。
sudo nano /etc/wireguard/wg0.conf
在SaveConfig = true
一行之后的文件底部,粘贴以下这些行。
. . . 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
当WireGuard服务器启动虚拟VPN隧道时,PostUp
命令将运行。在这个例子中,它将添加三个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
– 此规则配置伪装,并重写进入wg0
VPN接口的IPv4流量,使其看起来像是直接源自WireGuard服务器的公共IPv4地址。ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– 此规则配置伪装,并重写进入wg0
VPN接口的IPv6流量,使其看起来像是直接源自WireGuard服务器的公共IPv6地址。
当WireGuard服务器停止虚拟VPN隧道时,PreDown
规则会被执行。这些规则是PostUp
规则的反向操作,用于在VPN停止时撤销VPN接口的转发和伪装规则。
在这两种情况下,您都需要编辑配置来添加或排除与您的VPN相适应的IPv4和IPv6规则。例如,如果您仅使用IPv4,则可以排除包含ip6tables
命令的行。
相反地,如果您只使用IPv6,则编辑配置文件只包括ip6tables
命令。无论使用IPv4还是IPv6网络,都应存在ufw行。完成后保存并关闭文件。
配置WireGuard服务器防火墙的最后一部分是允许数据流通过WireGuard UDP端口。如果您没有在服务器的/etc/wireguard/wg0.conf
文件中更改端口,您将要打开的端口是51820
。如果您在编辑配置时选择了不同的端口,请确保在下面的UFW命令中进行替换。
如果您在按照先决条件教程时忘记打开SSH端口,请在这里添加。
- sudo ufw allow 51820/udp
- sudo ufw allow OpenSSH
注意:如果您使用的是不同的防火墙或已经自定义了您的UFW配置,则可能需要添加其他防火墙规则。例如,如果您决定通过VPN连接隧道化所有网络流量,您需要确保允许端口53
用于DNS请求,以及分别用于HTTP和HTTPS流量的端口80
和443
。如果您在VPN上使用其他协议,则还需要为其添加规则。在添加这些规则之后,禁用然后重新启用UFW以重新启动它,并加载您修改的所有文件中的更改。
- sudo ufw disable
- sudo ufw enable
您可以通过运行ufw status
命令确认规则是否已经生效。运行该命令,您应该会收到类似下面的输出。
- sudo ufw status
Status: 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服务本身来监听对等连接。
步骤六 — 启动WireGuard服务器
WireGuard可以使用其内置的wg-quick
脚本配置为systemd服务。虽然您可以手动使用wg
命令每次想要使用VPN时创建隧道,但这种方法是一个手动操作过程,容易出现重复和错误。相反,您可以使用systemctl
结合wg-quick
脚本来管理隧道。
使用systemd服务意味着您可以配置WireGuard在启动时启动,只要服务器运行,您就可以随时连接到您的VPN。为了实现这一点,通过将其添加到systemctl,启用您定义的wg0
隧道的wg-quick
服务。
- sudo systemctl enable wg-quick@wg0.service
信息:请注意,命令指定了 wg0
隧道设备名称作为服务名称的一部分。这个名称对应着 /etc/wireguard/wg0.conf
配置文件。这种命名方法意味着您可以使用服务器创建任意数量的独立 VPN 隧道。
例如,您可以有一个隧道设备,其名称为 prod
,它的配置文件将是 /etc/wireguard/prod.conf
。每个隧道配置可以包含不同的 IPv4、IPv6 和客户端防火墙设置。通过这种方式,您可以支持多个不同的对等连接,每个都有自己独特的 IP 地址和路由规则。
现在开始服务。
sudo systemctl start wg-quick@wg0.service
请用以下命令再次确认WireGuard服务是否处于活动状态。您应该在输出中看到“活动(运行中)”。
sudo systemctl status wg-quick@wg0.service
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/wg-quick@.service; 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`命令。您可以使用这些规则来解决隧道问题,或者与`wg`命令一起使用,手动配置VPN接口。
服务器已配置并运行,下一步是将您的客户端设备配置为WireGuard节点并连接到WireGuard服务器。
第七步 – 配置WireGuard节点
配置WireGuard节点与配置WireGuard服务器类似。安装了客户端软件后,您将生成公钥和私钥对,为节点决定IP地址或多个IP地址,为节点定义配置文件,并使用`wg-quick`脚本启动隧道。
您可以根据以下步骤生成密钥对和配置,将多个对等节点添加到您的VPN中。如果您向VPN中添加了多个对等节点,请确保记录其私有IP地址以避免冲突。
要配置WireGuard对等端,请确保使用以下`apt`命令安装了WireGuard软件包。在WireGuard对等端上运行:
sudo apt update
sudo apt install wireguard
创建WireGuard对等端的密钥对
接下来,您需要在与您在服务器上使用的相同步骤中,为对等方生成密钥对。从您的本地机器或作为对等方的远程服务器上,继续使用以下命令创建对等方的私钥。
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod go= /etc/wireguard/private.key
您会再次收到一行经过Base64编码的输出,这是私钥。输出的副本也存储在`/etc/wireguard/private.key`中。请仔细记录输出的私钥,因为稍后在本节中需要将其添加到WireGuard对等端的配置文件中。
接下来使用以下命令创建公钥文件:
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
您将再次收到一行Base64编码的输出,这是您WireGuard对等端的公钥。将其复制到某个地方以供参考,因为您需要将公钥分发给WireGuard服务器以建立加密连接。
创建 WireGuard 对等端的配置文件
配置WireGuard客户端
既然您已经有了密钥对,就可以为节点创建一个配置文件,其中包含建立与WireGuard服务器连接所需的所有信息。
您将需要以下信息来配置客户端:
- 在对等节点上生成的Base64编码的私钥。
- 在WireGuard服务器上定义的IPv4和IPv6地址范围。
- 来自WireGuard服务器的Base64编码的公钥。
- WireGuard服务器的公共IP地址和端口号。通常这将是IPv4地址,但如果您的服务器有IPv6地址且您的客户端机器有IPv6互联网连接,则可以使用IPv6代替IPv4。
在WireGuard客户端机器上,使用nano或您喜欢的编辑器,打开一个新的/etc/wireguard/wg0.conf
文件,并准备好所有这些信息。
sudo nano /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
请注意,第一行地址使用了您之前选择的10.8.0.0/24
子网的IPv4地址。只要它与服务器的IP地址不同,该IP地址可以是子网中的任何地址。每次添加对等体时逐次增加地址通常是分配IP地址的最简单方法。
同样,请注意第二个地址行使用了您之前生成的子网的一个IPv6地址,并将服务器的地址增加一。同样地,如果您决定使用不同的地址,该范围内的任何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
命令:
ip route list table main default
您会收到以下类似的结果输出:
default via 203.0.113.1 dev eth0 proto static
请注意网关的突出IP地址203.0.113.1
,以备将来使用,以及设备eth0
。您的设备名称可能不同,请在下面的命令中将其替换为eth0
。
接下来,通过使用ip address show
命令检查设备,找到对等系统的公共IP。
ip -brief address show eth0
您将会收到如下输出:
eth0 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
)是分配给eth0
设备的公共地址,您需要将其添加到WireGuard客户端配置中。
现在使用nano或您偏爱的编辑器打开WireGuard客户端的/etc/wireguard/wg0.conf
文件。
sudo nano /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地址与客户端系统的公共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
行会移除自定义规则和路由。
信息:
有关Linux中路由表如何工作的更多信息,请访问《Linux IP层网络管理指南》的路由表部分。如果您正在通过VPN路由所有对等方的流量,请确保在第4步和第5步中(调整WireGuard服务器的网络配置和配置WireGuard服务器的防火墙)正确配置了WireGuard服务器的sysctl和iptables规则。
(可选)配置WireGuard对等方的DNS解析器如果您将WireGuard服务器用作VPN网关来处理所有对等方的流量,您需要在[Interface]部分添加一行来指定DNS解析器。如果您不添加此设置,则您的DNS请求可能无法通过VPN进行安全保护,或可能会被透露给您的互联网服务提供商(ISP)或其他第三方。
如果您只是使用WireGuard来访问VPN网络上的资源或进行点对点配置,那么您可以跳过本节内容。
要将DNS解析器添加到您的节点配置中,首先确定您的WireGuard服务器正在使用哪些DNS服务器。在WireGuard服务器上运行以下命令,请将您的以太网设备名称替换为eth0(如果不同于此示例):
- resolvectl dns eth0
你应该收到类似如下的输出:
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
输出的IP地址是服务器使用的DNS解析器。根据您的需求,您可以选择使用其中任意一个或全部,或者只使用IPv4或IPv6。记下您将使用的解析器。
然后,您需要将选择的解析器添加到WireGuard Peer的配置文件中。回到WireGuard Peer,在Nano或您喜欢的编辑器中打开/etc/wireguard/wg0.conf文件。
- sudo nano /etc/wireguard/wg0.conf
在[同级]的行之前,添加以下内容:
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
. . .
根据您对IPv4和IPv6的偏好或要求,您可以根据自己的需求编辑列表。
Info
您还可以使用类似于在服务器上运行的resolvectl dns命令来检查您的对等方是否正在使用配置的解析器。您应该会收到如下所示的输出,显示您为VPN隧道配置的DNS解析器:
输出:全局:67.207.67.2 67.207.67.3
. . .在设置了所有这些DNS解析器之后,现在您可以将对等方的公钥添加到服务器,并在对等方上启动WireGuard隧道。
第八步 – 将对等方的公钥添加到WireGuard服务器中在将对等端连接到服务器之前,将对等端的公钥添加到WireGuard服务器非常重要。这一步骤确保您能够连接到并通过VPN路由流量。如果未完成此步骤,WireGuard服务器将不允许对等端在隧道上发送或接收任何流量。
请确保您运行以下命令获取 WireGuard Peer 的 base64 编码公钥的副本:
- sudo cat /etc/wireguard/public.key
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
现在登录到WireGuard服务器,并运行以下命令:
- sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
请注意,命令中的allowed-ips部分需要一个用逗号分隔的IPv4和IPv6地址列表。如果您希望限制对等方分配的IP地址,可以指定单独的IP地址,或者像示例中那样指定一个范围,以便对等方可以使用VPN范围内的任何IP地址。还要注意,没有两个对等方可以使用相同的allowed-ips设置。
如果你想更新现有对等方的允许IP地址,你可以再次运行相同的命令,但是修改IP地址。支持多个IP地址。例如,要更改刚刚添加的WireGuard对等方以添加一个IP地址,如10.8.0.100到现有的10.8.0.2和fd24:609a:6c18::2 IP地址,你可以运行以下命令:
- sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2
一旦你运行了添加节点的命令,请使用wg命令检查服务器上隧道的状态。
- sudo wg
interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128
注意对等线显示了WireGuard对等的公钥,以及它被允许使用来分配自己IP地址的IP地址或地址范围。
既然你已经在服务器上定义了对等连接参数,下一步就是在对等体上启动隧道。
第九步 — 连接 WireGuard Peer 到隧道。
这是文章《如何在Debian 11上设置WireGuard》的第8部分(共9部分)。
既然你的服务器和对等体都已经配置好了,支持你选择的IPv4、IPv6、数据包转发和DNS解析,现在是时候将对等体连接到VPN隧道了。
由于您可能只想在某些情况下使用VPN,我们将使用wg-quick
命令手动建立连接。如果您想要像在服务器上那样自动启动隧道,请按照第6步中的《启动WireGuard服务器》部分的步骤,而不要使用wg-quick
命令。
如果您正在通过VPN路由所有流量并设置了DNS转发,您需要在启动隧道之前在WireGuard节点上安装resolvconf
工具。运行以下命令来完成设置:
- sudo apt install resolvconf
为了启动隧道,请在WireGuard对等端上执行以下操作。
- sudo wg-quick up wg0
你会收到类似以下的输出:
[#] 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选择的范围不同的范围),那么您的输出将类似于以下内容:
[#] 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
命令在对等方上检查隧道的状态。
- sudo wg
interface: 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
你还可以再次在服务器上检查状态,然后会收到类似的输出。
通过使用ip route
和ip -6 route
命令验证对等体是否正在使用VPN。如果您将VPN用作所有互联网流量的网关,请检查哪个接口将用于发送到CloudFlare的1.1.1.1
和2606:4700:4700::1111
DNS解析器的流量。
注意:
如果您只是使用WireGuard来访问VPN上的资源,请在这些命令中替换为有效的IPv4或IPv6地址,例如10.8.0.1
或fd24:609a:6c18::1
。
- ip route get 1.1.1.1
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
请注意使用wg0
设备和您为对等方分配的IPv4地址10.8.0.2
。同样地,如果您使用IPv6,请运行以下命令:
- ip -6 route get 2606:4700:4700::1111
这是文章《如何在Debian 11上设置WireGuard》的第9部分(共9部分)。
2606: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
命令:
- sudo wg-quick down wg0
您将收到以下类似的输出,表示VPN隧道已关闭:
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
如果您将对等方的AllowedIPs
设置为0.0.0.0/0
和::/0
(或使用与您选择的VPN不同的范围),那么您的输出将类似于以下内容:
[#] 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服务器中删除某个对等方的配置,可以运行以下命令,请确保替换所需删除的对等方的正确公钥:
- sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
通常情况下,只有在对等配置不存在、加密密钥被泄露或更改时,您才需要删除对等配置。否则最好保留配置,这样对等方无需每次都添加密钥和允许的IP地址,就能重新连接到VPN。
结论
在本教程中,您在服务器和客户端Debian 11系统上安装了WireGuard软件包和工具。您为WireGuard设置了防火墙规则,并使用服务器上的sysctl
命令配置内核设置以允许数据包转发。您了解了如何生成私钥和公钥的WireGuard加密密钥,并且知道如何配置服务器和对等点(或对等点们)以相互连接。
如果您的网络使用IPv6,您还学会了如何生成用于与对等连接配对的唯一本地地址范围。最后,您学会了如何通过限制对等方可以使用的网络前缀来限制哪些流量可以通过VPN传输,以及如何将WireGuard服务器用作VPN网关来处理对等方的所有Internet流量。
如果您想了解更多关于WireGuard的相关知识,包括如何配置更高级的隧道,或者在容器中使用WireGuard,请访问官方WireGuard文档。