NoctisNode
← 指南网络2026-10-238 分钟

VPS 上的 WireGuard PersistentKeepalive 25 与 PresharedKey

PersistentKeepalive = 25 每 25 秒发送一次保活包,让 NAT 保持隧道开放;应在 NAT 后的客户端上设置。PresharedKey 增加一层对称密钥,作为抗量子的防护。

简答:`PersistentKeepalive = 25` 让 WireGuard 每 25 秒向对端发送一个极小的已认证数据包,以保持 NAT 和有状态防火墙的映射,使另一端仍能访问到你。通常只需在位于 NAT 之后的一端(笔记本、手机或家用路由器)设置,而不是在拥有公网 IP 的 VPS 上设置。`PresharedKey` 是每对对端之间可选的额外 256 位对称密钥,用 `wg genpsk` 生成,混入握手过程中,用于防范未来针对 Curve25519 的量子攻击。

本指南解释这两个选项,并为 WireGuard VPS 提供一份可用的服务器端和客户端配置。包含 NAT 和 DNS 的完整 VPN 配置,请参阅 WireGuard VPN 指南。

PersistentKeepalive = 25 到底做了什么

WireGuard 的设计是安静的:没有数据流动时,它什么都不发送。这对隐私和电池续航都有好处,但执行 NAT 和连接跟踪的路由器会丢弃空闲的 UDP 映射,通常在 30 秒后,有时在几分钟后。一旦映射消失,来自服务器的数据包就无法再到达 NAT 后的客户端,直到客户端再次发送数据。

`PersistentKeepalive` 是以秒为单位的间隔。设为 `25` 时,只要对端 25 秒内没有发送任何数据,就会发送一个空的加密保活包。25 是 WireGuard 文档推荐的值,因为它稳稳低于最短的常见 UDP 超时时间。该设置默认关闭(`0`),开销是每个对端大约每 25 秒一个小数据包。

取值效果适用场景
0 或不设置不发送保活包;空闲时隧道保持静默双方都有公网 IP,或客户端总是主动发起流量
25空闲每 25 秒发送一次保活包位于 NAT 或 CGNAT 之后且必须保持可达的客户端
15–20更频繁的保活包UDP 超时异常激进的网络
60+数据包更少,映射丢失风险更高很少有用;大多数 NAT 设备超时更早

哪一端需要 PersistentKeepalive

在无法被直接访问的一端(即 NAT 之后的那一端)设置保活。该端向外发送数据包,刷新自己的 NAT 映射。拥有公网 IPv4 地址的 VPS 前面没有 NAT,因此不需要该选项也能保持可达;而且它自己也无法让远端的 NAT 保持开放,因为它只能从客户端的数据包中得知客户端的端点。

如果客户端只是通过隧道浏览网页,它在发送流量时会立即重新连接,所以保活是可选的。当服务器或其他对端必须主动连接客户端时,你才需要它,例如 SSH 登录家里的机器、监控或站点到站点的链路。

  • ▹NAT 后的笔记本或手机连接 VPS:只在客户端设置 `PersistentKeepalive = 25`。
  • ▹VPS 到 VPS,双方都有公网 IP:通常不设置;参见 [WireGuard 网状网络指南](/guides/wireguard-mesh-vps-cluster)。
  • ▹位于 CGNAT 后、通过 VPS 对外暴露的家庭服务器:在家庭服务器上设置,否则 VPS 会在几分钟内失去通路。
  • ▹移动客户端:保活会消耗一些电量;只有设备必须保持可达时才启用。

PresharedKey:可选的对称密钥层

WireGuard 的握手使用 Curve25519 密钥交换。理论上,足够强大的量子计算机可以破解这种交换,而攻击者可能现在记录流量、日后再解密。`PresharedKey` 会在握手中混入一个额外的 256 位对称密钥。这种长度的对称密钥被认为无法被已知的量子算法实际破解,因此只要 PSK 保密,即使公钥部分被攻破,记录下来的流量依然受到保护。

PSK 按对端对设置,在双方的 `[Peer]` 段中必须完全一致,并且每一对都应唯一。它不会取代私钥,而是额外的一层。如果 PSK 不匹配,握手会静默失败,你在 `wg show` 中看不到 `latest handshake`。

  • ▹用 `wg genpsk` 生成,它会输出一个随机的 base64 编码 32 字节密钥。
  • ▹通过你已信任的通道(如 SSH)传输,绝不要通过聊天或邮件。
  • ▹每对使用一个 PSK:在五个节点的网状网络中,就是十个不同的 PSK。
  • ▹像其他机密一样,在设备丢失或退役时轮换它。

