WireGuard是一个开源的VPN协议,是IPSec、IKEv2和OpenVPN的替代方案。WireGuard专为Linux和Unix操作系统设计,运行在Linux内核空间中,这使得WireGuard更加快速和可靠。WireGuard用于在两台或多台计算机之间创建安全的隧道连接。

WireGuard的目标是取代IPSec、IKEv2和OpenVPN等VPN协议。WireGuard更轻量、更快速、更易于配置,同时效率更高。与此同时,WireGuard并没有在VPN协议的安全性方面做出妥协。WireGuard支持现代加密技术,如Noise协议框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF和安全可信构造。

本教程将向您展示如何在Debian 12服务器上安装WireGuard VPN,以及如何在Linux机器上配置WireGuard客户端。

前提条件

在开始之前,请确保您具备以下条件:

- 运行Debian 12的Linux服务器
- 具有sudo权限的非root用户
- 一台客户端机器 - 本教程使用基于Debian的发行版

准备系统

在安装WireGuard之前,您需要通过以下更改来准备Debian服务器:

- 通过/etc/sysctl.conf启用端口转发
- 安装并配置UFW

启用端口转发

要启用端口转发,您必须启用内核模块net.ipv4.ip_forward(用于IPv4)或net.ipv6.conf.all.forwarding(用于IPv6)。这些内核模块可以通过/etc/sysctl.conf文件来启用。

使用以下nano编辑器命令打开/etc/sysctl.conf文件。

sudo nano /etc/sysctl.conf

插入以下配置以启用IPv4和IPv6的端口转发(如需要)。

# Port Forwarding for IPv4
net.ipv4.ip_forward=1

# Port forwarding for IPv6
net.ipv6.conf.all.forwarding=1

完成后保存文件并退出编辑器。

现在通过以下sysctl命令应用更改。

sudo sysctl -p

Debian 12启用端口转发

安装UFW

Debian上的默认防火墙是iptables,现在您将安装UFW。您将同时使用UFW和iptables来管理WireGuard服务器。

执行以下apt命令来更新软件源并在Debian系统上安装UFW。

sudo apt update && sudo apt install ufw -y

安装UFW防火墙

接下来,运行以下ufw命令来添加OpenSSH应用配置并启用UFW。输入y并按ENTER确认,您应该会看到消息"Firewall is active and enabled on system startup"。

sudo ufw allow OpenSSH
sudo ufw enable

启用UFW防火墙

最后,使用以下命令验证UFW状态。

sudo ufw status

如果正在运行,您应该看到输出"Status: active"。您还会看到OpenSSH应用配置已添加到UFW中。

验证UFW防火墙状态

安装WireGuard服务器

配置好Debian服务器后,您就可以在Debian机器上创建WireGuard VPN服务器了。完成以下任务来实现:

- 安装WireGuard
- 生成WireGuard服务器密钥
- 生成WireGuard客户端密钥
- 配置WireGuard接口
- 为WireGuard接口设置NAT

安装WireGuard

首先,通过执行以下命令在Debian服务器上安装wireguard软件包。

sudo apt install wireguard

输入y以继续安装。

安装WireGuard

生成WireGuard服务器密钥

安装wireguard软件包后,接下来的任务是生成服务器证书,这可以使用wg命令行工具来完成。

执行以下命令将wireguard服务器私钥生成到/etc/wireguard/server.key。然后,将服务器私钥的权限更改为0400,这意味着您将禁用对该文件的写访问权限。

wg genkey | sudo tee /etc/wireguard/server.key
sudo chmod 0400 /etc/wireguard/server.key

接下来,运行以下命令将wireguard服务器公钥生成到/etc/wireguard/server.pub。

sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub

生成WireGuard服务器密钥

现在您已经将私钥生成到/etc/wireguard/server.key,将公钥生成到/etc/wireguard/server.pub。您可以执行以下cat命令来显示私钥和公钥的内容。

cat /etc/wireguard/server.key
cat /etc/wireguard/server.pub

您的输出可能不同,但生成的密钥类似于以下内容:

