WireGuard 服务器:安装与配置 – wiki大全

“`markdown

WireGuard 服务器:安装与配置详解

1. 引言

在当今数字世界中,网络安全和隐私保护变得前所未有的重要。虚拟私人网络(VPN)是实现这些目标的关键工具之一。传统 VPN 协议,如 OpenVPN 和 IPsec,虽然功能强大,但往往配置复杂且性能开销较大。WireGuard 作为一种现代、快速、轻量级的 VPN 协议,凭借其简洁的设计、卓越的性能和强大的加密能力,迅速获得了广泛的关注和采用。

WireGuard 的核心优势在于其极简主义。它由大约 4000 行代码组成,远少于其他协议,这使得其审计和维护变得更加容易,也减少了潜在的安全漏洞。它采用最新的加密技术,如 Curve25519、ChaCha20、Poly1305 等,确保了数据传输的安全性。此外,WireGuard 被设计为在内核空间运行,这意味着它能够提供极高的吞吐量和低延迟,使其成为高性能 VPN 解决方案的理想选择。

本教程将详细介绍如何在 Linux 服务器上安装和配置 WireGuard 服务器,并连接一个客户端设备。

2. 前提条件

在开始安装和配置之前,请确保您具备以下条件:

  • 一台运行 Linux 操作系统的服务器: 推荐使用 Ubuntu、Debian 或 CentOS。本教程将以 Ubuntu 为例。
  • 服务器的 root 或 sudo 访问权限。
  • 基本的 Linux 命令行知识。
  • 一个可用的公网 IP 地址或域名解析到您的服务器。
  • 选择一个未被占用的端口: WireGuard 默认使用 UDP 端口 51820,您可以根据需要更改。

3. 服务器安装与配置

3.1 更新系统并安装 WireGuard

首先,连接到您的 Linux 服务器并更新系统软件包。

bash
sudo apt update
sudo apt upgrade -y

接下来,安装 WireGuard 及其所需的工具。

bash
sudo apt install -y wireguard

3.2 生成服务器密钥对

WireGuard 使用公钥/私钥对进行身份验证。我们需要为服务器生成一对密钥。

“`bash

进入一个安全目录存放密钥

cd /etc/wireguard/

生成私钥

wg genkey | sudo tee privatekey

根据私钥生成公钥

sudo cat privatekey | wg pubkey | sudo tee publickey

设置私钥文件权限,确保只有root用户可读

sudo chmod 600 privatekey
“`

此时,/etc/wireguard/ 目录下应该有 privatekeypublickey 两个文件。请记下 publickey 的内容,稍后会用到。

3.3 创建服务器配置文件 (wg0.conf)

/etc/wireguard/ 目录下创建 WireGuard 的主配置文件 wg0.confwg0 是 WireGuard 接口的名称,您可以根据需要更改。

bash
sudo nano /etc/wireguard/wg0.conf

将以下内容粘贴到文件中,并根据您的实际情况进行修改:

“`ini
[Interface]

服务器的私钥

PrivateKey =

WireGuard 接口的 IP 地址。这是一个私有 IP 地址段,用于 WireGuard 隧道内部。

Address = 10.0.0.1/24

服务器监听的端口。默认为 51820 UDP。

ListenPort = 51820

PostUp 和 PostDown 脚本用于在 WireGuard 接口启动和停止时执行命令。

PostUp: 开启 IP 转发,并设置 NAT 规则,允许 WireGuard 客户端访问外部网络。

eth0 替换为您的服务器对外网卡的名称 (例如:ens3, enp0s3, venet0 等)。

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown: 清理 iptables 规则。

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

针对每个客户端,我们需要添加一个 [Peer] 段。

示例客户端配置,稍后会添加实际客户端信息。

[Peer]

PublicKey =

AllowedIPs = 10.0.0.2/32

“`

重要提示:

  • <YOUR_SERVER_PRIVATE_KEY> 替换为您在 3.2 步中生成的服务器私钥 (privatekey 文件的内容)。
  • eth0 替换为您的服务器实际对外网卡的名称。您可以使用 ip aifconfig 命令查看。
  • Address = 10.0.0.1/24 定义了 WireGuard 隧道内部的 IP 地址范围。10.0.0.1 是服务器的 IP,/24 表示隧道内可用的 IP 范围是 10.0.0.110.0.0.254
  • ListenPort = 51820 是 WireGuard 服务器监听的 UDP 端口。如果您的服务器有防火墙,请确保此端口已开放。

保存并关闭文件 (Ctrl+X, Y, Enter)。

3.4 启用 IP 转发

为了让 WireGuard 客户端能够通过服务器访问互联网,我们需要在服务器上启用 IP 转发。

编辑 /etc/sysctl.conf 文件:

bash
sudo nano /etc/sysctl.conf

找到以下行(如果存在则取消注释,如果不存在则添加):

net.ipv4.ip_forward = 1

保存并关闭文件。然后应用更改:

bash
sudo sysctl -p

3.5 配置防火墙 (ufw)

如果您的服务器启用了防火墙 (例如 UFW),您需要允许 WireGuard 端口的 UDP 流量以及 SSH 流量(如果您通过 SSH 连接)。

“`bash

