WireGuard — 极简高性能 VPN 隧道协议
安装与配置
# === Ubuntu/Debian 安装 ===
sudo apt update && sudo apt install -y wireguard # 安装 WireGuard(内核 5.6+ 已内置模块)
# === CentOS/RHEL 安装 ===
sudo yum install -y epel-release elrepo-release # 添加 EPEL 和 ELRepo 仓库
sudo yum install -y kmod-wireguard wireguard-tools # 安装内核模块和管理工具
# === macOS 安装 ===
brew install wireguard-tools # 安装命令行工具
# === 验证安装 ===
wg --version # 查看版本(最新 wireguard-tools 1.0.20260223)
sudo modprobe wireguard # 加载内核模块(5.6 以下内核需要)
核心用法
# --- 第1步:生成服务端密钥对 ---
wg genkey | sudo tee /etc/wireguard/server_private.key # 生成私钥并保存
sudo chmod 600 /etc/wireguard/server_private.key # 设置私钥权限(仅 root 可读)
sudo cat /etc/wireguard/server_private.key | wg pubkey | \
sudo tee /etc/wireguard/server_public.key # 从私钥导出公钥
# --- 第2步:创建服务端配置 /etc/wireguard/wg0.conf ---
sudo cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
PrivateKey = <服务端私钥> # 填入服务端私钥
Address = 10.0.0.1/24 # VPN 内网地址(服务端)
ListenPort = 51820 # 监听端口(默认 51820)
SaveConfig = true # 退出时自动保存配置
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE # 启动后开启 NAT
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # 关闭前清除 NAT
[Peer]
PublicKey = <客户端公钥> # 填入客户端的公钥
AllowedIPs = 10.0.0.2/32 # 客户端的 VPN 内网 IP
EOF
# --- 第3步:启动 VPN 隧道 ---
sudo wg-quick up wg0 # 启动 wg0 接口
sudo systemctl enable wg-quick@wg0 # 设置开机自启
# --- 第4步:开启 IP 转发(服务端必须)---
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf # 写入配置
sudo sysctl -p # 立即生效
# --- 查看 VPN 状态 ---
sudo wg show # 显示所有 WireGuard 接口状态
sudo wg show wg0 # 显示 wg0 接口的详细信息
参数详解
| 参数 | 位置 | 说明 |
|---|
PrivateKey | [Interface] | 本机的私钥 |
Address | [Interface] | 本机的 VPN 内网地址(CIDR 格式) |
ListenPort | [Interface] | 服务端监听的 UDP 端口(默认 51820) |
DNS | [Interface] | 客户端使用的 DNS 服务器 |
PostUp/PreDown | [Interface] | 接口启动/关闭时执行的命令 |
PublicKey | [Peer] | 对端的公钥 |
AllowedIPs | [Peer] | 允许通过隧道的 IP 范围 |
Endpoint | [Peer] | 对端的公网 IP:端口(客户端填服务端地址) |
PersistentKeepalive | [Peer] | NAT 保活间隔(秒),建议 25 |
实战案例
# === 完整场景:搭建一个 WireGuard VPN(服务端+客户端)===
# ===== 服务端操作(公网服务器)=====
sudo apt install -y wireguard # 安装 WireGuard
# 生成服务端密钥
wg genkey | sudo tee /etc/wireguard/server.key # 生成私钥
sudo cat /etc/wireguard/server.key | wg pubkey | \
sudo tee /etc/wireguard/server.pub # 导出公钥
# 开启 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1 # 临时开启
# 创建配置文件(先不加 Peer,后面动态添加)
sudo bash -c 'cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/server.key)
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF'
sudo wg-quick up wg0 # 启动 VPN
# ===== 客户端操作(笔记本/手机)=====
sudo apt install -y wireguard # 安装
# 生成客户端密钥
wg genkey | sudo tee /etc/wireguard/client.key
sudo cat /etc/wireguard/client.key | wg pubkey | \
sudo tee /etc/wireguard/client.pub # 导出公钥
# 创建客户端配置
sudo bash -c 'cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/client.key)
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <服务端公钥>
AllowedIPs = 0.0.0.0/0
Endpoint = <服务端公网IP>:51820
PersistentKeepalive = 25
EOF'
# ===== 回到服务端:添加客户端为 Peer =====
sudo wg set wg0 peer $(cat /path/to/client.pub) \
allowed-ips 10.0.0.2/32 # 动态添加客户端
# ===== 客户端连接 =====
sudo wg-quick up wg0 # 启动连接
sudo wg show # 验证连接状态
常见报错与解决
| 报错 | 原因 | 解决方案 |
|---|
RTNETLINK: Operation not supported | 内核未加载 WireGuard 模块 | sudo modprobe wireguard 或升级内核到 5.6+ |
Unable to access interface | 权限不足 | 使用 sudo 运行 |
Peer has no endpoint | 客户端配置缺少 Endpoint | 添加服务端的公网 IP:端口 |
Key is not the correct length | 密钥格式错误 | 重新用 wg genkey 生成 |
Address already in use | wg0 接口已存在 | 先 wg-quick down wg0 再重新启动 |
速查表
| 操作 | 命令 |
|---|
| 生成私钥 | wg genkey > private.key |
| 导出公钥 | cat private.key \| wg pubkey > public.key |
| 启动隧道 | sudo wg-quick up wg0 |
| 关闭隧道 | sudo wg-quick down wg0 |
| 查看状态 | sudo wg show |
| 开机自启 | sudo systemctl enable wg-quick@wg0 |
| 添加 Peer | sudo wg set wg0 peer <pubkey> allowed-ips <ip> |
| 删除 Peer | sudo wg set wg0 peer <pubkey> remove |
| 生成预共享密钥 | wg genpsk |