如何通过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
相关产品推荐
相关产品推荐

