如何在Debian 11上设置WireGuard

简介

WireGuard是一种轻量级的虚拟专用网(VPN),支持IPv4和IPv6连接。VPN可以让您在不受信任的网络中像在私有网络中一样穿越。当连接到不受信任的网络(如酒店或咖啡店的WiFi)时,它可以让您自由、安全地从智能手机或笔记本电脑访问互联网。您可能还想部署一个VPN来访问自己的基础设施,这样您就不需要开放SSH或其他敏感端口,类似于Tailscale的工作方式。

WireGuard的加密依赖于用于同行之间建立加密隧道的公钥和私钥。每个 WireGuard 版本都使用特定的加密密码套件,以确保简单性、安全性和与同行的兼容性。

与之相比,其他VPN软件如OpenVPN和IPSec使用传输层安全(TLS)和证书来验证和建立系统之间的加密隧道。TLS的不同版本支持成百上千种不同的加密套件和算法,虽然这样可以为不同的客户端提供很大的灵活性,但也使得配置使用TLS的VPN更加耗时、复杂且容易出错。

在本教程中,您将在Debian 11服务器上设置WireGuard,然后配置另一台机器以使用IPv4和IPv6连接连接到该服务器(通常称为双栈连接)。您还将学习如何在网关配置中通过WireGuard服务器路由同行的互联网流量,以及如何使用该VPN建立加密的点对点隧道。

为了本教程的目的,我们将配置另一个Debian 11系统作为WireGuard服务器的对等体(也称为客户端)。本系列的后续教程将解释如何在Windows、macOS、Android和iOS系统和设备上安装和运行WireGuard。

Note

注意:如果您计划在 Silicon Cloud vServer 上设置 WireGuard,请注意我们和许多托管提供商一样,会对超出带宽的流量收费。因此,请注意您的服务器处理的流量量。详细信息请参阅此页面。

前提条件

要跟随这个教程,你需要的是:

  • One Debian 11 server with a sudo non-root user and a firewall enabled. To set this up, you can follow our Initial Server Setup with Debian 11 tutorial. We will refer to this as the WireGuard Server throughout this guide.
  • You’ll need a client machine that you will use to connect to your WireGuard Server. In this tutorial we’ll refer to this machine as the WireGuard Peer. For the purposes of this tutorial, it’s recommended that you use your local machine as the WireGuard Peer, but you can use remote servers, or mobile phones as clients if you prefer. If you are using a remote system, be sure to follow all of the optional sections later in this tutorial or you may lock yourself out of the system.
  • To use WireGuard with IPv6, you will also need to ensure that your server is configured to support that type of traffic. If you would like to enable IPv6 support with WireGuard and are using a Silicon Cloud vServer, please refer to this documentation page How to Enable IPv6 on vServers. You can add IPv6 support when you create a vServer, or afterwards using the instructions on that page.

第一步 – 安装WireGuard并生成密钥对。

本教程的第一步是在您的服务器上安装WireGuard。首先,使用以下命令更新WireGuard服务器的软件包索引,并安装WireGuard。如果您是第一次在本次会话中使用sudo,可能会提示您提供sudo用户的密码:

  1. sudo apt update
  2. sudo apt install wireguard

 

现在您已经安装了WireGuard,下一步是为服务器生成私钥和公钥对。您将使用内置的wg genkey和wg pubkey命令来创建这些密钥,然后将私钥添加到WireGuard的配置文件中。

你还需要使用chmod命令更改刚刚创建的密钥的权限,因为默认情况下,该文件可被服务器上的任何用户读取。

使用下列命令生成WireGuard的私钥并更改其权限:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

 

sudo chmod go=… 命令会删除文件中除了根用户以外的其他用户和组的所有权限,确保只有根用户可以访问私钥。

您应该接收到一行Base64编码的输出,那是私钥。输出的副本也会储存在/etc/wireguard/private.key文件中,以备后续命令的tee部分使用。请注意仔细记录输出的私钥,因为您稍后需要将其添加到WireGuard配置文件中的特定部分。

下一步是创建相应的公钥,它是由私钥派生而来的。使用以下命令创建公钥文件:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

 

