使用 WireGuard 搭建服务端与客户端的完整流程
本文将详细讲解如何在 Linux 环境下配置 WireGuard 服务端与客户端,并实现掉线自动重启的机制。本文适用于有一定 Linux 基础的用户。
什么是 WireGuard?
WireGuard 是一种轻量级、高性能的 VPN 协议,由 Jason Donenfeld 于 2015 年发明,并于 2018 年正式发布。其设计目标是提供快速、安全且简单的虚拟专用网络连接。
相比传统的 VPN 协议(如 IPsec 和 OpenVPN),WireGuard 具有以下优点:
- 更小的代码库:代码量更少,便于审计和维护。
- 更高的速度:采用高效的加密与传输机制,性能出众。
- 更低的资源消耗:对系统资源占用更少。
- 更简单的架构:配置与部署流程简化,使用体验类似于配置 SSH。
- 更安全的加密方式:基于现代加密原语,安全性更高。
WireGuard 最初在 Linux 平台上开发,如今也可用于 Windows、macOS、BSD、iOS 和 Android 等多种平台。易于跨平台部署,是其重要特性之一。
WireGuard 背景
传统的 VPN 协议(如 IPsec、OpenVPN)大多在几十年前开发,随着安全需求的提升和软硬件的发展,它们在速度、配置复杂度和安全性方面显得不足。Jason Donenfeld 在此背景下开发出 WireGuard,使其成为更快速、安全且易于部署和管理的开源 VPN 协议。
自 Linux 内核 5.6 开始,WireGuard 已被合并进内核主线,这进一步提升了其性能与易用性。
部署流程概览
- 服务器端配置:安装 WireGuard、生成密钥对、配置服务端
wg0.conf
、启用 IP 转发、启动服务。 - 客户端配置:安装 WireGuard、生成密钥对、配置客户端
wg0.conf
、启动客户端并验证连接。 - 添加/删除客户端:通过
wg
命令在服务器侧添加或移除客户端。 - 掉线自启动:通过定时任务 (crontab) 和脚本检测连接状态,并在掉线时自动重启客户端服务。
以下为详细步骤。
一、服务器端配置
1. 安装 WireGuard
如果你的内核版本 >= 5.6,那么内核原生支持 WireGuard,只需安装相关工具:
sudo apt update && sudo apt install wireguard
对于较早版本内核,需要先升级内核或者使用 wireguard-dkms、wireguard-tools 来实现兼容。如果出现以下错误:
Unable to access interface: Protocol not supported
请更新内核或安装相应的 backports 版本(后文有 Debian backports 的解决方案)。
2. 生成密钥对
在服务器上执行:
wg genkey | sudo tee /etc/wireguard/privatekey-wg0 | wg pubkey | sudo tee /etc/wireguard/publickey-wg0
生成的私钥和公钥分别保存在 /etc/wireguard/privatekey-wg0
与 /etc/wireguard/publickey-wg0
文件中。
3. 配置服务器参数
创建并编辑服务器端配置文件:
sudo touch /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf
粘贴如下内容(根据实际情况修改):
[Interface]
Address = 10.100.1.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51800
PrivateKey = SERVER_PRIVATE_KEY
其中:
SERVER_PRIVATE_KEY
替换为/etc/wireguard/privatekey-wg0
文件中的内容。eth0
替换为你的实际出口网卡名称,可以用如下命令获取默认路由网卡名:ip -o -4 route show to default | awk '{print $5}'
如果希望客户端仅访问内网(10.100.1.0/24),可以修改 PostUp/PostDown,如下:
PostUp = iptables -A FORWARD -p all -i wg0 ! -d 10.100.1.0/24 -j DROP
PostDown = iptables -D FORWARD -p all -i wg0 ! -d 10.100.1.0/24 -j DROP
如果要在同一台服务器上配置多个 WG 实例,可增加 wg1.conf
并生成对应的私钥公钥文件,然后按照同样的流程配置。
iptables 参考
如果不熟悉 iptables,可参考以下资料:
(请在网上搜索对应资料的详细链接)
4. 配置服务器 IP 转发
编辑 /etc/sysctl.conf
文件:
sudo nano /etc/sysctl.conf
确保有如下行,并取消注释:
net.ipv4.ip_forward=1
然后执行:
sudo sysctl -p
使修改生效。
5. 启动/停止服务器端
启动服务端:
sudo wg-quick up wg0
如果成功会有类似输出:
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.100.1.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
停止服务端:
sudo wg-quick down wg0
检查当前服务器状态:
sudo wg
输出示例:
interface: wg0
public key: ********************
private key: (hidden)
listening port: 51800
二、客户端配置
1. 安装 WireGuard 客户端
各平台安装方式略有不同,可访问官网获取安装包:
在 Linux 下:
sudo apt update && sudo apt install wireguard
2. 生成客户端密钥对
Linux 客户端上运行:
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
Windows 客户端可在 GUI 程序中直接生成,记录下私钥、公钥即可。
3. 配置客户端参数
创建并编辑客户端配置文件:
sudo touch /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf
粘贴如下内容,并根据实际情况修改:
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY # 客户端私钥
Address = 10.100.1.2/32 # 为本机分配的IP,与服务端同网段
[Peer]
PublicKey = SERVER_PUBLIC_KEY # 服务器公钥
Endpoint = SERVER_IP_ADDRESS:51800 # 服务器的公网IP和侦听端口
AllowedIPs = 10.100.1.0/24 # 通过 WireGuard 的流量范围。若设为0.0.0.0/0则所有流量都走WG
PersistentKeepalive = 120 # 每120秒发送一次心跳包防止NAT下线
CLIENT_PRIVATE_KEY
:替换为客户端私钥文件中内容。SERVER_PUBLIC_KEY
:替换为服务端/etc/wireguard/publickey-wg0
文件中的公钥。SERVER_IP_ADDRESS
:替换为服务端的公网 IP 地址。
如果有多台客户端,请确保为每台客户端分配不同的 Address
(例如 10.100.1.3、10.100.1.4 等)。
4. 启动/停止客户端
启动客户端:
sudo wg-quick up wg0
成功启动后可通过 ping 10.100.1.1
测试能否访问服务端。
停止客户端:
sudo wg-quick down wg0
5. 配置开机自动启动
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
检查服务状态:
sudo systemctl status wg-quick@wg0
三、服务器添加/删除客户端
在服务器端添加客户端公钥和对应的 IP:
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.100.1.2/32
删除客户端:
sudo wg set wg0 peer CLIENT_PUBLIC_KEY remove
查看当前客户端连接情况:
sudo wg
输出示例:
interface: wg0
public key: ***********************
private key: (hidden)
listening port: 51800
peer: ***********************
endpoint: *.*.*.*:36875
allowed ips: 10.100.1.2/32
latest handshake: 10 seconds ago
transfer: 392 B received, 184 B sent
四、掉线自启动配置(客户端侧)
下面的步骤主要用于客户端,定期检测到服务器的连通性,如果不通则自动重启客户端。
1. 新建检测脚本
touch /home/dev/Documents/pingwireguard.sh
chmod +x /home/dev/Documents/pingwireguard.sh
vim /home/dev/Documents/pingwireguard.sh
脚本内容(根据实际情况修改 IP):
#!/bin/sh
if ! ping -c 3 10.100.1.1 > /dev/null 2>&1 ; then
echo "$(date) The network is down! Restarting wg0..."
sudo systemctl restart wg-quick@wg0.service
else
echo "$(date) WireGuard network is alive."
fi
2. 配置定时任务 (crontab)
crontab -e
增加以下行,每10分钟检查一次连接情况:
*/10 * * * * /home/dev/Documents/pingwireguard.sh >> /home/dev/Documents/crontab.log 2>&1
3. 配置 sudo 免密执行
如果检测脚本运行用户为 dev
,则编辑 sudoers 文件:
sudo visudo
在文件中添加:
%dev ALL=(ALL:ALL) NOPASSWD:/bin/systemctl restart wg-quick@wg0.service
如果用户无 sudo 权限,请同时为其增加 sudo 权限:
dev ALL=(ALL:ALL) ALL
%dev ALL=(ALL:ALL) NOPASSWD:/bin/systemctl restart wg-quick@wg0.service
4. 检查定时任务执行情况
sudo tail -f /var/log/syslog | grep CRON
若输出中出现运行记录,说明 crontab 已触发脚本。也可查看 crontab.log
日志文件。
附:Debian10 安装与报错解决方案
在 Debian 10 环境下,若安装后执行 wg-quick up wg0
出现:
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
请添加 Backports 源并重新安装:
echo "deb http://deb.debian.org/debian buster-backports main" | sudo tee /etc/apt/sources.list.d/buster-backports.list
根据你的实际版本替换 buster
字段。
然后执行:
sudo apt update
sudo apt -t buster-backports install wireguard wireguard-tools wireguard-dkms linux-headers-$(uname -r)
安装完成后再启动 wg-quick up wg0
即可正常运行。
总结
以上内容详细介绍了从安装 WireGuard、配置服务端与客户端、启用 IP 转发、实现客户端定时检测掉线自动重启等完整流程。通过该指南,你可以轻松搭建稳定的 WireGuard VPN 环境,并在掉线时自动恢复连接。