在 Debian 11 和 Debian 10 上设置您自己的 WireGuard VPN 服务器

本教程将向您展示如何在 Debian 11 bullseye 和 Debian 10 Buster 上设置您自己的 WireGuard VPN 服务器。 WireGuard 专为 Linux 内核而设计。它在 Linux 内核内部运行,允许您创建快速、现代且安全的 VPN 隧道。

WireGuard VPN 的特点

  • 轻量级和超快的速度,让 OpenVPN 脱颖而出。
  • 跨平台。 WireGuard 可以在 Linux、BSD、macOS、Windows、Android、iOS 和 OpenWRT 上运行。
  • 用户身份验证是通过交换公钥来完成的,类似于 SSH 密钥。
  • 它将静态隧道 IP 地址分配给 VPN 客户端。有些人可能不喜欢它,但在某些情况下它可能很有用。
  • 移动设备可以在 Wi-Fi 和移动网络之间无缝切换,而不会断开任何连接。
  • 它的目标是在大多数用例中取代 OpenVPN 和 IPSec。

要求

要学习本教程,您需要一个可以自由访问被阻止网站(在您所在国家/地区或互联网过滤系统之外)的 VPS(虚拟专用服务器)。我推荐 Kamatera VPS,它具有以下特点:

  • 30 天免费试用。
  • 起价为 4 美元/月(1GB RAM)
  • 基于KVM的高性能VPS
  • 全球9个数据中心,包括美国、加拿大、英国、德国、荷兰、香港和以色列。

按照下面链接的教程在 Kamatera 创建 Linux VPS 服务器。

  • 如何在 Kamatera 上创建 Linux VPS 服务器

一旦您拥有运行 Debian 的 VPS,请按照以下说明操作。

本教程假设 VPN 服务器和 VPN 客户端都运行 Debian 操作系统。

第 1 步:在 Debian 服务器和桌面上安装 WireGuard

登录您的 Debian 服务器。 WireGuard 包含在 Debian 11 (Bullseye) 存储库中,因此您可以运行以下命令来安装它。

sudo apt update
sudo apt install wireguard wireguard

Debian 10 用户需要使用以下命令添加向后移植存储库。

deb http://deb.debian.org/debian buster-backports main | sudo tee /etc/apt/sources.list.d/buster-backports.list

然后安装 WireGuard。

sudo apt update
sudo apt -t buster-backports install wireguard wireguard-tools wireguard-dkms linux-headers-$(uname -r)

使用相同的命令在本地 Debian 计算机(VPN 客户端)上安装 WireGuard。请注意,您还需要在客户端安装openresolv软件包来配置DNS服务器。

sudo apt install openresolv

第 2 步:生成公钥/私钥对

服务器

在 Debian 服务器上运行以下命令创建公钥/私钥对,该公钥/私钥对将保存在 /etc/wireguard/ 目录下。

wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

 

客户

运行以下命令在本地 Debian 计算机(VPN 客户端)上创建公钥/私钥对。

wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key

步骤3:创建WireGuard配置文件

服务器

使用 Nano 等命令行文本编辑器在 Debian 服务器上创建 WireGuard 配置文件。 wg0 将是网络接口名称。

sudo nano /etc/wireguard/wg0.conf

复制以下文本并将其粘贴到您的配置文件中。您需要使用自己的服务器私钥和客户端公钥。

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=

[Peer]
PublicKey = kQvxOJI5Km4S1c7WXu2UZFpB8mHGuf3Gz8mmgTIF2U0=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

