WireGuard 深度解析:从协议原理到生产实践

0 阅读15分钟

摘要:WireGuard 是新一代开源 VPN 协议,由 Jason A. Donenfeld 设计,凭借极简的代码(约 4000 行)、内核级性能和现代密码学,已成为新一代 VPN 的首选方案。本文将从 WireGuard 协议架构、Noise 握手机制、加密算法等维度进行深度解析,并提供完整的 Linux 生产环境配置实践。

关键词:WireGuard、VPN、Noise Protocol、Curve25519、ChaCha20-Poly1305


一、WireGuard 概述

1.1 什么是 WireGuard?

WireGuard 是由 Jason A. Donenfeld 设计的下一代开源 VPN 协议,2016 年首次公开,2020 年正式合入 Linux 5.6 内核。其核心目标是简单、快速、安全。

核心特性:

  • 🚀 极致性能:内核空间实现,吞吐量是 OpenVPN 的 3-5 倍
  • 📝 代码极简:核心代码约 4000 行(OpenVPN 核心约 10 万+ 行)
  • 🔐 现代密码学:Curve25519、ChaCha20-Poly1305、BLAKE2s、SipHash24
  • 🌍 跨平台:Linux、Windows、macOS、iOS、Android、FreeBSD、OpenBSD
  • 🔄 漫游友好:支持网络切换(4G ↔ WiFi)不掉线
  • 快速握手:1-RTT 握手,毫秒级建连

1.2 WireGuard vs OpenVPN vs IPSec

特性WireGuardOpenVPNIPSec
协议层级内核空间应用层(用户空间)内核空间
代码规模~4K 行~100K+ 行~500K 行
加密基础Noise ProtocolSSL/TLSIKEv2
默认加密ChaCha20-Poly1305AES-256-GCMAES-256-GCM
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
配置复杂度⭐⭐⭐⭐⭐⭐⭐⭐⭐
漫游支持⚠️⚠️
审计状态✅ 已审计✅ 多次审计✅ 广泛验证
典型应用新一代 VPN远程接入站点互联

1.3 应用场景

场景类型典型应用WireGuard 优势
远程办公员工访问内网配置简单、客户端轻量
站点互联多机房组网高吞吐量、低延迟
容器网络K8s 跨节点通信内核态、性能优异
移动接入4G/WiFi 漫游快速重连、状态保持
隐私保护匿名上网现代密码学、开源透明

二、WireGuard 协议架构

2.1 协议栈位置

图1:WireGuard 协议栈架构

WireGuard 工作在 内核空间,作为虚拟网络设备暴露给用户空间。这与 OpenVPN(用户空间)不同,避免了频繁的上下文切换,性能更优。

2.2 核心设计原则

原则 1:Cryptokey Routing(密钥路由)

WireGuard 抛弃了传统 VPN 的"账号密码 + 证书"模式,改用公钥即身份的设计:

  • 每个对等体(Peer)拥有一对 Curve25519 密钥
  • 公钥唯一标识对等体身份
  • 路由表关联:公钥 ↔ AllowedIPs
Peer A 公钥: abc123... → AllowedIPs: 10.0.0.2/32, 192.168.1.0/24
Peer B 公钥: def456... → AllowedIPs: 10.0.0.3/32, 192.168.2.0/24

原则 2:极简协议设计

  • 只支持 UDP(无 TCP 模式)
  • 固定加密算法(无算法协商)
  • 无连接状态机(仅记录握手时间戳)
  • 无心跳机制(仅可选 PersistentKeepalive)

2.3 加密算法选型

WireGuard 采用 Noise Protocol Framework(具体为 Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s)作为握手协议:

用途算法
密钥交换Curve25519(ECDH)
对称加密ChaCha20-Poly1305(AEAD)
哈希函数BLAKE2s
哈希表查找SipHash24
HKDFHKDF-BLAKE2s

为什么不用 AES?

  • ChaCha20 在无 AES-NI 硬件加速的设备(如手机、路由器)上更快
  • 抗时序攻击能力更强
  • 实现更简单、更安全

三、WireGuard 握手流程

3.1 1-RTT 握手时序

图2:WireGuard 握手时序

WireGuard 使用 Noise_IKpsk2 框架,仅需 1 个 RTT 完成握手:

步骤 1:Initiator → Responder(Handshake Initiation,148 字节)

- Type: 0x01(Initiation)
- Sender Index: 4 字节
- Ephemeral Public Key: 32 字节(临时公钥)
- Static Public Key (encrypted): 32 字节 + 16 字节 Tag
- Timestamp (encrypted): 12 字节 + 16 字节 Tag
- MAC1: 16 字节
- MAC2: 16 字节(DoS 防护)