生成密钥和 PresharedKey

在 Debian 12/13 或 Ubuntu 24.04 上用 `apt install wireguard` 安装工具,然后在每个私钥将要存放的机器上生成密钥。PSK 可以在任意一端生成并复制到另一端。`umask 077` 确保这些文件只有 root 可读。

umask 077
cd /etc/wireguard

# on the VPS
wg genkey | tee server.key | wg pubkey > server.pub

# on the client
wg genkey | tee client.key | wg pubkey > client.pub

# once, on either side; copy to the other over SSH
wg genpsk > client.psk

VPS 上的服务器配置:/etc/wireguard/wg0.conf

服务器有固定的监听端口,不设置保活,也不为客户端设置 `Endpoint`,因为它会从已认证的数据包中得知客户端的当前地址。

[Interface]
Address = 10.8.0.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = <contents of server.key>

[Peer]
# laptop
PublicKey = <contents of client.pub>
PresharedKey = <contents of client.psk>
AllowedIPs = 10.8.0.2/32, fd08::2/128

Note · 在 VPS 防火墙中开放 UDP 51820,并用 `systemctl enable --now wg-quick@wg0` 启动隧道。在暴露任何其他服务之前,按照 SSH 加固指南锁定 SSH,并用 StrictModes 指南检查密钥权限。

NAT 后的客户端配置

客户端指向 VPS 的公网地址并设置保活。仅用于私有隧道时使用 `AllowedIPs = 10.8.0.0/24, fd08::/64`,若要让所有流量都经过 VPS,则使用 `0.0.0.0/0, ::/0`。

[Interface]
Address = 10.8.0.2/32, fd08::2/128
PrivateKey = <contents of client.key>

[Peer]
PublicKey = <contents of server.pub>
PresharedKey = <contents of client.psk>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24, fd08::/64
PersistentKeepalive = 25

Note · 一台带独立 IPv4 的 NoctisNode Wisp VPS(1 vCPU、1 GB 内存,$6 / 28 天周期)足以作为个人 WireGuard 端点,可用门罗币或其他加密货币付款,注册只需邮箱和密码。

验证与故障排查

在两端运行 `wg show`。健康的客户端会显示最近的 `latest handshake`、`persistent keepalive: every 25 seconds`,以及该对端的 `preshared key: (hidden)`。

  1. 01.完全没有握手:检查 VPS 上的 UDP 51820 是否开放,以及 `Endpoint` 的 IP 和端口是否正确。
  2. 02.不带 PSK 能握手,带 PSK 则不行:两份配置中的 PresharedKey 不一致;请重新复制。
  3. 03.隧道正常,但一分钟后服务器无法访问客户端:在客户端添加 `PersistentKeepalive = 25`。
  4. 04.不重启即可修改保活:`wg set wg0 peer <server-public-key> persistent-keepalive 25`。
  5. 05.运行时从文件添加 PSK:`wg set wg0 peer <public-key> preshared-key /etc/wireguard/client.psk`。

常见问题

QWireGuard 中的 PersistentKeepalive 25 是什么意思?

A它让对端在 25 秒没有其他流量后发送一个加密的保活包。这能保持 NAT 和防火墙映射开放,使隧道始终能从另一端访问。

QPersistentKeepalive 应该设置在服务器端还是客户端?

A设置在 NAT 之后的一端,几乎总是客户端。拥有公网 IP 的 VPS 不需要它,也无法单靠自己让客户端的 NAT 映射保持开放。

QWireGuard PresharedKey 是必需的吗?

A不是,它是可选的。它在握手中加入一个对称密钥,用于防范未来针对 Curve25519 的量子攻击,因此对长期使用的隧道来说是一个不错的默认选择。

Q如何生成 WireGuard PresharedKey?

A运行 `wg genpsk > peer.psk`,并把同一个值填入双方 `[Peer]` 段的 `PresharedKey` 行。每对对端使用不同的 PSK。

QPersistentKeepalive 会占用很多带宽吗?

A不会。它在空闲时大约每 25 秒发送一个小数据包,在 VPS 上可以忽略不计,不过在手机上可能会略微缩短电池续航。

VPS 上的 WireGuard PersistentKeepalive 25 与 PresharedKey · NoctisNode