至今还没有完全理解这个API的意义。按照google的文档来说就是:
看起来像是添加一个虚拟IP地址的意思,然而按照教程中的描述则为:
参数变成了子网掩码,但是按照实际的使用来看更偏向于第一种。
添加路由来过滤发送特定IP地址的流量,如果不进行任何过滤则需要设置为0.0.0.0/0或::/0
添加DNS服务器的地址,如果不添加的话将使用手机默认的DNS服务器。
添加白名单,白名单中的app的流量将不会经过vpn虚拟通道而直接走系统网络。
设置是否为阻塞模式,默认为非阻塞。个人感觉很重要的API,github上的很多项目没有设置为阻塞导致具体实现的时候用的都是线程轮询的方式,这一样一来大大提升了系统的开销。设置为阻塞模式后将大大减少进程上下文的切换。
设置虚拟通道的最大传输字节数,需要根据具体情况具体分析。在抓包的场景下最好尽可能得设置大一些。
简单来说是否允许一些app在使用一些非主流的方式访问网络的情况下不走虚拟通道。个人觉得最好允许。
VpnService启动后创建Builder进行各种初始化,结束后调用establish()获得本地虚拟通道的文件描述符(mFD)。通过输入流读取需要发送IP数据包后解析包的解析(网上有各种第三方的库可供选择)。首先判断是版本是IPV4还是IPV6,之后根据不同的版本来判断使用的是什么协议。
实际抓包的时候可以看到很多协议种类,当然主要的还是UDP与TCP。
可以创建一个稀疏数组,key为源端口,value为Datagram通道,通过Datagram通道向外发送UDP数据,从而减少系统开销。最终通过Datagram通道拿到UDP响应数据后写入mFD的输出流。
TCP的情况比较麻烦,涉及到三次握手以及四次分手,在github上看到个人感觉比较好的做法是,本地建立一个代理服务器来模拟这个过程。这个还需要深入研究。
套接字在发送之前一定要调用protect来防止循环链接,否则发出去的包又回回到mFD的输入流造成死循环。
另外mFD如果不关闭的话是没办法停止VpnService的。
Windows PC电脑;
国密SSL VPN客户端(浏览器);
Wireshark客户端(需支持国密协议版本, github地址 ),用于查看握手数据。
打开wireshark客户端,监听对应的网卡。可以在联网时通过wireshark查看哪个网卡有网络波动,选择对应的网卡。
Wireshark设置按照IP过滤,设置SSL VPN连接的国密服务器IP过滤。IP地址即为安全接入的网关或安全服务的地址。
此时可以看到通过GMTLS协议的握手数据。根据请求我们具体分析。
客户端向服务端发送Client Hello消息,传送客户端支持的最高 SSL 协议的版本号、随机数、加密算法列表,以及其他所需信息。Client Hello消息的内容如下图所示:
服务端收到客户端建立SSL连接的请求后,通过发送Server Hello消息向客户端传送SSL 协议的版本号、随机数、会话ID、加密算法的种类以及其他相关信息。消息内容如下:
同时服务端向客户端发送包含其证书的Certificate消息。证书中所携带服务端的公钥。如下图所示:
发送Certificate Request消息,要求服务端上报证书,如下图所示:
客户端发送Client Key Exchange和Change Cipher Spec消息,Client Key Exchange包含使用服务器公钥加密过的随机数Pre_Master_Secret,该参数用于后续生成主密钥。 (此处客户端使用前面提到的两个随机数,再生成第三个随机数,然后通过服务端证书中的公钥对第三个随机数加密,生成该 Pre_Master_Secret ) **;Change Cipher Spec消息告诉服务器,接下来的消息将采用新协商的加密套件和密钥进行通信,并通知客户端到服务器的握手过程结束。如下图所示:
服务端同样发送Change Cipher Spe消息通知服务端到客户端的握手过程结束,并发送一个加密的握手数据Encrypted Handshake Message 消息,客户端收到消息解密后进行验证,验证通过则说明握手过程中的数据没有被篡改过,也说明服务端是之前交换证书的持有者。现在双方就可以开始加密通信。如下图所示:
能。只要你的数据从某台设备商经过,都是可以进行镜像或者抓包的,肯定是可以看到的。VPN是虚拟专用网络,别的普通用户是无法抓取你的数据,但是运营商要日常维护设备,能直接进入设备,想怎么抓包都可以。
宽带是通信中描述电子线路能够同时处理的频率范围。它是一种相对的描述方式,频带的范围愈大,也就是带宽愈高时,能够发送的数据也相对增加。电视天线的宽带则代表能够接收具体数量的频道。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)