在哪里 :

  • 地址:指定VPN服务器的私有IP地址。这里我使用10.10.10.0/24网络范围,这样就不会和你的家庭网络范围冲突。 (大多数家庭路由器使用 192.168.0.0/24 或 192.168.1.0/24)。 10.10.10.1 是 VPN 服务器的私有 IP 地址。
  • PrivateKey:VPN服务器的私钥,可以在服务器上的/etc/wireguard/server_private.key文件中找到。
  • ListenPort:WireGuard VPN 服务器将侦听 UDP 端口 51820,这是默认值。
  • PublicKey:VPN客户端的公钥,可以在客户端计算机上的/etc/wireguard/client_public.key文件中找到。
  • AllowedIPs:允许 VPN 客户端使用的 IP 地址。在此示例中,客户端只能在 VPN 隧道内使用 10.10.10.2 IP 地址。

保存并关闭文件。 (要在 Nano 文本编辑器中保存文件,请按 Ctrl+O,然后按 Enter 确认。按 Ctrl+X 退出。)

更改文件权限模式,只有root用户可以读取文件。

sudo chmod 600 /etc/wireguard/ -R

客户

使用 Nano 等命令行文本编辑器在本地 Debian 计算机上创建 WireGuard 配置文件。 wg-client0 将是网络接口名称。

sudo nano /etc/wireguard/wg-client0.conf

复制以下文本并将其粘贴到您的配置文件中。您需要使用自己的客户端私钥和服务器公钥。

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=

[Peer]
PublicKey = kQvxOJI5Km4S1c7WXu2UZFpB8mHGuf3Gz8mmgTIF2U0=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

在哪里 :

  • 地址:指定VPN客户端的私有IP地址。
  • DNS:指定 10.10.10.1(VPN 服务器)作为 DNS 服务器。它将通过 resolvconf 命令进行配置。您还可以指定多个 DNS 服务器以实现冗余,如下所示:DNS=10.10.10.1 8.8.8.8
  • PrivateKey:客户端的私钥,可以在客户端计算机上的 /etc/wireguard/client_private.key 文件中找到。
  • PublicKey:服务器的公钥,可以在服务器上的 /etc/wireguard/server_public.key 文件中找到。
  • AllowedIPs:0.0.0.0/0 代表整个互联网,这意味着所有到互联网的流量都应该通过 VPN 路由。
  • 端点:VPN服务器的公网IP地址和端口号。将 12.34.56.78 替换为服务器的真实公共 IP 地址。
  • 持久保持活动:每 25 秒向对等方发送一个经过身份验证的空数据包,以保持连接处于活动状态。如果未启用 PersistentKeepalive,VPN 服务器可能无法 ping VPN 客户端。

保存并关闭文件。

更改文件模式,以便只有 root 用户可以读取文件。

sudo chmod 600 /etc/wireguard/ -R

步骤 4:在服务器上启用 IP 转发

为了使 VPN 服务器能够在 VPN 客户端和 Internet 之间路由数据包,我们需要启用 IP 转发。编辑 sysctl.conf 文件。

sudo nano /etc/sysctl.conf

在此文件末尾添加以下行。

net.ipv4.ip_forward = 1

保存并关闭文件。然后使用以下命令应用更改。 -p 选项将从 /etc/sysctl.conf 文件加载 sysctl 设置。该命令将在系统重新启动后保留我们的更改。

sudo sysctl -p

步骤 5:在服务器上配置 IP 伪装

我们需要在服务器防火墙中设置IP伪装,使服务器成为VPN客户端的虚拟路由器。我将使用 UFW,它是 iptables 防火墙的前端。在 Debian 上安装 UFW:

sudo apt install ufw

首先,您需要允许 SSH 流量。

sudo ufw allow 22/tcp

接下来,找到服务器主网络接口的名称。

ip addr

如您所见,它在我的 Debian 服务器上名为 ens3

要配置 IP 伪装,我们必须在 UFW 配置文件中添加 iptables 命令。

sudo nano /etc/ufw/before.rules

默认情况下,filter 表有一些规则。在此文件末尾添加以下行。将 ens3 替换为您自己的网络接口名称。

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT

在 Nano 文本编辑器中,您可以通过按 Ctrl+W,然后按 Ctrl+V 转到文件末尾。