允许 WireGuard 端口 (默认为 51820 UDP)

sudo ufw allow 51820/udp

允许 SSH 端口 (默认为 22 TCP)

sudo ufw allow ssh

启用 UFW (如果尚未启用)

sudo ufw enable

检查 UFW 状态

sudo ufw status
“`

确保防火墙已启用,并且 WireGuard 端口已开放。

3.6 启动 WireGuard 服务

现在,您可以启用并启动 WireGuard 服务了:

“`bash

启动 wg0 接口

sudo wg-quick up wg0

设置 WireGuard 开机自启动

sudo systemctl enable wg-quick@wg0
“`

您可以检查 WireGuard 的运行状态:

bash
sudo wg show wg0

如果一切正常,您应该能看到接口信息,但目前还没有任何对端 (peers)。

4. 客户端配置

接下来,我们将为客户端设备生成密钥并配置其连接。每个客户端都需要一个独立的 [Peer] 配置。

4.1 生成客户端密钥对

您可以在服务器上生成客户端密钥,然后将其传输到客户端,或者直接在客户端设备上生成。为了方便,我们仍然在服务器上生成:

“`bash

生成客户端私钥

wg genkey | sudo tee client1_privatekey

生成客户端公钥

sudo cat client1_privatekey | wg pubkey | sudo tee client1_publickey

设置私钥文件权限

sudo chmod 600 client1_privatekey
“`

请记下 client1_privatekeyclient1_publickey 的内容。

4.2 将客户端添加到服务器配置

编辑服务器上的 wg0.conf 文件,添加一个新的 [Peer] 段落:

bash
sudo nano /etc/wireguard/wg0.conf

在文件末尾添加以下内容,替换 <CLIENT1_PUBLIC_KEY>10.0.0.2

“`ini
[Peer]

客户端的公钥

PublicKey =

客户端在 WireGuard 隧道内部的 IP 地址。确保与服务器地址在同一网段,且不与服务器 IP 冲突。

AllowedIPs = 10.0.0.2/32
“`

重要提示:

  • PublicKey:替换为 client1_publickey 的内容。
  • AllowedIPs:为客户端分配一个隧道内部的 IP 地址,例如 10.0.0.2/32。每个客户端的 IP 地址都必须是唯一的。/32 表示只允许这个单一 IP 地址。

保存并关闭文件。

由于我们修改了服务器配置,需要重启 WireGuard 服务以应用更改:

“`bash
sudo wg-quick down wg0
sudo wg-quick up wg0

或者直接

sudo systemctl restart wg-quick@wg0
“`

再次检查服务器状态,您应该能看到 client1 作为对端:

bash
sudo wg show wg0

4.3 创建客户端配置文件 (client1.conf)

现在,创建客户端的配置文件。这个文件需要传输到客户端设备。

bash
sudo nano /etc/wireguard/client1.conf

将以下内容粘贴到文件中,并进行必要的修改:

“`ini
[Interface]

客户端的私钥

PrivateKey =

客户端在 WireGuard 隧道内部的 IP 地址。必须与服务器上 [Peer] 段中的 AllowedIPs 匹配。

Address = 10.0.0.2/24

DNS 服务器地址,您可以设置为公共 DNS (如 Google 8.8.8.8, Cloudflare 1.1.1.1) 或您自己的 DNS 服务器。

DNS = 8.8.8.8, 8.8.4.4

[Peer]

服务器的公钥

PublicKey =

服务器的公网 IP 地址和监听端口

Endpoint = :51820

允许客户端通过隧道访问的所有 IP 地址。0.0.0.0/0 表示所有流量都通过 WireGuard 隧道。

AllowedIPs = 0.0.0.0/0

PersistentKeepalive: 每隔指定秒数发送一个握手包,保持隧道活跃。

