【霏艺所思】Cloudflare的wireguard开源项目
在GitHub上看到一个开源项目https://github.com/cloudflare/boringtun
Linux的内核实现了内核态的wireguard
这个是cloudflare实现的用户态的wireguard【使用了Rust语言】
重点看
device目录: 模拟虚拟网卡
noise目录: 网络通信协议
device目录下,只用看 tun_linux.rs 就可以了!精华!
这个文件,注意 open(b"/dev/net/tun\0".as_ptr() as _, O_RDWR)
这行是关键代码
ifru_flags: (IFF_TUN | IFF_NO_PI | IFF_MULTI_QUEUE) as _,
第二层关键代码
IFF_TUN 表示工作在 网络层 【IFF_TAP】 表示工作在数据链路层
IFF_MULTI_QUEUE 为了多队列访问,提升性能
其他的epoll kqueue 就是为了这个
epoll为了linux系统,kqueue为了mac系统
我们可以使用libevent代替
现在看noise,也就是重点wireguard的网络协议
重点看 handshake.rs 这个文件,mod.rs 这个文件
其中 handshake 里实现了握手协议
format_handshake_initiation 这个函数负责拼 handshake_initiation 报文
就是拼字符串,根据协议实现。。。【对应 TLS 里的 ClientHello】
format_handshake_response 这个函数负责拼 handshake_response 报文
也是拼字符串,根据协议实现。。。【对应TLS 里的 ServerHello】
拼字符串,我觉得是一个很机械的工作,我就没有细看,反正也就那么回事。。。
至于 noise 下的mod.rs
我推荐只看 encapsulate 和 decapsulate 两个函数
分别是把 /dev/net/tun读取的buffer 封装为 wireguard协议
和 根据wireguard协议,解析为buffer 回写到 tun虚拟网卡
关键函数,我都已经给出了,你们只要看看哪些代码会调用
我说的这些函数,就可以对整个客户端有所了解!
Linux的内核实现了内核态的wireguard
这个是cloudflare实现的用户态的wireguard【使用了Rust语言】
重点看
device目录: 模拟虚拟网卡
noise目录: 网络通信协议
device目录下,只用看 tun_linux.rs 就可以了!精华!
这个文件,注意 open(b"/dev/net/tun\0".as_ptr() as _, O_RDWR)
这行是关键代码
ifru_flags: (IFF_TUN | IFF_NO_PI | IFF_MULTI_QUEUE) as _,
第二层关键代码
IFF_TUN 表示工作在 网络层 【IFF_TAP】 表示工作在数据链路层
IFF_MULTI_QUEUE 为了多队列访问,提升性能
其他的epoll kqueue 就是为了这个
epoll为了linux系统,kqueue为了mac系统
我们可以使用libevent代替
现在看noise,也就是重点wireguard的网络协议
重点看 handshake.rs 这个文件,mod.rs 这个文件
其中 handshake 里实现了握手协议
format_handshake_initiation 这个函数负责拼 handshake_initiation 报文
就是拼字符串,根据协议实现。。。【对应 TLS 里的 ClientHello】
format_handshake_response 这个函数负责拼 handshake_response 报文
也是拼字符串,根据协议实现。。。【对应TLS 里的 ServerHello】
拼字符串,我觉得是一个很机械的工作,我就没有细看,反正也就那么回事。。。
至于 noise 下的mod.rs
我推荐只看 encapsulate 和 decapsulate 两个函数
分别是把 /dev/net/tun读取的buffer 封装为 wireguard协议
和 根据wireguard协议,解析为buffer 回写到 tun虚拟网卡
关键函数,我都已经给出了,你们只要看看哪些代码会调用
我说的这些函数,就可以对整个客户端有所了解!
1 个评论
讲解了 rust编程 实现 用户态的 Linux mac ios Android 下的wireguard
我在这里讲解下windows下怎么办。。。
参考开源项目https://github.com/songgao/water
其他系统,就不累述了
直接看 windows
https://github.com/songgao/water/blob/master/syscalls_windows.go
重点是 openDev 这个函数,
config.PlatformSpecificParams.ComponentID
config.PlatformSpecificParams.InterfaceName
在 https://github.com/songgao/water/blob/master/params_windows.go
有需要的自己修改
syscall.CreateFile 相当于 你打开了这个虚拟网卡。。。
可以自己阅读理解,反正就是注册表操作了
懒的同学,可以不读,直接照抄。。。
自己写VPN,其实真的不难。。。
通过刚才的操作就可以建立虚拟网卡。。。
再像普通的文件读写一样操作这个虚拟网卡
1.从虚拟网卡读取数据
2.封装数据以后,用物理网卡发送
3.从物理网卡接收网络数据
4.解封装以后,回写到虚拟网卡
这里,当然可以把数据写到tor发送
也可以写到v2ray发送
也可以写到shadowsocks发送
也可以自己写协议
就像wireguard自己定了一个协议。。。
我在这里讲解下windows下怎么办。。。
参考开源项目https://github.com/songgao/water
其他系统,就不累述了
直接看 windows
https://github.com/songgao/water/blob/master/syscalls_windows.go
重点是 openDev 这个函数,
config.PlatformSpecificParams.ComponentID
config.PlatformSpecificParams.InterfaceName
在 https://github.com/songgao/water/blob/master/params_windows.go
有需要的自己修改
syscall.CreateFile 相当于 你打开了这个虚拟网卡。。。
可以自己阅读理解,反正就是注册表操作了
懒的同学,可以不读,直接照抄。。。
自己写VPN,其实真的不难。。。
通过刚才的操作就可以建立虚拟网卡。。。
再像普通的文件读写一样操作这个虚拟网卡
1.从虚拟网卡读取数据
2.封装数据以后,用物理网卡发送
3.从物理网卡接收网络数据
4.解封装以后,回写到虚拟网卡
这里,当然可以把数据写到tor发送
也可以写到v2ray发送
也可以写到shadowsocks发送
也可以自己写协议
就像wireguard自己定了一个协议。。。