步骤 2:Responder → Initiator(Handshake Response,92 字节)

- Type: 0x02(Response)
- Sender Index: 4 字节
- Receiver Index: 4 字节
- Ephemeral Public Key: 32 字节
- Empty (encrypted): 0 字节 + 16 字节 Tag
- MAC1: 16 字节
- MAC2: 16 字节

步骤 3:Initiator → Responder(Encrypted Data)

握手完成后立即可以发送加密数据。

3.2 握手安全特性

  • 完美前向保密(PFS):每次握手生成新的临时密钥
  • 抗密钥泄露:长期私钥泄露不影响历史会话
  • 抗重放攻击:基于时间戳 + Nonce
  • DoS 防护:MAC2 + Cookie 机制
  • 身份隐藏:双方静态公钥都在密文中传输
  • 可选预共享密钥(PSK):抗量子计算威胁

3.3 握手触发时机

WireGuard 不主动维护连接,握手仅在以下情况发生:

触发条件说明
首次发送数据连接初始化
密钥过期默认 120 秒重新握手
数据包数量超限单密钥最多 2^60 个包
接收到重协商请求对端要求重协商

四、WireGuard 数据包格式

4.1 数据包结构

图3:WireGuard 数据包格式

WireGuard 数据包封装在 UDP 中,结构极简:

+-------------------+---------+
| Field             | Bytes   |
+-------------------+---------+
| Type              | 1       |  // 0x04 = Data
| Reserved          | 3       |
| Receiver Index    | 4       |
| Counter (Nonce)   | 8       |
| Encrypted Payload | 可变    |
| Auth Tag          | 16      |  // Poly1305
+-------------------+---------+

总开销(WireGuard 头 + 认证标签):32 字节 + UDP 头(8 字节)+ 外层 IP 头(IPv4: 20 / IPv6: 40 字节)

  • IPv4:60 字节固定开销
  • IPv6:80 字节固定开销

4.2 消息类型

Type名称用途
0x01Handshake Initiation握手发起
0x02Handshake Response握手响应
0x03Cookie ReplyDoS 防护 Cookie
0x04Transport Data数据传输

4.3 Counter 机制

  • 64 位单调递增计数器
  • 用作 ChaCha20-Poly1305 的 Nonce
  • 防重放:接收方使用滑动位图窗口(Linux 内核实现 COUNTER_BITS_TOTAL = 8192 比特,约可乱序接收 8192 个数据包)
  • 计数器溢出前必须重新握手(实际不可能达到)

五、生产环境配置实践

5.1 远程接入拓扑

图4:WireGuard 远程接入拓扑

5.2 环境信息

角色公网 IP内网网段WireGuard IP主机名
服务器1.2.3.4192.168.1.0/2410.0.0.1/24wg-server
客户端 1动态-10.0.0.2/32wg-client-1
客户端 2动态-10.0.0.3/32wg-client-2

5.3 【服务器端】配置步骤

步骤 1:安装 WireGuard

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y wireguard wireguard-tools

# CentOS/RHEL 8+
sudo dnf install -y wireguard-tools

# Arch Linux
sudo pacman -S wireguard-tools

# 验证内核模块(Linux 5.6+ 自带)
sudo modprobe wireguard
lsmod | grep wireguard

步骤 2:生成密钥对

# 设置严格的文件权限
umask 077

# 创建配置目录
sudo mkdir -p /etc/wireguard
cd /etc/wireguard

# 生成服务器密钥对
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key

# 生成预共享密钥(可选,增加安全性)
wg genpsk | sudo tee preshared.key

# 查看密钥
sudo cat server_private.key
sudo cat server_public.key

步骤 3:配置 WireGuard 服务器

# /etc/wireguard/wg0.conf
[Interface]
# 服务器隧道 IP
Address = 10.0.0.1/24
# 监听 UDP 端口
ListenPort = 51820
# 服务器私钥
PrivateKey = <服务器私钥>
# MTU 设置(推荐 1420)
MTU = 1420

# 启动后执行:启用 NAT
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

# 关闭后执行:清理 NAT
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

# === 客户端 1 ===
[Peer]
PublicKey = <客户端 1 公钥>
PresharedKey = <预共享密钥>
AllowedIPs = 10.0.0.2/32

# === 客户端 2 ===
[Peer]
PublicKey = <客户端 2 公钥>
PresharedKey = <预共享密钥>
AllowedIPs = 10.0.0.3/32