这个命令由三个单独的命令构成,使用 |(管道)运算符链接在一起。

  • sudo cat /etc/wireguard/private.key: this command reads the private key file and outputs it to the standard output stream.
  • wg pubkey: the second command takes the output from the first command as its standard input and processes it to generate a public key.
  • sudo tee /etc/wireguard/public.key: the final command takes the output of the public key generation command and redirects it into the file named /etc/wireguard/public.key.

当您运行该命令时,您将再次收到一行经过Base64编码的输出,这是您的WireGuard服务器的公钥。将它复制到某个地方以备参考,因为您需要将公钥分发给连接到服务器的任何对等方。

第二步 – 选择IPv4和IPv6地址

在之前的部分中,您安装了WireGuard并生成了一个密钥对,该密钥对将用于加密与服务器之间的流量。在本部分中,您将为服务器创建一个配置文件,并设置WireGuard在服务器重新启动时自动启动。您还将定义用于WireGuard服务器和对等体的私有IPv4和IPv6地址。

如果您计划同时使用IPv4和IPv6地址,请按照以下两个部分的步骤进行操作。否则,请根据您的VPN网络需求在适当的部分按照说明进行操作。

第二步(a)— 选择一个IPv4范围

如果您正在使用您的WireGuard服务器与IPv4对等体,服务器需要一系列私有IPv4地址用于客户端和其隧道接口。您可以从以下保留的地址块中选择任何IP地址范围(如果您想了解更多关于这些块如何分配的信息,请访问RFC 1918规范)。

  • 10.0.0.0 to 10.255.255.255 (10/8 prefix)
  • 172.16.0.0 to 172.31.255.255 (172.16/12 prefix)
  • 192.168.0.0 to 192.168.255.255 (192.168/16 prefix)

为了本教程的目的,我们将使用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范围,请使用以下命令使用日期实用程序收集一个64位时间戳。

  1. date +%s%N

 

您将收到像下面这样的数字,它是自1970年01月01日00:00:00 UTC以来的秒数(date命令中的%s)和纳秒数(%N)的组合:

Output

1650301699497770167

在本节中将该值记录在某处,以便将来使用。接下来,从/var/lib/dbus/machine-id文件中复制服务器的机器ID值。这个标识符是特定于您的系统的并且在服务器存在期间不应更改。

  1. cat /var/lib/dbus/machine-id

 

你将会收到类似如下的输出:

/var/lib/dbus/machine-id

610cef4946ed46da8f71dba9d66c67fb

现在,您需要将时间戳与机器ID组合起来,并使用SHA-1算法对结果值进行哈希。命令将采用以下格式:

printf <timestamp><machine-id> | sha1sum

运行命令时,将时间戳和机器身份值代入其中。

  1. printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

 

你将会收到一个像以下的哈希值:

Output

442adea1488d96388dae9ab816045b24609a6c18 –

注意,sha1sum命令的输出是十六进制的,每个字节的数据用两个字符表示。例如,示例输出中的4f和26是哈希数据的前两个字节。

在RFC中的算法只需要散列输出中最低有效的(末尾的)40位,即5个字节。使用cut命令从哈希中打印出最后5个十六进制编码的字节。

  1. printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31

 

“-c”参数告诉切割命令只选择指定的字符集合。31-参数告诉切割命令打印从第31个字符到输入行末尾的所有字符。

你应该收到以下输出:

Output

24609a6c18

在这个示例输出中,字节集合是:24 60 9a 6c 18。

现在你可以通过将生成的5字节添加到fd前缀来构建你独特的IPv6网络前缀,在可读性上,每2字节使用:冒号进行分隔。由于在你的独特前缀中,每个子网可以容纳总计18,446,744,073,709,551,616个可能的IPv6地址,所以你可以简化子网,将其限制为标准的/64大小。

使用先前生成的包含/64子网大小的字节,得到的前缀将如下:

Unique Local IPv6 Address Prefix

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服务器配置

在创建WireGuard服务器的配置之前,您需要以下信息:

    1. 确保你从第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。

