You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WireGuard VPN隧道发送加密UDP包?当前包未加密

问题:WireGuard隧道中发送的UDP包未加密及库方案需求

我用C语言编写了socket程序,通过sendto()方法从WireGuard客户端向服务器发送UDP包,服务器端采用C语言结合pcap的程序抓包。为使数据包通过WireGuard VPN隧道传输,客户端socket程序指定了隧道IP(10.6.0.1)和端口(51820)。

客户端与服务器配置详情

客户端wg0.conf文件

[Interface]
PrivateKey = <client’s private key>
Address = 10.6.0.2/24

PostUp = ip rule add table 200 from 192.168.30.211
PostUp = ip route add table 200 default via 192.168.30.1
PreDown = ip rule delete table 200 from 192.168.30.211
PreDown = ip route delete table 200 default via 192.168.30.1

[Peer]
PublicKey = servers’s public key
AllowedIPs = 10.6.0.1/24
Endpoint = 192.168.30.209:51820

服务器wg0.conf文件

[Interface]
PrivateKey = <server’s private key>
Address = 10.6.0.1/24
ListenPort = 51820
SaveConfig = true
PostUp = ufw route allow in on wg0 out on ens192
PostUp = iptables -t nat -I POSTROUTING -o ens192 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on ens192
PreDown = iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE

[Peer]
PublicKey = clients’s private key
AllowedIPs = 10.6.0.2/24

现象与核心问题

发送数据包时,通过Wireshark监听wg0接口,可见数据包在客户端和服务器端均通过隧道传输,但数据包未加密——Wireshark中可直接读取数据部分,协议显示为UDP而非WireGuard。


一、为何数据包经隧道传输却未加密?

WireGuard的加密触发逻辑是:当数据包的目标IP匹配Peer配置中的AllowedIPs规则时,内核态的WireGuard模块才会对数据包进行加密,并封装成WireGuard协议包发送。

你当前的做法是直接将socket的目标设为WireGuard服务器的隧道IP(10.6.0.1)和WireGuard服务的监听端口(51820),这相当于直接向WireGuard服务进程发送UDP包,而非让WireGuard转发你的应用层流量。这类数据包会直接通过wg0接口以明文UDP形式传输,不会触发WireGuard的加密流程。

二、可行解决方案及WireGuard库推荐

方案1:利用内核态WireGuard的自动转发(推荐)

无需修改C程序代码,只需调整WireGuard配置或路由规则,让应用流量触发WireGuard加密:

  • 调整客户端Peer的AllowedIPs:如果你的服务器应用监听在10.6.0.1的业务端口(比如1234),将AllowedIPs设为10.6.0.1/32或更精确的10.6.0.1:1234/32,也可设为0.0.0.0/0让所有流量走隧道(按需调整)。
  • 客户端socket程序直接发送目标为10.6.0.1的业务端口(而非51820),此时数据包会被WireGuard内核模块自动加密,封装成WireGuard包发送到服务器的51820端口;服务器端WireGuard解密后会将数据包转发到业务端口,你的pcap程序可监听业务端口或wg0接口的解密后流量。

方案2:用户态直接实现WireGuard加密发送

如果必须在用户态代码中直接处理加密逻辑,可选择以下途径:

  • WireGuard-go:官方提供的用户态WireGuard实现,原生为Go语言API,可通过Cgo封装为C语言调用接口,基于它可实现用户态的加密数据包发送逻辑,直接构建符合WireGuard协议的加密包发送到服务器端口。
  • 基于WireGuard协议规范手动实现:参考WireGuard官方协议文档,自行实现密钥交换、数据包加密封装的逻辑,但该方式复杂度高,仅适合有特殊定制需求的场景,不推荐普通场景使用。

你提到的embeddable-wg-library仅用于WireGuard接口的配置管理,不提供直接发送加密数据包的能力,因此无法满足你的需求。


内容的提问来源于stack exchange,提问作者Sanka Don

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:13:16