步骤 4:启用 IP 转发

# 启用 IPv4 转发
sudo sysctl -w net.ipv4.ip_forward=1

# 持久化
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

步骤 5:配置防火墙

# UFW(Ubuntu)
sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable

# firewalld(CentOS)
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload

# 直接使用 iptables
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT

步骤 6:启动 WireGuard

# 启动接口
sudo wg-quick up wg0

# 设置开机自启
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

# 查看状态
sudo wg show
sudo wg-quick status wg0

# 查看接口
ip addr show wg0

5.4 【客户端】配置步骤

步骤 1:生成客户端密钥对

# 在客户端执行
umask 077
cd /etc/wireguard

# 生成密钥对
wg genkey | sudo tee client_private.key | wg pubkey | sudo tee client_public.key

# 查看公钥(添加到服务器配置)
sudo cat client_public.key

步骤 2:配置客户端

# /etc/wireguard/wg0.conf(客户端 1)
[Interface]
# 客户端隧道 IP
Address = 10.0.0.2/32
# 客户端私钥
PrivateKey = <客户端 1 私钥>
# DNS(可选,避免 DNS 泄露)
DNS = 1.1.1.1, 8.8.8.8
# MTU 设置
MTU = 1420

[Peer]
# 服务器公钥
PublicKey = <服务器公钥>
PresharedKey = <预共享密钥>
# 服务器公网地址
Endpoint = 1.2.3.4:51820
# 路由配置:仅访问内网(推荐)
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
# 全流量通过 VPN(可选)
# AllowedIPs = 0.0.0.0/0, ::/0
# NAT 保活(NAT 环境必须)
PersistentKeepalive = 25

步骤 3:启动客户端

# 启动 WireGuard
sudo wg-quick up wg0

# 设置开机自启
sudo systemctl enable wg-quick@wg0

# 验证连接
sudo wg show
ping 10.0.0.1
ping 192.168.1.1

# 查看路由
ip route show

# 查看接口
ip addr show wg0

5.5 站点互联(Site-to-Site)配置

图5:WireGuard 站点互联拓扑

站点 A 配置

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/30
ListenPort = 51820
PrivateKey = <站点 A 私钥>

PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <站点 B 公钥>
PresharedKey = <预共享密钥>
Endpoint = 2.2.2.2:51820
# 站点 B 的隧道 IP + 内网网段
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24
PersistentKeepalive = 25

站点 B 配置

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2/30
ListenPort = 51820
PrivateKey = <站点 B 私钥>

PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <站点 A 公钥>
PresharedKey = <预共享密钥>
Endpoint = 1.1.1.1:51820
# 站点 A 的隧道 IP + 内网网段
AllowedIPs = 10.0.0.1/32, 192.168.1.0/24
PersistentKeepalive = 25

六、性能优化建议

6.1 MTU 优化

图6:WireGuard MTU 开销计算

WireGuard 数据包开销分析:

WireGuard 头部 + Poly1305 认证标签 = 16 + 16 = 32 字节
+ UDP 头 = 8 字节
+ 外层 IP 头 = 20 字节(IPv4)或 40 字节(IPv6)

总开销:
  IPv4:32 + 8 + 20 = 60 字节
  IPv6:32 + 8 + 40 = 80 字节

理论最大 MTU:
  IPv4:1500 - 60 = 1440
  IPv6:1500 - 80 = 1420

推荐 MTU = 1420(同时兼容 IPv4/IPv6 链路,留出余量)
# 设置 MTU
[Interface]
MTU = 1420

# 或运行时调整
sudo ip link set wg0 mtu 1420

# 测试 MTU(不分片探测路径 MTU)
ping -M do -s 1392 10.0.0.1   # 1392 + 28(ICMP+IP) = 1420
ping -M do -s 1372 10.0.0.1   # 极端 IPv6 双栈场景测试

:WireGuard 默认 MTU 1420 是为 IPv4 over IPv6 双栈场景预留余量;如确定纯 IPv4 链路,可使用 1440。

6.2 多核优化

# 启用接收端缩放(RSS)
sudo ethtool -L eth0 combined 8

# 启用 RPS(接收数据包导向)
echo ff > /sys/class/net/wg0/queues/rx-0/rps_cpus

# 启用 XPS(发送数据包导向)
echo ff > /sys/class/net/wg0/queues/tx-0/xps_cpus

# 调整内核参数
sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.wmem_max=26214400

6.3 路由优化

