点对点连接:WireGuard 可用于在两台设备之间建立一个加密的网络隧道,所有传输的数据都通过这个隧道进行,适用于需要直接安全通信的场景。
- 局域网环境下:在局域网内的两台设备上部署 wireguard 节点,这两台设备之间的通信数据全部走 WireGuard VPN 隧道
- 公网环境下:在公网服务器和本地 Windows 计算机上部署 wireguard 节点,通过公网服务器将所有 IP 流量从本地 Windows 计算机路由到 Internet
前置准备
查看系统内核版本,若低于5.6
版本则需要对内核进行升级:
|
|
检查局域网内两台设备是否能互相 ping 通
安装
ubuntu
|
|
windows
在官网下载windows客户端
配置
ubuntu
- 生成密钥对
WireGuard VPN 网络中的每个设备都需要有一个私钥和公钥
在/etc
下创建文件夹WireGuard
,用于存放配置文件
|
|
tee
:将输出同时写入文件和标准输出(屏幕)>
:将输出重定向到文件中|
:管道,将前一个命令的输出传递给另一个命令作为输入
- 创建配置文件
wg0.conf
|
|
windows
打开安装的 wireguard 软件,新建空隧道
|
|
- 可选是否拦截未经通道的流量
启动
ubuntu
- 使用配置文件启动
|
|
该命令将隧道名称
wg0
映射到/etc/wireguard/wg0.conf
配置文件。这种命名方法意味着可以创建任意数量的单独 VPN 隧道。例如,可以有一个隧道设备,名称为
prod
,其配置文件为/etc/wireguard/prod.conf
。 每个隧道配置可以包含不同的 IPv4、IPv6 和客户端防火墙设置。 通过这种方式,可以支持多个不同的对等连接,每个连接都有自己唯一的 IP 地址和路由规则
|
|
- 若未启动成功,查看日志,若报错
/usr/bin/wg-quick: line 32: resolvconf: command not found
,执行命令
|
|
windows
点击连接即可
验证连接
- 检查连接:可以看到有流量产生
|
|
|
|
- 验证接口状态:
|
|
|
|
- 互相 ping
|
|
- 检查两端都能连接到Internet,说明只有到对端的流量走隧道
- 关闭
wg0
接口
|
|
流量抓包
- 在
windows
上安装wireshark,安装时选择包含sshdump
功能 - 修改
ubuntu
的tcpdump
权限,所有用户可使用
|
|
- 在
windows
上使用wireshark
的sshdump
连接到虚拟机开启抓包 - 两端连接后,用 ubuntu
ping
windows,抓到的握手和密文数据包
ubuntu
中启动一个http
服务,在windows
上通过隧道ip地址:http服务的端口号
(10.8.0.1:8080
)访问该web
服务,抓包可以看到传输数据已被加密
流量分析
windows
客户端发送的流量走向

- 应用层程序
chrome
创建网络包,并发送给对应的socket
; - 通过对应的
socket
,该网络包到达了内核协议栈,在网络协议栈会判断路由,通过路由把流量发到wg0
网卡; - 到达
wg0
网卡的包,会通过字符驱动直接发送给应用层程序wireguard
; wireguard
通过原始IP
包的src ip
(10.0.8.1
),在加密密钥路由表(上面的配置文件)中找到对端公钥,使用ChaCha20Poly1305
算法加密签名该数据包,再在加密后的数据包前添加wireguard header
,然后加上udp header
,组合为 UDP 负载,最后在最外层再加上IP header
(对端公网ip
,也就是Endpoint
),之后发送给对应的socket
;- 内层
IP header
:对端隧道 IP,即配置文件的AllowedIPs
- 外层
IP header
:对端公网 IP,即配置文件的Endpoint
- 路由器等网络设备是通过外层
IP header
转发的。等网络包到达wireguard
隧道的另外一端之后,内核中的网络协议栈会剥掉外层IP header
,然后交给wireguard
协议栈
- 内层
socket
发出的包会通过内核网络协议栈,在内核网络协议栈会判断路由,通过路由把流量发到eth0
网卡;- 网络包通过
eth0
发送出去
ubuntu
服务端接收的流量分析


-
网络包通过公网,到达
eth0
网卡 -
由于目标端口
50820
是被wireguard
监听的,所以网络包发送到对应的socket
-
socket
将网络包发送给应用层程序wireguard
-
wireguard
对网络包进行解密、验证签名等操作后通过字符驱动发送给wg0
,wg0
将解封装后的包发送到内核协议栈,之后分为两种情况,一种是作为中继服务器不做处理,直接转发(如上图1),另一种是交由应用层程序做处理(如上图2)- 直接转发:发送到网卡
eth0
- 交由应用层程序做处理:发送到对应应用层程序的
socket
- 直接转发:发送到网卡
-
wg0
发出的包会通过内核网络协议栈,在内核网络协议栈会判断路由,通过路由把流量发到eth0
网卡; -
网络包通过
eth0
发送出去
参考