上述行将在 nat 表的 POSTROUTING 链的末尾附加 (-A) 规则。它将您的虚拟专用网络与互联网连接起来。并且还向外界隐藏您的网络。因此互联网只能看到您的 VPN 服务器的 IP,而看不到您的 VPN 客户端的 IP,就像您的家庭路由器隐藏您的私人家庭网络一样。

缺省情况下,UFW 禁止报文转发。我们可以允许转发我们的专用网络。在此文件中找到 ufw-before-forward 链,添加以下 3 行,如果源 IP 或目标 IP 在 10.10.10.0/24范围。

# allow forwarding for trusted network
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

<a href="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/ufw-allow-packet-fowarding.png"><img src="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/ufw-allow-packet-fowarding.png" /></a>

保存并关闭文件。然后启用UFW。

sudo ufw enable

如果您之前启用过 UFW,则可以使用 systemctl 重新启动 UFW。

sudo systemctl restart ufw

现在,如果您使用以下命令列出 NAT 表的 POSTROUTING 链中的规则:

sudo iptables -t nat -L POSTROUTING

你可以看到假面舞会规则。

<a href="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-IP-Masquerading-ufw-debian.png"><img src="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-IP-Masquerading-ufw-debian.png" /></a>

步骤 6:在服务器上安装 DNS 解析器

由于我们指定 VPN 服务器作为客户端的 DNS 服务器,因此我们需要在 VPN 服务器上运行 DNS 解析器。我们可以安装bind9 DNS服务器。

sudo apt install bind9

安装完成后,BIND 将自动启动。您可以通过以下方式检查其状态:

systemctl status bind9

示例输出:

● named.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-05-17 08:11:26 UTC; 37s ago
Docs: man:named(8)
Main PID: 13820 (named)
Tasks: 5 (limit: 1074)
Memory: 14.3M
CGroup: /system.slice/named.service
└─13820 /usr/sbin/named -f -u bind

如果它没有运行,请使用以下命令启动它:

sudo systemctl bind9

编辑 BIND DNS 服务器的配置文件。

sudo nano /etc/bind/named.conf.options

添加以下行以允许 VPN 客户端发送递归 DNS 查询。

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

<a href="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-BIND-DNS-resolver.png"><img src="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-BIND-DNS-resolver.png" /></a>

保存并关闭文件。然后编辑 /etc/default/named 文件。

sudo nano /etc/default/named

将 -4 添加到 OPTIONS 以确保 BIND 可以查询根 DNS 服务器。

OPTIONS="-u bind -4"

保存并关闭文件。

默认情况下,BIND 启用 DNSSEC,这可确保 DNS 响应正确且不被篡改。但是,由于<em>信任锚翻转</em>和其他原因,它可能无法开箱即用。为了使其正常工作,我们可以使用以下命令重建托管密钥数据库。

sudo rndc managed-keys destroy
sudo rdnc reconfig

重新启动 BIND9 以使更改生效。

sudo systemctl restart bind9

然后您需要运行以下命令以允许 VPN 客户端连接到端口 53。

sudo ufw insert 1 allow in from 10.10.10.0/24

步骤7:在防火墙中打开WireGuard端口

运行以下命令,打开服务器上的UDP端口51820。

sudo ufw allow 51820/udp

第8步:启动WireGuard

服务器

在服务器上运行以下命令启动 WireGuard。

sudo wg-quick up /etc/wireguard/wg0.conf

要停止它,请运行

sudo wg-quick down /etc/wireguard/wg0.conf

您还可以使用 systemd 服务来启动 WireGuard。

sudo wg-quick up /etc/wireguard/wg0.conf

启用系统启动时自动启动。

sudo systemctl enable

使用以下命令检查其状态。其状态应为活动(已退出)。

systemctl status

现在 WireGuard 服务器已准备好接受客户端连接。

客户

启动 WireGuard。

sudo systemctl start

启用系统启动时自动启动。