查看WireGuard服务器密钥

生成WireGuard客户端密钥

WireGuard服务器密钥生成完成后,接下来的任务是为客户端生成密钥。您可以为每个用户生成客户端密钥,也可以多个用户共用一个密钥。

在本示例中,您将为特定用户alice生成客户端密钥。

首先,执行以下命令创建一个新目录来存储客户端密钥。在本例中,用户alice的公钥和私钥将生成到/etc/wireguard/clients/alice目录。

mkdir -p /etc/wireguard/clients/alice

现在,运行以下命令为用户alice生成私钥/etc/wireguard/clients/alice/alice.key和公钥/etc/wireguard/clients/alice/alice.pub。

wg genkey | tee /etc/wireguard/clients/alice/alice.key
cat /etc/wireguard/clients/alice/alice.key | wg pubkey | tee /etc/wireguard/clients/alice/alice.pub

生成WireGuard客户端密钥

最后,运行以下命令显示用户alice的私钥和公钥内容。

cat /etc/wireguard/clients/alice/alice.key
cat /etc/wireguard/clients/alice/alice.pub

将显示类似以下的输出:

查看WireGuard客户端密钥

配置WireGuard接口

现在您已经为服务器和客户端生成了私钥和公钥,接下来的任务是配置WireGuard接口和对等节点。您将为WireGuard网络VPN配置接口,以及在客户端和服务器之间建立的对等连接。

使用以下nano编辑器命令创建新的WireGuard配置/etc/wireguard/wg0.conf。

sudo nano /etc/wireguard/wg0.conf

将以下配置插入到文件中。

[Interface]
# Wireguard Server private key - server.key
PrivateKey = cNBb6MGaKhmgllFxSq/h9BdYfZOdyKvo8mjzb2STbW8=

# Wireguard interface will be run at 10.10.0.1
Address = 10.10.0.1/24

# Clients will connect to UDP port 51820
ListenPort = 51820

# Ensure any changes will be saved to the Wireguard config file
SaveConfig = true

以下是[Interface]部分中使用参数的详细说明:

- PrivateKey:输入wireguard服务器私钥server.key的内容
- Address:将分配给WireGuard接口的IP地址。在本例中,wireguard接口将使用IP地址10.10.0.1
- ListenPort:客户端连接到wireguard服务器时使用的端口。在本例中,将使用端口51820
- SaveConfig:值为true意味着任何更改都将从接口的当前状态保存到关闭时

现在为wireguard客户端添加以下[Peer]部分。

[Peer]
# Wireguard client public key - alice.pub
PublicKey = 3ZoaoVgHOioZnKzCrF/XALAv70V4vyJXpl/UO7AKYzA=

# clients' VPN IP addresses you allow to connect
# possible to specify subnet => [10.10.0.0/24]
AllowedIPs = 10.10.0.2/24

以下是[Peer]部分中使用参数的说明:

- PublicKey:将wireguard客户端公钥输入到此参数中。在本例中,输入公钥alice.pub的内容
- AllowedIPs:定义客户端的IP地址并将流量路由到wireguard接口

完成后保存并关闭文件。

最后,运行以下命令开放端口51820/udp以供客户端连接。

sudo ufw allow 51820/udp

为WireGuard接口设置NAT

首先,运行以下命令显示用于连接互联网的默认网关接口。

sudo ip route list default

在本例中,默认网络互联网网关接口是eth0。

查看默认网关

现在使用以下nano编辑器命令打开wireguard配置/etc/wireguard/wg0.conf。

sudo nano /etc/wireguard/wg0.conf

在[Interface]部分下添加以下配置,并确保将接口eth0更改为您的默认互联网网关接口。

[Interface]
...

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

管理WireGuard服务

WireGuard服务器安装和配置完成后,您就可以在Debian系统上启动WireGuard服务了。这可以通过systemctl命令或使用wg-quick工具来完成。

要启动并启用wireguard服务器,运行以下systemctl命令。使用服务名称wg-quick@wg0,您将在wg0接口上启动WireGuard,该接口基于配置文件/etc/wireguard/wg0.conf。

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0

