先定义这次搭建的成功条件

用 A 表示被连接的主机,B 表示发起连接的主机。示例分配 A 为 10.77.0.1、B 为 10.77.0.2,隧道名为 wglab。先在两端检查现有接口和路由,确认该名称及地址没有被局域网、容器或其他 VPN 使用;有冲突就另选地址并同步修改后文全部对应项。

两端执行;只读检查,无需 sudo
ip -brief address
ip -4 route

A 的公网地址、UDP 端口和入站规则由你或管理员确认。下面的 198.51.100.10 是文档示例地址,51820 是示例端口,必须替换为实际值。若 A 在路由器后,还需由管理员配置对应 UDP 转发;仅有运营商共享地址而无可入站路径时,不能靠填写配置补出可达性。

安装工具,在每台主机本地生成密钥

两端 Ubuntu 执行;安装会改变本机软件包,需要 sudo
sudo apt update
sudo apt install wireguard

每台主机各生成一对密钥,不能把 A 的私钥复制给 B。下面在独立临时目录工作,权限只允许当前用户访问;记录末尾输出的目录路径,在本次验收结束前保留目录。不要将含私钥的文件或二维码放进群聊、在线校验器或截图。

两端各执行一次;输出的是工作目录路径,不是私钥
umask 077
WG_LAB_DIR=$(mktemp -d)
cd "$WG_LAB_DIR" || exit 1
wg genkey > private.key
wg pubkey < private.key > public.key
printf "%s\n" "$WG_LAB_DIR"

通过已经确认身份的渠道交换 public.key 的内容。private.key 只用于填写本机配置。不要照搬网上演示用的公私钥;也不要反复运行生成命令覆盖一对正在使用的密钥。临时目录可能被系统清理,本例只适合短时验收,后续长期部署需另行妥善保存配置。

分别创建配置,不加入默认路由

在各自工作目录用本地编辑器新建 wglab.conf,替换尖括号占位内容,保持文件权限为 600。这里的 PrivateKey 是本机私钥,Peer PublicKey 是对端公钥。B 的 Endpoint 指向 A 可达的外部地址,而不是隧道尚未建立时的 10.77.0.1。

A 的 wglab.conf;填写 A 私钥和 B 公钥
[Interface]
PrivateKey = <A_PRIVATE_KEY>
Address = 10.77.0.1/32
ListenPort = 51820

[Peer]
PublicKey = <B_PUBLIC_KEY>
AllowedIPs = 10.77.0.2/32
B 的 wglab.conf;填写 B 私钥、A 公钥及 A 的实际端点
[Interface]
PrivateKey = <B_PRIVATE_KEY>
Address = 10.77.0.2/32

[Peer]
PublicKey = <A_PUBLIC_KEY>
Endpoint = 198.51.100.10:51820
AllowedIPs = 10.77.0.1/32

AllowedIPs 在此只包含对端隧道地址,wg-quick 据此添加所需路由。这一小范围配置便于判断两端是否真正通信,不需要照抄 eth0 的 NAT 规则或打开内核转发。把它扩大成 0.0.0.0/0 或 ::/0 会改变目的流量的路径,必须先完成相应转发、返回路由及 IPv6 设计。

启动后,用一次真实流量触发验证

先 A 后 B,在各自工作目录执行;会创建接口及对应路由
chmod 600 wglab.conf
sudo wg-quick up ./wglab.conf
仅 B 执行;ping 有限发送 3 次,不需要 sudo
ip -4 route get 10.77.0.1
ping -c 3 10.77.0.1

路由应指向 wglab。再在两端查看握手与收发计数;在主动测试后出现握手且双方计数增加,是隧道通信的重要证据。如果 A 不允许 ICMP,ping 无回复不单独证明隧道失败,应改测 A 上已获允许的服务。没有握手时先查端点、公钥和 UDP 入站规则,不关闭整个防火墙。

两端只读查看状态;这些字段不输出私钥,但包含 Peer 标识
sudo wg show wglab latest-handshakes
sudo wg show wglab transfer

正常结束实验,再决定长期部署范围

两端在各自工作目录执行;会中断本例隧道并删除其路由
sudo wg-quick down ./wglab.conf

关闭前确认管理会话没有依赖这条隧道,保留原来的 SSH 或控制台通道。之后检查接口已消失、原网络仍正常,并撤销仅为本次实验增加的入站规则。失败时保留错误原文和脱敏后的配置字段;不要把“接口启动成功”写成“已经具备全局 VPN 出口”。长期部署还需要持久配置、密钥管理和独立的联网验收。