PersistentKeepalive = 25
“`

重要提示:

  • PrivateKey:替换为 client1_privatekey 的内容。
  • Address:替换为分配给此客户端的 IP 地址,例如 10.0.0.2/24。注意这里是 /24 而不是 /32,表示客户端可以访问隧道内的所有 IP。
  • DNS:配置客户端使用的 DNS 服务器。
  • PublicKey:替换为服务器的公钥 (publickey 文件的内容)。
  • Endpoint:替换为您的服务器的公网 IP 地址或域名,以及 WireGuard 监听的端口。
  • AllowedIPs = 0.0.0.0/0 意味着所有客户端流量都将通过 WireGuard 隧道。如果您只想隧道特定流量,可以修改此项。

保存并关闭文件。

4.4 传输客户端配置文件

现在您需要将 client1.conf 文件传输到您的客户端设备。您可以使用 scpsftp、USB 驱动器,或者将其内容复制粘贴到客户端设备上。

例如,使用 scp

“`bash

在服务器上执行,将文件传输到本地机器的当前目录

scp /etc/wireguard/client1.conf your_local_user@your_local_ip:/path/to/save/
“`

或者,直接复制粘贴文件内容。

5. 客户端连接

不同操作系统的 WireGuard 客户端安装和连接方式略有不同:

  • Linux 客户端:
    • 安装 WireGuard (sudo apt install wireguard-tools)。
    • client1.conf 复制到 /etc/wireguard/ 目录下。
    • 启动 WireGuard 接口:sudo wg-quick up client1
    • 启用开机自启动:sudo systemctl enable wg-quick@client1
    • 检查状态:sudo wg show client1
  • Windows 客户端:
    • WireGuard 官网 下载并安装 Windows 客户端。
    • 打开客户端,点击 “Import tunnel(s) from file” 导入 client1.conf
    • 点击 “Activate” 连接。
  • macOS 客户端:
    • 从 App Store 下载 WireGuard 客户端。
    • 点击 “+” 按钮,选择 “Import tunnel(s) from file” 导入 client1.conf
    • 点击 “Activate” 连接。
  • Android/iOS 客户端:
    • 从应用商店下载 WireGuard 应用。
    • 可以通过扫描配置文件生成的二维码,或手动导入配置文件来添加隧道。

连接成功后,客户端的公网 IP 应该变为 WireGuard 服务器的公网 IP。

6. 测试与故障排除

6.1 测试连接

  • 在客户端: 访问 whatismyip.com 或其他 IP 查询网站,检查显示的 IP 地址是否为您的 WireGuard 服务器的公网 IP。
  • 在服务器: 运行 sudo wg show wg0。如果客户端已连接并有流量,您应该能看到 latest handshake 时间戳和 transfer 字节数。
  • Ping 测试: 从客户端 Ping 10.0.0.1 (服务器在隧道内的 IP),从服务器 Ping 10.0.0.2 (客户端在隧道内的 IP)。

6.2 常见问题和故障排除

  • 无法连接或无流量:
    • 防火墙: 检查服务器防火墙 (UFW, firewalld, 安全组等) 是否开放了 WireGuard 的 UDP 端口 (默认 51820)。
    • IP 转发: 确保 net.ipv4.ip_forward = 1 已启用并应用。
    • 网卡名称: 检查 wg0.conf 中的 PostUp 规则,eth0 是否与服务器实际对外网卡名称匹配。
    • 密钥: 仔细检查服务器和客户端配置文件中的公钥和私钥是否正确对应,没有混淆。
    • IP 地址: 确保客户端和服务器在 AllowedIPsAddress 中的 IP 地址配置正确且不冲突。
    • Endpoint: 客户端配置文件中的 Endpoint 是否是服务器正确的公网 IP/域名和端口。
  • 客户端连接但无法上网:
    • NAT 规则: 检查服务器 wg0.conf 中的 PostUp NAT 规则是否正确。MASQUERADE 规则是实现客户端通过服务器上网的关键。
    • DNS: 检查客户端配置文件中的 DNS 设置是否正确。尝试使用公共 DNS (如 8.8.8.8)。
  • 多个客户端: 为每个新客户端重复 4.1 到 4.3 步骤,确保每个客户端有唯一的私钥、公钥和隧道内部 IP 地址,并将其公钥和 AllowedIPs 添加到服务器的 wg0.conf 中。

7. 总结

通过本教程,您应该已经成功安装并配置了您的 WireGuard 服务器,并连接了一个客户端。WireGuard 以其卓越的性能、简洁的配置和强大的安全性,成为个人和企业 VPN 解决方案的优秀选择。定期检查 WireGuard 的日志和状态,并确保服务器操作系统和 WireGuard 软件包保持最新,是维护其稳定性和安全性的最佳实践。

随着您对 WireGuard 的了解加深,您可以进一步探索更高级的配置,例如路由优化、DNS 过滤等,以满足更复杂的网络需求。
“`

滚动至顶部