使用nano或您喜欢的编辑器运行以下命令,一旦您拥有所需的私钥和IP地址,就可以创建一个新的配置文件:

  1. sudo nano /etc/wireguard/wg0.conf

 

将以下行添加到文件中,将您的私钥替换为突出显示的base64_encoded_private_key_goes_here值,并将IP地址写入Address行。您还可以更改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

在WireGuard接口关闭时,”SaveConfig”行会确保将任何更改保存到配置文件中。

保存并关闭/etc/wireguard/wg0.conf文件。如果您使用的是nano编辑器,您可以通过按下CTRL+X,然后按下Y和ENTER键来完成。现在您已经拥有了一个初始的服务器配置,根据您计划如何使用WireGuard VPN服务器,您可以在此基础上进一步构建。

第四步 — 调整WireGuard服务器的网络配置

如果您正在使用WireGuard将一个节点连接到WireGuard服务器,以便仅访问服务器上的服务,则无需完成此部分。如果您想通过WireGuard服务器路由WireGuard节点的互联网流量,则需要按照本教程的此部分配置IP转发。

要配置转发,请使用nano或您喜欢的编辑器打开您的Wireguard服务器上的/etc/sysctl.conf文件。

  1. sudo nano /etc/sysctl.conf

 

如果您正在使用IPv4与WireGuard,将以下行添加到文件底部:

/etc/sysctl.conf

/sysctl.conf文件

net.ipv4.ip_forward=1

如果您正在使用WireGuard和IPv6,请在文件底部添加以下行:

/sysctl.conf 文件
net.ipv6.conf.all.forwarding=1

如果你同时使用IPv4和IPv6,请确保包含两行。完成后保存并关闭文件。

运行以下命令以读取文件并加载新值到当前终端会话中:

  1. sudo sysctl -p

 

Output

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服务器的公共网络接口。

  1. ip route list default

 

公共接口是命令输出中紧随“dev”一词的字符串。例如,此结果显示了名为eth0的接口,如下所示:

Output

default via 203.0.113.1 dev eth0 proto static

请记下您设备的名称,因为您将在下一步中将其添加到iptables规则中。

要为你的WireGuard服务器添加防火墙规则,再次使用nano或您喜欢的编辑器打开/etc/wireguard/wg0.conf文件。

  1. sudo 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

在WireGuard服务器启动虚拟VPN隧道时,PostUp命令将运行。在这个例子中,它将添加三个ufw和iptables规则。

  • ufw route allow in on wg0 out on eth0 – This rule will allow forwarding IPv4 and IPv6 traffic that comes in on the wg0 VPN interface to the eth0 network interface on the server. It works in conjunction with the net.ipv4.ip_forward and net.ipv6.conf.all.forwarding sysctl values that you configured in the previous section.
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – This rule configures masquerading, and rewrites IPv4 traffic that comes in on the wg0 VPN interface to make it appear like it originates directly from the WireGuard Server’s public IPv4 address.
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – This rule configures masquerading, and rewrites IPv6 traffic that comes in on the wg0 VPN interface to make it appear like it originates directly from the WireGuard Server’s public IPv6 address.

当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端口,请在这里添加。

  1. sudo ufw allow 51820/udp
  2. sudo ufw allow OpenSSH

 

Note

注意:如果您使用的是不同的防火墙或已经自定义了您的UFW配置,则可能需要添加其他防火墙规则。例如,如果您决定通过VPN连接隧道化所有网络流量,您需要确保允许端口53用于DNS请求,以及分别用于HTTP和HTTPS流量的端口80和443。如果您在VPN上使用其他协议,则还需要为其添加规则。

在添加这些规则之后,禁用然后重新启用UFW以重新启动它,并加载您修改的所有文件中的更改。

  1. sudo ufw disable
  2. sudo ufw enable

 

你可以通过运行ufw status命令确认规则是否已经生效。运行该命令,你应该会收到类似下面的输出。

  1. sudo ufw status

 

Output

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服务。

  1. sudo systemctl enable wg-quick@wg0.service

 

Info