# 仅路由特定网段(避免影响互联网流量)
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24

# 全流量 VPN(隐私保护场景)
AllowedIPs = 0.0.0.0/0, ::/0

# 使用策略路由(高级场景)
ip rule add from 192.168.1.0/24 table 100
ip route add default via 10.0.0.1 dev wg0 table 100

6.4 PersistentKeepalive 调优

# NAT 环境必须启用(默认 NAT 超时 30 秒)
PersistentKeepalive = 25

# 高频心跳(实时性要求高)
PersistentKeepalive = 10

# 低频心跳(节省流量)
PersistentKeepalive = 60

七、故障排查

7.1 常见故障及解决方案

故障 1:握手成功但无法 ping 通

可能原因:

  • AllowedIPs 配置错误
  • 防火墙阻止数据包
  • IP 转发未启用

排查步骤:

# 1. 检查接口状态
sudo wg show
# 检查 latest handshake 是否近期

# 2. 检查路由
ip route show | grep wg0

# 3. 检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward  # 应为 1

# 4. 检查防火墙
sudo iptables -L FORWARD -n -v
sudo iptables -t nat -L POSTROUTING -n -v

# 5. 抓包验证
sudo tcpdump -i wg0 -n
sudo tcpdump -i eth0 -n udp port 51820

故障 2:握手超时

可能原因:

  • 公钥/私钥不匹配
  • Endpoint 不可达
  • 防火墙阻止 UDP 51820

排查步骤:

# 1. 验证密钥配对
# 服务器端的 [Peer] PublicKey 必须等于客户端的公钥
# 客户端的 [Peer] PublicKey 必须等于服务器的公钥

# 2. 测试 UDP 连通性
nc -u 1.2.3.4 51820

# 3. 检查防火墙
sudo iptables -L INPUT -n | grep 51820

# 4. 查看日志
sudo dmesg | grep wireguard
sudo journalctl -u wg-quick@wg0

故障 3:连接频繁断开

可能原因:

  • NAT 超时
  • 网络不稳定
  • MTU 过大导致分片

解决方案:

# 1. 启用 PersistentKeepalive
PersistentKeepalive = 25

# 2. 降低 MTU
MTU = 1380

# 3. 检查丢包率
ping -i 0.2 -c 100 10.0.0.1

7.2 诊断命令汇总

# ==================== 状态查看 ====================
sudo wg show                  # 显示所有接口状态
sudo wg show wg0              # 显示指定接口
sudo wg show wg0 dump         # 详细信息(机器可读)
sudo wg-quick status wg0      # 接口运行状态

# ==================== 接口管理 ====================
sudo wg-quick up wg0          # 启动接口
sudo wg-quick down wg0        # 关闭接口
sudo wg-quick save wg0        # 保存运行时配置

# ==================== 实时调试 ====================
# 启用内核调试日志
echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control

# 查看调试日志
sudo dmesg -w | grep wireguard

# 关闭调试日志
echo module wireguard -p | sudo tee /sys/kernel/debug/dynamic_debug/control

# ==================== 性能测试 ====================
# 带宽测试
iperf3 -c 10.0.0.1 -t 60

# 延迟测试
ping -c 100 10.0.0.1

# MTU 测试
ping -M do -s 1392 10.0.0.1

八、安全加固建议

8.1 密钥管理