sudo systemctl enable

检查其状态:

systemctl status

现在访问此网站:http://icanhazip.com/ 检查您的公共 IP 地址。如果一切顺利,它应该显示您的 VPN 服务器的公共 IP 地址,而不是您的客户端计算机的公共 IP 地址。

您还可以运行以下命令来获取当前的公网IP地址。

curl https://icanhazip.com

故障排除技巧

检查 UDP 端口 51820 是否打开

在服务器上安装tshark网络流量分析器。 Tshark 是 Wireshark 的命令行版本。

sudo apt install tshark

如果系统询问您“<strong>非超级用户是否能够捕获数据包?</strong>”,请回答<strong>是</strong>。安装完成后,运行以下命令将您的用户帐户添加到 wireshark 组中,以便您可以捕获数据包。

sudo adduser your-username wireshark

然后,启动 tshark 在 UDP 端口 51820 上捕获数据包。将 ens3 替换为您的主网络接口。

tshark -i ens3 -f "udp port 51820"

如果 WireGuard 客户端能够连接到服务器的 UDP 端口 51820,那么您将看到 tshark 捕获的数据包,如下所示。可以看到,客户端开始发起握手,服务器发回握手响应。一旦建立连接,客户端就会发送保活数据包。

Capturing on 'ens3'
** (tshark:902085) 02:47:41.865227 [Main MESSAGE] -- Capture started.
** (tshark:902085) 02:47:41.866056 [Main MESSAGE] -- File: "/tmp/wireshark_eth0JVEWT1.pcapng"
1 105.092578905 11.22.33.44 → 12.34.56.78 WireGuard 190 Handshake Initiation, sender=0x3F1A04AB
2 110.464628716 12.34.56.78 → 11.22.33.44 WireGuard 134 Handshake Response, sender=0x34ED7471, receiver=0xD4B23800
3 110.509517074 11.22.33.44 → 12.34.56.78 WireGuard 74 Keepalive, receiver=0x34ED7471, counter=0

如果 WireGuard 客户端无法连接到服务器的 UDP 端口 51820,那么您将只能看到握手启动数据包。没有握手响应。

Capturing on 'ens3' 
** (tshark:902085) 02:47:41.865227 [Main MESSAGE] -- Capture started.
** (tshark:902085) 02:47:41.866056 [Main MESSAGE] -- File: "/tmp/wireshark_eth0JVEWT1.pcapng"
1 105.092578905 11.22.33.44 → 12.34.56.78 WireGuard 190 Handshake Initiation, sender=0x3F1A04AB
2 149.670118573 11.22.33.44 → 12.34.56.78 WireGuard 190 Handshake Initiation, sender=0x7D584974
3 152.575188680 11.22.33.44 → 12.34.56.78 WireGuard 190 Handshake Initiation, sender=0x8D2407B9
4 153.706876729 12.34.56.78 → 11.22.33.44 WireGuard 190 Handshake Initiation, sender=0x47690027
5 154.789959772 11.22.33.44 → 12.34.56.78 WireGuard 190 Handshake Initiation, sender=0x993232FC
6 157.956576772 11.22.33.44 → 12.34.56.78 WireGuard 190 Handshake Initiation, sender=0x06AD433B
7 159.082825929 12.34.56.78 → 11.22.33.44 WireGuard 190 Handshake Initiation, sender=0x8C089E1

Ping 测试

您可以从 VPN 服务器向 VPN 客户端执行 ping 操作 (ping 10.10.10.2) 以查看隧道是否正常工作。如果您在 ping 中看到以下错误消息,

ping: sendmsg: Required key not available

可能是 AllowedIPs 参数错误,例如拼写错误。

如果 ping 错误消息是

ping: sendmsg: Destination address required

可能是您的配置文件中的私钥/公钥错误。

无法浏览互联网

