一开始写觉得难死了,后来写完了还挺有成就感的。
原理
VPN 虚拟专用网络(virtual private networking)和代理服务器
想必大家使用vpn或者代理的目的都很简单:翻墙
就这个目的而言,使用vpn和代理都是可以的。可能大家更乐意使用代理,因为代理更便宜。
https://www.seoxiehui.cn/article-148529-1.html
https://zhuanlan.zhihu.com/p/451193697
在我的理解线下,代理和vpn的区别 :
1. 在你和代理服务器交互时,信息是不会加密的,而在你和vpn服务器交互时,信息是会加密的,这也就是为什么vpn会更隐蔽安全(然而因为服务器要额外处理加密数据,成本更大,所以会更贵)
2.显然代理更不安全,因为你的行为在发送给代理之间容易被监听到
3. 代理在转发时会替换成自己的ip,vpn不会,这就是为什么渗透时跳板使用的都是代理,而不是vpn
TUN/TAP 和 IP 隧道、路由
创建TUN/TAP设备的目的是为了创建一个虚拟网卡,方便 vpn 处理 “适合的数据”
比如 创建一个虚拟网卡后,方便你设定路由规则,比如访问什么ip地址时,应该转发到 这个虚拟网卡。
tun/tap 机制会把 在这个 网卡的数据包发送给 创建该tun/tap的应用程序,应用程序处理后发送给其他网卡。
公钥加密,PKI 和X.509 证书
使用openssl的命令行功能创建根证书并自签名,用于签名其他的服务器证书和客户端证书。
TLS/SSL编程
可以参考 ssl官网
这里要多多个客户端进行使用,多线程相关的知识是跑不了的。
身份认证
对服务器证书进行认证,服务器对客户端进行密码输入认证。
设计思路
vpn服务器
主线程流程
线程处理连接流程
vpn客户端
这个就比较简单了,毕竟只是个客户端,我们在设计时优先考虑vpn服务器的设计,客户端只需要配合服务器的步骤即可。
不足
每次连接单独创建一个tun设备过于浪费设备资源了。其实一个tun就能满足所有的请求
创建线程还是不太靠谱,应该采用更先进的io多路复用技术(epoll)来进行连接,实现资源最有效利用
客户端输入的密码是明文显示在界面上的。
这只是第一个版本,之后再做一个版本出来,争取解决这些问题
源码
源码上的注释写得挺详细的,这里不过多赘叙了。
https://github.com/wsxk/hust_vpn
后续…
select换epoll
密码掩藏
减少创建的tun/tap设备
reference
https://www.ibm.com/docs/en/ztpf/1.1.0.14?topic=functions-ssl-new
https://blog.csdn.net/wy1550365215/article/details/76376875
https://blog.csdn.net/xc_tsao/article/details/44123331
https://blog.csdn.net/mijichui2153/article/details/82855925
https://cloud.tencent.com/developer/article/1768585
https://blog.csdn.net/zujipi8736/article/details/86606093
https://www.jianshu.com/p/12d2eae68a4f