请注意,命令指定了 wg0 隧道设备名称作为服务名称的一部分。这个名称对应着 /etc/wireguard/wg0.conf 配置文件。这种命名方法意味着您可以使用服务器创建任意数量的独立 VPN 隧道。
例如,您可以有一个隧道设备,其名称为 prod,它的配置文件将是 /etc/wireguard/prod.conf。每个隧道配置可以包含不同的 IPv4、IPv6 和客户端防火墙设置。通过这种方式,您可以支持多个不同的对等连接,每个都有自己独特的 IP 地址和路由规则。

现在开始服务。

  1. sudo systemctl start wg-quick@wg0.service

 

请用以下命令再次确认WireGuard服务是否处于活动状态。您应该在输出中看到”活动(运行中)”。

  1. sudo systemctl status wg-quick@wg0.service

 

Output

● 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 Peer,请确保使用以下apt命令安装了WireGuard软件包。在WireGuard peer上运行:

  1. sudo apt update
  2. sudo apt install wireguard

 

创建WireGuard对等端的密钥对。

接下来,您需要在与您在服务器上使用的相同步骤中,使用对等方生成密钥对。从您的本地机器或作为对等方的远程服务器上,继续使用以下命令创建对等方的私钥。

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

 

你会再次收到一行经过Base64编码的输出,这是私钥。输出的副本也存储在/etc/wireguard/private.key中。请仔细记录输出的私钥,因为稍后在本节中需要将其添加到WireGuard对端的配置文件中。

接下来使用以下命令创建公钥文件:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

 

您将再次收到一行Base64编码的输出,这是您WireGuard对等端的公钥。将其复制到某个地方以供参考,因为您需要将公钥分发给WireGuard服务器以建立加密连接。

创建 WireGuard 对等端的配置文件

既然您已经有了密钥对,您可以为节点创建一个配置文件,其中包含其建立与WireGuard服务器连接所需的所有信息。

你将需要一些信息来配置文件。

  • The base64 encoded private key that you generated on the peer.
  • The IPv4 and IPv6 address ranges that you defined on the WireGuard Server.
  • The base64 encoded public key from the WireGuard Server.
  • The public IP address and port number of the WireGuard Server. Usually this will be the IPv4 address, but if your server has an IPv6 address and your client machine has an IPv6 connection to the internet you can use this instead of IPv4.

在WireGuard Peer机器上,使用nano或你喜欢的编辑器,打开一个新的/etc/wireguard/wg0.conf文件,手头有所有这些信息。

  1. sudo nano /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

请注意第一行地址使用了您之前选择的10.8.0.0/24子网的IPv4地址。只要它与服务器的IP地址不同,该IP地址可以是子网中的任何地址。每次添加对等体时逐次增加地址1通常是分配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路由命令:

  1. ip route list table main default

 

你会收到以下类似的结果输出:

Output

default via 203.0.113.1 dev eth0 proto static

请注意网关的突出IP地址203.0.113.1,以备将来使用,以及设备eth0。您的设备名称可能不同,请在下面的命令中将其替换为eth0。

接下来,通过使用ip地址显示命令检查设备,找到对等系统的公共IP。

  1. ip -brief address show eth0

 

您将会收到如下输出:

Output

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 Peer的/etc/wireguard/wg0.conf文件。

  1. 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 – This command creates a rule that checks for any routing entries in the table numbered 200 when the IP matches the peer system’s public 203.0.113.5 address.
  • PostUp = ip route add table 200 default via 203.0.113.1 – This command ensures that any traffic being processed by the 200 table will use the 203.0.113.1 gateway for routing, instead of the WireGuard interface.

当隧道被关闭时,PreDown行会移除自定义规则和路由。

Info

注意:在构建这些规则时,表号200是任意的。您可以使用2到252之间的值,或者您可以通过向/etc/iproute2/rt_tables文件添加一个标签来使用自定义名称,并且在使用名称时而不是数值时参考它。
有关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(如果不同于此示例):

  1. resolvectl dns eth0

 

你应该收到类似如下的输出:

Output

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文件。

  1. sudo nano /etc/wireguard/wg0.conf

 