如果 VPN 隧道已成功建立,但客户端公共 IP 地址没有更改,那是因为 UFW 配置文件中的伪装或转发规则不起作用。我曾经在/etc/ufw/before.rules文件中出现了拼写错误,导致我的电脑无法浏览互联网。

请注意,我不建议在 WireGuard 配置文件的 [Interface] 部分中使用 SaveConfig=true。 SaveConfig 告诉 WireGuard 在关闭时保存运行时配置。因此,如果您在配置文件中添加额外的[Peer],然后重新启动 WireGuard,您新添加的配置将被覆盖。

在 Linux 内核中启用调试日志记录

如果您使用 Linux 内核 5.6+,则可以使用以下命令启用 WireGuard 的调试日志记录。

sudo su -
echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

然后您可以使用以下命令查看调试日志

sudo dmesg -wH

或者

sudo journalctl -kf

重新启动

如果您的 VPN 仍然无法工作,请尝试重新启动 VPN 服务器。

sudo systemctl restart

然后停止 VPN 客户端。

sudo systemctl stop

并在VPN客户端上升级软件包。

sudo apt update
sudo apt upgrade

接下来,重新启动 VPN 客户端。

sudo shutdown -r now

sudo systemctl start 

添加其他 VPN 客户端

WireGuard 旨在将一个 IP 地址与一个 VPN 客户端相关联。要添加更多 VPN 客户端,您需要为每个客户端创建唯一的私钥/公钥对,然后将每个 VPN 客户端的公钥添加到服务器的配置文件 (/etc/wireguard/wg0.conf)像这样:

[Interface]
Address = 10.10.10.1/24
PrivateKey = UIFH+XXjJ0g0uAZJ6vPqsbb/o68SYVQdmYJpy/FlGFA=
ListenPort = 51820

[Peer]
PublicKey = 75VNV7HqFh+3QIT5OHZkcjWfbjx8tc6Ck62gZJT/KRA=
AllowedIPs = 10.10.10.2/32

[Peer]
PublicKey = YYh4/1Z/3rtl0i7cJorcinB7T4UOIzScifPNEIESFD8=
AllowedIPs = 10.10.10.3/32

[Peer]
PublicKey = EVstHZc6QamzPgefDGPLFEjGyedJk6SZbCJttpzcvC8=
AllowedIPs = 10.10.10.4/32

每个 VPN 客户端都有一个静态专用 IP 地址(10.10.10.2、10.10.10.3、10.10.10.4 等)。重新启动 WireGuard 服务器以使更改生效。