现在使用以下命令验证wireguard@wg0服务。

sudo systemctl status wg-quick@wg0

如果服务正在运行,将显示以下输出。

启动并验证WireGuard服务

接下来,运行以下ip命令显示wireguard接口wg0的详细信息。您应该看到wireguard接口wg0的IP地址为10.10.0.1。

sudo ip a show wg0

验证wg0接口

您还可以通过以下wg-quick命令手动启动或停止wireguard。

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

至此,您已经配置了wireguard服务器并通过systemctl命令在后台启动了它。您的客户端现在可以连接到wireguard服务器了。

在基于Debian的发行版上配置WireGuard客户端

在以下部分中,您将为基于Debian的发行版配置wireguard客户端。您将安装wireguard工具、创建wireguard客户端配置、连接到wireguard服务器、通过wg工具验证连接,并访问互联网。

通过APT在客户端机器上安装wireguard-tools软件包。客户端机器是基于Debian的发行版,因此将使用APT包管理器。

sudo apt install wireguard-tools resolvconf

安装WireGuard客户端工具

安装wireguard-tools后,使用以下nano编辑器创建新的wireguard客户端配置/etc/wireguard/wg-alice.conf。

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

将以下配置插入到文件中。

[Interface]
# Define the IP address for the client - must be matched with wg0 on the Wireguard Server
Address = 10.10.0.2/24

# specific DNS Server
DNS = 1.1.1.1

# Private key for the client - alice.key
PrivateKey = cPDg6SQHz/3l2R83lMWPzmR6/mMKnKp9PNImbtB6nGI=

[Peer]
# Public key of the Wireguard server - server.pub
PublicKey = APyBQvTkYVm0oakzcQUQViarwx1aIYz5wb/g2v2xdUE=

# Allow all traffic to be routed via Wireguard VPN
AllowedIPs = 0.0.0.0/0

# Public IP address of the Wireguard Server
Endpoint = 192.168.128.15:51820

# Sending Keepalive every 25 sec
PersistentKeepalive = 25

完成后保存并关闭文件。

以下是wireguard客户端[Interface]部分中一些参数的说明:

- Address:指定客户端机器上wireguard接口的内部IP地址
- DNS:为客户端设置默认DNS服务器
- PrivateKey:wireguard客户端私钥,在本例中为alice.key

在wireguard客户端配置的[Peer]部分中:

- PublicKey:这是wireguard服务器的公钥,即server.pub
- AllowedIPs:允许所有访问通过wireguard接口路由
- Endpoint:wireguard服务器的IP地址和端口
- PersistentKeepalive:每隔x秒发送保活数据包以保持连接

接下来,运行以下wg-quick命令在接口wg-alice上启动wireguard。

sudo wg-quick up wg-alice

如果一切正常,将显示类似以下的输出。

在客户端启动WireGuard

之后,运行以下ip命令检查接口wg-alice的详细信息。您应该看到wg-alice接口的本地IP地址为10.10.0.2。

sudo ip a show wg-alice

检查客户端WireGuard接口

接下来,通过执行以下命令验证客户端机器的互联网连接。

ping -c3 10.10.0.1
ping -c3 1.1.1.1
ping -c3 duckduckgo.com

如果您的wireguard服务器安装成功,您将从每个目标服务器收到响应,如下所示:

验证网络连通性

此外,您还可以通过在wireguard服务器或客户端机器上执行以下命令来查看wireguard服务器和客户端之间的详细连接信息。

wg show

将显示类似以下的输出。

查看WireGuard连接详情

最后,要停止客户端机器上的wireguard连接,运行以下wg-quick命令。

sudo wg-quick down wg-alice

停止客户端WireGuard

总结

综上所述,您现在已经一步步完成了在Debian 12服务器上安装WireGuard VPN。您还配置了基于Debian的客户端机器使用WireGuard并连接到了WireGuard服务器。有了这些基础,您现在可以通过添加更多WireGuard密钥和Peer配置来添加更多客户端。