《零入门kubernetes网络实战》视频专栏地址
https://www.ixigua.com/7193641905282875942
本篇文章视频地址(稍后上传)
上一篇文章我们提供了一个helloworld级别的基于tun设备的点对点vpn参考案例。
而这篇文章我们介绍一个开源社区提供的点对点的VPN,稍微复杂了一点。
1、参考案例官网 |
https://github.com/net-byte/vtun
2、vtun跟我们提供的helloworld级别的案例的核心区别在那里? |
- 在helloworld的案例中
- 比方说,从/dev/net/tun读取数据包后,
- 直接将数据包通过本地的UDP服务发送到了对端UDP服务了。
- 中间没有对数据包做任何的修改
- 而在vtun里,从/dev/net/tun读取数据包后,对数据包做了一些其他操作:
- 加密
- 压缩
- 过滤
等等
3、vtun功能介绍 |
这是一款简易用的VPN,
支持以下协议:
- 支持UDP
- 支持websocket
- 支持tls
- 支持grpc
我们重点分析的是UDP协议
4、vtun核心代码说明 |
我们只分析udp模式下的,客户端代码。
服务器端核心逻辑跟客户端是一样的。
4.1、tunToUdp函数逻辑 |
4.2、udpToTun函数逻辑 |
5、本次测试目的 |
是否能够实现将客户端上的所有请求流量转发到服务器端。
6、测试环境说明 |
本次我们只测试vtun的udp模式;
linux下客户端启动vtun时,分为两种情况:
- 仅转发tun网络的请求
- 转发客户端上的所有请求
在centos环境下测试:
- 客户端IP:10.211.55.122
- 服务器端IP:10.211.55.123
7、如何编译 |
7.1、如何编译vtun |
7.1.1、先看一下scripts目录下的build.sh脚本 |
大家根据自己的实际情况进行修改!
7.1.2、开始编译 |
我是根据自己的习惯,编写了Makefile文件,供大家参考
build:
./scripts/build.sh
scp:
scp bin/* root@10.211.55.122:/root
scp bin/* root@10.211.55.123:/root
all:
make build && make scp
7.2、vtun启动方式介绍 |
vtun可以在Linux、MacOS、window平台下启动。
vtun可以支持转发tun网络的请求,也可以支持宿主机上的所有请求
7.3、登录到客户端,并启动服务 |
./vtun-linux-amd64 -l :3000 -s 10.211.55.123:3001 -c 172.16.0.10/24 -k 123456 -g
如果你不想测试转发所有流量的话,去掉-g即可
将10.211.55.123改成自己的实际服务器端IP
7.4、登录到服务器端,并启动服务 |
./vtun-linux-amd64 -S -l :3001 -c 172.16.0.1/24 -k 123456
8、测试网络连通性 |
8.1、先在客户端一侧,ping服务器端一侧的虚拟网络设备tun0 |
ping 172.16.0.1
8.2、在服务器端一侧,对eth0进行抓包分析 |
tcpdump -nn udp -i eth0
注意,是UDP协议,而非ICMP协议。
8.3、在服务器端一侧,对tun0网卡进行抓包分析 |
tcpdump -nn -i tun0
很遗憾,非常准确的原因,目前没有查出来。
但是,也有一个解决办法;
8.4、解决转发客户端所有流量失败的措施? |
8.5、重新编译,上传客户端,服务器端,重新启动服务 |
这里只展示了客户端的启动过程,服务器端跟以前一样,不再重复展示了。
./vtun-linux-amd64 -l :3000 -s 10.211.55.123:3001 -c 172.16.0.10/24 -k 123456 -g
8.6、在客户端上,测试是否能够ping通服务器端上的tun0设备? |
8.6.1、先在服务器端上验证一下tun0的相关信息 |
ip a s tun0
ethtool -i tun0
8.6.2、登录到客户端上ping 服务器端的tun0虚拟网卡 |
ping 172.16.0.1
这里验证了ICMP协议,
而TCP协议就不在具体展示了,是可以的。
8.7、在客户端上,测试一下,随便ping一个网络,是否能将客户端的流量转发到了服务器端上? |
8.7.1、在客户端上,随便ping一个网络 |
ping 10.10.10.10
8.7.2、在服务端上,对eth0,tun0进行抓包分析 |
9、简单总结一下,转发客户端上所有流量的原理? |
一个数据包是去走哪个网络,是根据路由表来决定的。
路由表里有多条路由,一条路由,代表一个网络。具体如何选择,大家可以详细研究一下。
至少新增了一条默认路由,也就是说当数据包不知道走哪条路由时,就会走默认路由
而通向默认路由的网卡设备就是tun0。
这样的话,至少转发了默认路由的流量。
如果是本机内部的流量是不用转发的。
如果是非本机的非默认路由流量的话,并没有测试。
10、总结 |
分享vtun主要是为大家提供了一个稍微复杂点的案例。
可以对从/dev/net/tun文件里读取到的数据包进行二次加工,
对加工后的数据,
再通过UDP链接发送出去。
最后,又重点分析了一下如何实现转发客户端的所有流量的功能。
11、学习心得分享 |
其实,在学习tun设备的过程中,网上关于go语言版本的tun编程还是比较少的。
大部分都是c,c++,python的
因此,类似的情况,大家可以在github里,搜索相关内容。
通过关键词搜索,比方说,tun tap vpn
将搜到的代码下载到本地,使用goland,idea等编辑打开,
使用全局搜索方式,查看是否有自己感兴趣的代码。
<<零入门kubernetes网络实战>>技术专栏之文章目录