sudo systemctl restart [email 

然后照常在每个 VPN 客户端上添加 WireGuard 配置。

在 iOS/Andorid 上配置 VPN 客户端

由于我有 iPhone,我将向您展示如何在 iOS 上配置 WireGuard 客户端。从应用商店安装 <strong>WireGuard</strong> 应用。然后打开此应用程序并单击<strong>添加隧道</strong>按钮。

您有 3 种方法来创建新的 WireGuard 隧道。

  • 从文件或存档创建
  • 从二维码创建
  • 从头开始创建

选择二维码方法,因为它更容易。在服务器上运行以下命令,为 iOS 客户端生成 WireGuard 公钥/私钥。

wg genkey | sudo tee /etc/wireguard/ios_private.key | wg pubkey | sudo tee /etc/wireguard/ios_public.key

接下来,为 iOS 客户端创建 WireGuard 配置文件。

sudo nano /etc/wireguard/ios.conf

添加以下行。

[Interface]
Address = 10.10.10.3/24
DNS = 10.10.10.1
PrivateKey = mNiZvB+sASN/+ZiJkMyan1ZZOzCXkrjYPlbg7rZJ7Fc=

[Peer]
PublicKey = OMaXX7XD+wEYWfYyFcZZBN4vFSC16A1e8t80ONiJKWY=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

在哪里 :

  • <strong>地址</strong>:指定iOS客户端的私有IP地址。
  • <strong>DNS</strong>:指定 10.10.10.1(VPN 服务器)作为 DNS 服务器。您还可以指定多个 DNS 服务器以实现冗余,如下所示:DNS=10.10.10.1,8.8.8.8。请注意,iOS 应用不支持 DNS=10.10.10.1  8.8.8.8 语法。
  • <strong>PrivateKey</strong>:iOS客户端的私钥,可以在/etc/wireguard/ios_private.key文件中找到。
  • <strong>PublicKey</strong>:服务器的公钥,可以在服务器上的 /etc/wireguard/server_public.key 文件中找到。
  • <strong>AllowedIPs</strong>:0.0.0.0/0 代表整个互联网,这意味着所有到互联网的流量都应该通过 VPN 路由。
  • <strong>端点</strong>:VPN服务器的公网IP地址和端口号。将 12.34.56.78 替换为服务器的真实公共 IP 地址。
  • <strong>持久保持活动</strong>:每 25 秒向对等方发送一个经过身份验证的空数据包,以保持连接处于活动状态。如果未启用 PersistentKeepalive,VPN 服务器可能无法 ping VPN 客户端。

保存并关闭文件。然后在 WireGuard VPN 服务器上运行以下命令,从 iOS 配置文件生成二维码。

sudo apt install qrencode

sudo cat /etc/wireguard/ios.conf | qrencode -t ansiutf8

接下来,从iOS WireGuard应用程序扫描二维码,因此/etc/wireguard/ios.conf文件中的内容将被导入到WireGuard iOS客户端。

在 iOS 客户端上添加隧道后,我们还需要在 WireGaurd 服务器配置文件中添加 [peer]。

sudo nano /etc/wireguard/wg0.conf

像这样:

[Interface]
Address = 10.10.10.1/24
PrivateKey = UIFH+XXjJ0g0uAZJ6vPqsbb/o68SYVQdmYJpy/FlGFA=
ListenPort = 51820

[Peer]
PublicKey = 75VNV7HqFh+3QIT5OHZkcjWfbjx8tc6Ck62gZJT/KRA=
AllowedIPs = 10.10.10.2/32

[Peer]
# iOS client
PublicKey = YYh4/1Z/3rtl0i7cJorcinB7T4UOIzScifPNEIESFD8=
AllowedIPs = 10.10.10.3/32

保存并关闭文件。然后重新启动 WireGuard VPN 服务器。

sudo systemctl restart [email 

现在您可以从 iOS 应用程序建立 WireGuard VPN 连接。

配置Windows客户端

下载适用于 Windows 的 WireGuard 安装程序。

安装完成后,启动 WireGuard 程序。您需要右键单击左侧边栏来<strong>创建一个新的空隧道</strong>。它将自动为 Windows 客户端创建公钥/私钥。

<a href="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/windows-add-new-wireguard-tunnel.png"><img src="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/windows-add-new-wireguard-tunnel.png" /></a>

现在您需要添加其他信息。

<span class="hljs-section">[Interface]</span> 
<span class="hljs-attr">PrivateKey</span> = mNiZvB+sASN/+ZiJkMyan1ZZOzCXkrjYPlbg7rZJ7Fc= 
<span class="hljs-attr">Address</span> = <span class="hljs-number">10.10</span>.<span class="hljs-number">10.4</span>/<span class="hljs-number">24</span> 
<span class="hljs-attr">DNS</span> = <span class="hljs-number">10.10</span>.<span class="hljs-number">10.1</span> 

<span class="hljs-section">[Peer]</span> 
<span class="hljs-comment"># VPN server</span> 
<span class="hljs-attr">PublicKey</span> = OMaXX7XD+wEYWfYyFcZZBN4vFSC16A1e8t80ONiJKWY= 
<span class="hljs-attr">AllowedIPs</span> = <span class="hljs-number">0.0</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">0</span> 
<span class="hljs-attr">Endpoint</span> = <span class="hljs-number">12.34</span>.<span class="hljs-number">56.78</span>:<span class="hljs-number">51820</span> 
<span class="hljs-attr">PersistentKeepalive</span> = <span class="hljs-number">25</span>

在哪里 :

  • <strong>地址</strong>:指定Windows客户端的私有IP地址。
  • <strong>DNS</strong>:指定 10.10.10.1(VPN 服务器)作为 DNS 服务器。您还可以指定多个 DNS 服务器以实现冗余,如下所示:DNS=10.10.10.1,8.8.8.8。请注意,Windows 应用不支持 DNS=10.10.10.1 8.8.8.8 语法。
  • <strong>PrivateKey</strong>:Windows 客户端的私钥,自动创建。
  • <strong>PublicKey</strong>:服务器的公钥,可以在服务器上的 /etc/wireguard/server_public.key 文件中找到。
  • <strong>AllowedIPs</strong>:0.0.0.0/0 代表整个互联网,这意味着所有到互联网的流量都应该通过 VPN 路由。
  • <strong>端点</strong>:VPN服务器的公网IP地址和端口号。将 12.34.56.78 替换为服务器的真实公共 IP 地址。
  • <strong>持久保持活动</strong>:每 25 秒向对等方发送一个经过身份验证的空数据包,以保持连接处于活动状态。如果未启用 PersistentKeepalive,VPN 服务器可能无法 ping VPN 客户端。

<strong>提示</strong>:在 Windows 上,您可以使用 <a href="https://cn.a-d.site/?cat=powershell" target="_blank" rel="noopener">PowerShell</a> 程序通过 SSH 访问 Linux 服务器。

<a href="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-windows-configuration.png"><img src="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-windows-configuration.png" /></a>

保存配置。

在 Windows 客户端上添加隧道后,我们还需要在 WireGaurd 服务器配置文件中添加 [peer]。

sudo nano /etc/wireguard/wg0.conf

像这样:

[Interface] 
Address = 10.10.10.1/24 
PrivateKey = UIFH+XXjJ0g0uAZJ6vPqsbb/o68SYVQdmYJpy/FlGFA= 
ListenPort = 51820 

[Peer] 
PublicKey = 75VNV7HqFh+3QIT5OHZkcjWfbjx8tc6Ck62gZJT/KRA= 
AllowedIPs = 10.10.10.2/32 

[Peer] 
# iOS client 
PublicKey = YYh4/1Z/3rtl0i7cJorcinB7T4UOIzScifPNEIESFD8= 
AllowedIPs = 10.10.10.3/32 

[Peer] 
# Windows client PublicKey = wJpwC/gCWXZTGa5lQReKowRvymaaEUav0N1qeK74HlQ= 
AllowedIPs = 10.10.10.4/32

保存并关闭文件。然后重新启动 WireGuard VPN 服务器。

sudo systemctl restart [email 

现在您可以在 Windows 上建立 WireGuard VPN 连接。

策略路由、分割隧道和 VPN Kill Switch

现在,我将向您展示如何将<strong>策略路由</strong>、<strong>分割隧道</strong>和<strong>VPN Kill Switch</strong>与 WireGuard VPN 结合使用。 <strong>注意</strong>,不建议将它们一起使用。如果您使用策略路由,则不应启用分割隧道或 VPN 终止开关,反之亦然。

策略路由

默认情况下,VPN 客户端上的所有流量都将通过 VPN 服务器路由。有时,您可能只想根据传输层协议和目标端口路由特定类型的流量。这称为策略路由。

策略路由是在客户端计算机上配置的,我们需要停止 WireGuard 客户端进程。

sudo systemctl stop [email 

然后编辑客户端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

例如,如果您在[interface]部分添加以下3行,则WireGuard将创建一个名为“1234”的路由表,并将ip规则添加到路由表中。在此示例中,仅当使用 TCP 作为传输层协议且目标端口为 25(即客户端计算机发送电子邮件时)时,流量才会通过 VPN 服务器路由。

Table = 1234
PostUp = ip rule add ipproto tcp dport 25 table 1234
PreDown = ip rule delete ipproto tcp dport 25 table 1234

<a href="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-vpn-policy-routing-debian.png"><img src="https://cn.linux-terminal.com/common-images/wireguard-vpn-server-debian/wireguard-vpn-policy-routing-debian.png" /></a>

保存并关闭文件。然后再次启动 WireGuard 客户端。

sudo systemctl start

分割隧道

默认情况下,VPN 客户端上的所有流量都将通过 VPN 服务器路由。以下是启用分割隧道的方法,这样只有到 10.10.10.0/24 IP 范围的流量才会通过 WireGuard VPN 进行隧道传输。当您想要为多个云服务器构建专用网络时,这非常有用,因为 VPN 客户端将在云服务器上运行,如果您使用完整的 VPN 隧道,那么您可能会失去与云服务器的连接。

编辑客户端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

改变

AllowedIPs = 0.0.0.0/0

sudo systemctl restart

因此,仅当目标地址位于 10.10.10.0/24 IP 范围内时,流量才会通过 VPN 路由。保存并关闭文件。然后重新启动 WireGuard 客户端。

sudo systemctl restart [email 

VPN 终止开关

默认情况下,当 VPN 连接中断时,您的计算机可以通过正常网关访问 Internet。您可能需要启用终止开关功能,该功能可防止未加密的数据包通过非 WireGuard 接口流动。

停止 WireGuard 客户端进程。

sudo systemctl stop [email 

编辑客户端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

在 [interface] 部分添加以下两行。

PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

像这样:

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = kQvxOJI5Km4S1c7WXu2UZFpB8mHGuf3Gz8mmgTIF2U0=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

保存并关闭文件。然后启动 WireGuard 客户端。

sudo systemctl start

在 Debian 10 上安装 Linux 内核 5.x

Debian 10 上当前的 Linux 内核版本是 4.19。在步骤 1 中,我们在 Debian 10 上添加了向后移植存储库。在撰写本文时,<strong>向后移植存储库</strong>包括 Linux 内核 5.10。您可能知道,从 5.4 版本开始,wireguard 模块就包含在 Linux 内核中。如果我们在Debian 10上安装Linux内核5.10,则系统升级Linux内核时不需要构建wireguard模块。事实上,我的Debian 10服务器曾经在使用wireguard-dkms构建wireguard模块时遇到问题。

请注意,当您阅读本文时,Debian 10 向后移植存储库可能已删除内核 5.10 并包含内核 5.11。只需在以下命令中将 5.8 替换为 5.9 即可。

要在Debian 10云服务器上安装Linux内核5.8,请运行以下命令。

sudo apt install linux-image-5.10.0-0.bpo.7-cloud-amd64 linux-headers-5.10.0-0.bpo.7-cloud-amd64

要在 Debian 10 PC 上安装 Linux 内核 5.8,请运行以下命令。

 sudo apt install linux-image-5.10.0-0.bpo.7-amd64 linux-headers-5.10.0-0.bpo.7-amd64

然后重新启动您的 Debian 10 机器。

sudo shutdown -r now

检查您的 Linux 内核版本。

uname -r

样本输出

5.10.0-0.bpo.7-cloud-amd64

虽然我们不再需要 wireguard-dkms 软件包,但它是 wireguard 软件包的依赖项,因此我们无法将其从系统中删除。升级 wireguard 软件包时,您可能会看到以下错误。

Error! The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which
does not match this kernel/arch. This indicates that it should not be built

这表明 wireguard-dkms 正在尝试将 wireguard 模块构建到 Linux 内核中,但 Linux 5.10 包含原生 wireguard 模块,因此构建操作被阻止,您可以忽略此错误。

引用自:https://cn.linux-terminal.com/?p=3296