客户端 1.1.1
协议和 Windows 客户端里实际带有的 WireGuard 功能。
Cryptokey routing 是人们最先遇到的功能:一把公钥加上一份 AllowedIPs 列表。握手是 Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s,使用 Curve25519、ChaCha20-Poly1305 和 BLAKE2s。与本页对应的 Windows 构建是 1.1.1,日期为 2026年9月20日。
更新于 。
密码学只有一套构造
协议页列出一套固定组合。没有密码菜单。可选的预共享密钥会混入额外的对称秘密。没有该密钥时,构造使用 32 个零字节。握手的目标是完美前向保密、身份隐藏和重放保护,并且对未通过 mac1 检查的数据包不分配会话状态。
| 原语 | 作用 |
|---|---|
| ChaCha20-Poly1305 | 数据包的认证加密,采用 RFC 7539 构造。 |
| XChaCha20-Poly1305 | 协议要求随机 24 字节 nonce 时使用。 |
| Curve25519 | ECDH。公钥是 Curve25519 点。 |
| BLAKE2s | 哈希与带密钥的哈希,RFC 7693。 |
| SipHash24 | 哈希表密钥。 |
| HKDF | 密钥派生,RFC 5869。 |
| Noise_IKpsk2 | 握手模式。构造字符串:Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s。 |
白皮书称 Linux 实现不到 4,000 行,不含密码原语,因此一个人可以读完。后来对内核树的公开统计把 C 文件算进去,计入头文件后略高于这个数字。2020年3月29日发布的 Linux 5.6 带上了这条隧道。发布前的第三方审计没有报告漏洞,并补充了一条纵深防御说明。
Cryptokey routing
每个接口有一把私钥和一份对端列表。每个对端有一把公钥和 AllowedIPs。发送时,目的地址选定对端,数据包加密给该公钥,再由 UDP 送到对端的 Endpoint。接收时,数据包必须能为已知对端解密,而且内层源地址必须落在该对端的 AllowedIPs 里。否则就丢弃。
因此防火墙规则常常可以匹配「来自这个地址,在这个接口上」,并把数据包视为已经过认证。IPv4 和 IPv6 可以共用一个对端。常见示例监听端口是 51820。你的端口可以不同。
Windows 客户端,WireGuardNT
Windows 仓库把这个客户端描述为在 Windows 上运行 WireGuard 的官方方式。它使用 WireGuardNT。管理器服务 WireGuardManager 负责托盘界面。每个隧道是名为 WireGuardTunnel$ 加上配置名的独立服务。
导入接受 .conf 文件或 .zip。版本 1.1.1 会拒绝同一次导入中的重复名称。管理器监视配置文件夹,用 CryptProtectData 把新文件加密为 .conf.dpapi,限制为 Local System(本地系统),并删除明文副本。从界面导出时会把配置重新写出来。
某个对端的 AllowedIPs 为 0.0.0.0/0 或 ::/0 时,会启用 Block untunneled traffic(阻止未走隧道的流量)。/1 路由会跳过这种防火墙行为。编辑器里有对应的复选框。网络变得无声时的步骤
| 命令 | 作用 |
|---|---|
| wireguard /installtunnelservice path.conf | 创建 WireGuardTunnel$ 和配置名。 |
| wireguard /uninstalltunnelservice name | 移除该隧道服务。 |
| wireguard /installmanagerservice | 安装用于托盘界面的 WireGuardManager。 |
| wireguard /dumplog | 打印共享环形日志。加上 /tail 可跟随输出。 |
| wireguard /update | 运行更新程序。界面也可以做这件事。 |
| wireguard /removedriver | 在不再剩下隧道适配器时移除适配器驱动。 |
PreUp、PostUp、PreDown 和 PostDown 仅在允许它们的管理员注册表项已设置时运行。.conf.dpapi 文件需要 Local System 或管理员才能执行 wg show。
同一条隧道还能在哪里运行
| 系统 | 安装内容 | 说明 |
|---|---|---|
| Windows 10、11、Server 2016 至 2025 | MSI,或会去获取 MSI 的安装程序 | 客户端 1.1.1。amd64 与 x86 为 3.3 MB。arm64 为 2.9 MB。MIT。 |
| Linux | 自 5.6 起的内核模块,外加 wireguard-tools | 自 2020年3月29日起进入内核树。发行版打包这些工具。遵循内核构建的 GPL 条款。 |
| macOS | App Store 客户端,或来自 Homebrew、MacPorts 的 wireguard-tools | 工具这条路径是命令行隧道,不是 Windows MSI。 |
| Android 与 iOS | 商店应用。Android 另有直接的 APK。 | 手机可以导入二维码。Windows 客户端改为导入文件。 |
| FreeBSD, OpenBSD | 软件包 wireguard 或 wireguard-tools | 列在项目安装页上,与其他系统一起。 |
本站的文件是 Windows MSI。其他系统使用各自的软件包。Windows 的版本、大小和系统要求
漫游、保活、容器
双方都把数据发往产生已验证数据包的最新 Endpoint。笔记本可以更换网络,而不需要新配置。服务器从第一个有效数据包得知客户端的 Endpoint,因此服务器配置里常常没有该对端的 Endpoint 行。
PersistentKeepalive 默认为 0。仅当对端位于 NAT 或有状态防火墙之后,并且必须在流量安静后接受新会话时,才设为 25。具体改法
在 Linux 上,接口使用创建它时所在的网络命名空间。你可以把它移入容器命名空间,使该容器外出的唯一路径就是这条隧道。
[Interface]
PrivateKey = (stays on the machine that owns it)
Address = 10.10.10.2/32
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
Endpoint = 192.95.5.69:51820
PersistentKeepalive = 25
公开示例中的地址和公开示例公钥。不要复用该密钥。不需要时请不要写 PersistentKeepalive。