# 严格的文件权限
sudo chmod 600 /etc/wireguard/*.key
sudo chmod 600 /etc/wireguard/wg0.conf

# 定期轮换密钥(建议每年)
wg genkey | tee new_private.key | wg pubkey > new_public.key

# 使用预共享密钥(PSK)抗量子计算
wg genpsk > preshared.key

8.2 访问控制

# 限制每个对等体的 AllowedIPs
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.0.0.2/32  # 仅允许特定 IP

# 配合 iptables 实现细粒度控制
sudo iptables -A FORWARD -i wg0 -s 10.0.0.2 -d 192.168.1.10 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -s 10.0.0.2 -j DROP

8.3 防止 DoS 攻击

# 限制 UDP 连接速率
sudo iptables -A INPUT -p udp --dport 51820 \
    -m limit --limit 10/second --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 51820 -j DROP

# 限制连接数
sudo iptables -A INPUT -p udp --dport 51820 \
    -m connlimit --connlimit-above 100 -j REJECT

8.4 监控与审计

# 监控对等体连接
watch -n 1 'sudo wg show'

# 监控流量
sudo iftop -i wg0

# 流量统计
sudo wg show wg0 transfer

# 审计日志
sudo journalctl -u wg-quick@wg0 --since "1 hour ago"

九、高级应用场景

9.1 多客户端动态接入(wg-easy)

# 使用 Docker 部署 wg-easy
docker run -d \
  --name=wg-easy \
  -e WG_HOST=1.2.3.4 \
  -e PASSWORD=admin123 \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  --restart unless-stopped \
  weejewel/wg-easy

# 访问 Web 管理界面
# http://1.2.3.4:51821

9.2 与 Kubernetes 集成

# WireGuard CNI 插件示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: wireguard-cni
  namespace: kube-system
data:
  cni-config: |
    {
      "cniVersion": "0.3.1",
      "name": "wireguard",
      "type": "wireguard",
      "ipam": {
        "type": "host-local",
        "subnet": "10.0.0.0/16"
      }
    }

9.3 Mesh 组网(wg-meshconf)

# 安装 wg-meshconf
pip install wg-meshconf

# 初始化配置
wg-meshconf init mesh.yaml

# 添加节点
wg-meshconf addpeer mesh.yaml --name nodeA --address 10.0.0.1/24 --endpoint 1.1.1.1:51820
wg-meshconf addpeer mesh.yaml --name nodeB --address 10.0.0.2/24 --endpoint 2.2.2.2:51820
wg-meshconf addpeer mesh.yaml --name nodeC --address 10.0.0.3/24 --endpoint 3.3.3.3:51820

# 生成全 Mesh 配置
wg-meshconf genconfig mesh.yaml

十、常见问题 FAQ

Q1: WireGuard 为什么这么快?

原因:

  1. 内核空间实现:避免用户态 - 内核态切换
  2. 极简协议:无算法协商、无状态机
  3. 现代密码学:ChaCha20 比 AES 在通用 CPU 上更快
  4. 多线程友好:每个 CPU 核心独立处理数据包

Q2: WireGuard 支持 TCP 吗?

不支持。WireGuard 仅支持 UDP,理由:

  • TCP over TCP 性能差(TCP 风暴)
  • UDP 更适合实时通信
  • 如需穿透防火墙,可使用 udp2raw 等工具伪装

Q3: 如何处理动态 IP?

# 方案 1:使用 DDNS
[Peer]
Endpoint = vpn.example.com:51820

# 方案 2:客户端主动连接(不指定 Endpoint)
# 服务器配置中省略 Endpoint,等待客户端连接

# 方案 3:定期更新 Endpoint
# 编写脚本通过 wg set 命令更新
wg set wg0 peer <PublicKey> endpoint <new_ip>:51820

Q4: WireGuard 还是 OpenVPN?

场景推荐
新建项目WireGuard
高性能需求WireGuard
移动办公WireGuard
严格防火墙环境OpenVPN(TCP 443)
复杂认证(LDAP/2FA)OpenVPN
老旧系统兼容OpenVPN

Q5: 如何实现高可用?

# 方案 1:多服务器 + DNS 轮询
[Peer]
Endpoint = vpn-pool.example.com:51820

# 方案 2:Keepalived + VIP
# 主备切换,VIP 漂移

# 方案 3:BGP + ECMP
# 多条等价 WireGuard 隧道,BGP 路由收敛

十一、总结

WireGuard 凭借极简设计和现代密码学,已成为新一代 VPN 协议的标杆。

核心要点回顾:

  1. 极致性能:内核空间实现,吞吐量是 OpenVPN 的 3-5 倍
  2. 极简协议:约 4000 行代码,安全审计成本低
  3. 现代密码学:Noise Protocol、Curve25519、ChaCha20-Poly1305
  4. 快速握手:1-RTT 完成连接建立
  5. 漫游友好:支持网络切换不掉线

适用场景:

  • ✅ 高性能 VPN 部署
  • ✅ 移动办公和远程接入
  • ✅ 站点互联和混合云组网
  • ✅ 容器和 Kubernetes 网络
  • ⚠️ 严格防火墙环境(仅支持 UDP)
  • ⚠️ 复杂认证场景(需配合外部认证)

随着 Linux 5.6+ 内核原生集成和各大云厂商支持,WireGuard 正在快速取代 OpenVPN 成为 VPN 领域的事实标准。


参考文献

  1. WireGuard White Paper
  2. WireGuard Official Documentation
  3. Noise Protocol Framework
  4. RFC 7539 - ChaCha20 and Poly1305 for IETF Protocols
  5. RFC 7748 - Elliptic Curves for Security (Curve25519)
  6. WireGuard Linux Kernel Documentation