在[同级]的行之前,添加以下内容:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

根据您对IPv4和IPv6的偏好或要求,您可以根据自己的需求编辑列表。

Info

一旦连接到VPN,在下一个步骤中,您可以使用类似DNS泄漏测试网站的方式来检查您是否通过VPN发送DNS查询。
您还可以使用类似于在服务器上运行的resolvectl dns命令来检查您的对等方是否正在使用配置的解析器。您应该会收到如下所示的输出,显示您为VPN隧道配置的DNS解析器:
输出:全局:67.207.67.2 67.207.67.3
. . .

在设置了所有这些DNS解析器之后,现在您可以将对等方的公钥添加到服务器,并在对等方上启动WireGuard隧道。

第八步 – 将对等方的公钥添加到WireGuard服务器中

在将对等端连接到服务器之前,将对等端的公钥添加到WireGuard服务器非常重要。这一步骤确保您能够连接到并通过VPN路由流量。如果未完成此步骤,WireGuard服务器将不允许对等端在隧道上发送或接收任何流量。

请确保您运行以下命令获取 WireGuard Peer 的 base64 编码公钥的副本:

  1. sudo cat /etc/wireguard/public.key

 

Output

PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

现在登录到WireGuard服务器,并运行以下命令:

  1. 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地址,你可以运行以下命令:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

 

一旦你运行了添加节点的命令,请使用wg命令检查服务器上隧道的状态。

  1. sudo wg

 

Output

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 到隧道。

既然你的服务器和对等体都已经配置好了,支持你选择的IPv4、IPv6、数据包转发和DNS解析,现在是时候将对等体连接到VPN隧道了。

由于您可能只想在某些情况下使用VPN,我们将使用wg-quick命令手动建立连接。如果您想要像在服务器上那样自动启动隧道,请按照第6步中的《启动WireGuard服务器》部分的步骤,而不要使用wg-quick命令。

如果您正在通过VPN路由所有流量并设置了DNS转发,您需要在启动隧道之前在WireGuard节点上安装resolvconf工具。运行以下命令来完成设置:

  1. sudo apt install resolvconf

 

为了启动隧道,请在WireGuard对等端上执行以下操作。

  1. sudo wg-quick up wg0

 

你会收到类似以下的输出:

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命令在对等方上检查隧道的状态。

  1. sudo wg

 

Output

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解析器的流量。

Note

如果您只是使用WireGuard来访问VPN上的资源,请在这些命令中替换为有效的IPv4或IPv6地址,例如10.8.0.1或fd24:609a:6c18::1。
  1. ip route get 1.1.1.1

 

Output

1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache

请注意使用wg0设备和您为对等方分配的IPv4地址10.8.0.2。同样地,如果您使用IPv6,请运行以下命令:

  1. ip -6 route get 2606:4700:4700::1111

 

Output

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命令。

  1. sudo wg-quick down wg0

 

你将收到以下类似的输出,表示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服务器中删除某个对等方的配置,可以运行以下命令,请确保替换所需删除的对等方的正确公钥。

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

 

通常情况下,只有在对等配置不存在、加密密钥被泄露或更改时,你才需要删除对等配置。否则最好保留配置,这样对等方无需每次都添加密钥和允许的IP地址,就能重新连接到VPN。

结论

在本教程中,您在服务器和客户端Debian 11系统上安装了WireGuard软件包和工具。您为WireGuard设置了防火墙规则,并使用服务器上的sysctl命令配置内核设置以允许数据包转发。您了解了如何生成私钥和公钥的WireGuard加密密钥,并且知道如何配置服务器和对等点(或对等点们)以相互连接。

如果您的网络使用IPv6,您还学会了如何生成用于与对等连接配对的唯一本地地址范围。最后,您学会了如何通过限制对等方可以使用的网络前缀来限制哪些流量可以通过VPN传输,以及如何将WireGuard服务器用作VPN网关来处理对等方的所有Internet流量。

如果你想了解更多关于WireGuard的相关知识,包括如何配置更高级的隧道,或者在容器中使用WireGuard,请访问官方WireGuard文档。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds