学习哪些编程语言才能开发VPN的app?


  • https://webcache.googleusercontent.com/search?q=cache:https://pincong.rocks/question/20551

    我想开发一个VPNapp,该从哪些编程语言入手?

    我是某开源代理软件的开发者组成员,我说一点实际的吧,上面的评论基本上泛泛而谈

    1.首先你需要一个开源的事件驱动的多线程网络库,这是高并发的关键,一般使用C/C++/go,现在可选的主要有libuv(最快),libev, libevent, ACE, Boost.asio,当然golang在语言层级就已经支持异步操作。

    1. 加密库,这个其实就两种,openssl,libsodium,golang标准库自带

    2. 序列化库,用于配置解析,例如protobuf,cjson,fastjson等

    4.一些基础infra和算法:你应该熟悉分页内存池,动态数组,哈希表,红黑树,b+树,双端缓冲队列,因为有时候开源库里面或者语言自带这些容器和结构,但你得知道怎么用。路由算法方面(实现PAC机制)你应该会哈希表和trie树以及b+树,用来快速路由数据包里面的目的ip

    5.协议,不建议自建协议,但是你需要自己实现现有的协议,因为现有代理软件的开发者据我所知没有把自己协议封装成库的
    以上针对服务端,以下针对客户端:

    1. 首先确立一个观点,客户端只是一个用户交互的界面,所以正确做法是把服务端跨编嵌入你的客户端,作为一个独立进程建立一个本地server,客户端只用管理配置和启停。或者你可以直接把v2ray或shadowsocks-libev编译到你的平台作为core。
    2. 界面开发,如果你不想一个平台一套代码,可以使用xamarin,如果你想原生,那就原生(建议)
    3. 分应用代理实现:
      android 似乎系统提供了API(我不开发安卓,此条不可信)
      IOS, Darwin 没可能
      Linux 直接hook系统socket函数,或者写一个内核驱动去filter pid
      Windows 最麻烦,win hook现在很容易崩溃,你需要写WFP或者NDIS驱动,并自己买张EV证书签名

    最后, 不要觉得自己可以把上面全部掌握完,多多使用开源库。

    具体细节,可以在回复里问题


    我觉得你们吓到楼主了。。。

    我给个思路,不说具体的
    首先,我翻墙的主要用途是浏览器。那么浏览器如何翻墙呢?设置代理!
    第二个问题,浏览器支持哪些代理方式?socks5 和 http代理!而且http代理优先,因为socks5代理很多软件不支持。而且windows默认只能http代理,不支持socks5.
    既然浏览器默认不支持自定义的代理协议,为什么我们要去研发自己的协议呢?
    第三个问题,为什么把代理地址为什么是127.0.0.1 这样的本地地址,而不是直接填写远程服务器地址?
    关键来了:因为不论是http代理还是socks5代理,都是明文。。。
    如果是http代理,每次都要发CONNECT请求【类似POST和GET】
    socks5也是一样的,参考RFC文档
    所以部署在本地,然后由客户端加密以后发给远程服务器。
    第四个问题,客户端和服务端通信,为什么要走https?
    实际上,我觉得不需要,因为协议其实跑在TLS上,对于第三方而言,它完全没法知道这个是https
    https交互过程
    客户端 和 服务端 建立 TCP连接
    客户端 和 服务端 建立 TLS连接
    客户端 和 服务端 开始HTTP报文


    所以,对于第三方来讲只能看到这里在TLS通信,看不到TLS里的内容,自然也就没法知道是https协议了

    第五个问题,既然为了保密一定要用TLS,我该学习什么呢?
    不要学习这么多,为难你自己。你只要下载一个openssl或者boringssl,
    学习ssl_connect,ssl_accept,ssl_write,ssl_read 四个api就可以了。。。
    包教包会,别无聊去看源码。看下上面四个api的demo,足以学会TLS使用了!!!

    第六个问题,说了这么多,翻墙软件怎么写呢?
    翻墙过程如下
    你的浏览器 ---socks代理---> 翻墙客户端---tls---> 翻墙服务端 ---> 你的目标网站

    正常人应该发现我们要做的是什么了,对,实现 socks5 over TLS!
    网上搜索 socks5 over TLS,刚好发现了一堆开源项目!随便学习,你想学什么语言都可以了。。。
    翻墙客户端,功能就是把socks5协议转成TLS或基于TLS的协议【比如https】,做了一个协议中转的功能。【自己读了下,发现不严谨,但是大概意思没错了】
    翻墙服务端,功能就是代理了。发收到的代理请求转发实现。
    压根用不到libuv,libev这些。更加不可能去hook 系统的socket,写内核,写驱动。。。
    写机场是另外一回事了
    也不用学习红黑树,内存分页。。。纯无聊,我们是造轮子,不是造钉子!

    第七个问题,PAC又是什么东西?
    PAC是一个配置文件,告诉浏览器,那些需要走代理,哪些不需要走代理。。。
    完全跑在浏览器或者客户端上,服务端是不需要走PAC的!
    这个问题有点复杂,你就当不知道pac的存在吧。也就是都走代理模式。。。。
    没有安全意识的人,不要不配置pac!
    没有安全意识的人,不要不配置pac!
    没有安全意识的人,不要不配置pac!

    第八个问题,为什么我写的翻墙软件会被封掉?
    浏览器访问一个网站,比如www.google.com,需要先向DNS询问IP地址
    DNS查询是明文的!
    封掉你的逻辑是这样的
    1.你翻墙以后,浏览器浏览google,浏览器不认识google,所以向dns查ip地址
    2.共产党截获了你的电脑的请求,给了一个不存在的ip,6.6.6.6
    3.你的浏览器告诉 你的翻墙软件,说你要访问6.6.6.6
    4.翻墙软件把你的请求,转发给了6.6.6.6,然后你就上不了网!

    解决办法,你必须保证自己的DNS是安全的!
    也就是DNS over TLS,或者DNS over HTTPS
    第九个问题,如何配置DNS 为 DNS over TLS?
    去https://developers.cloudflare.com/1.1.1.1/dns-over-https/cloudflared-proxy/
    根据教程,配置cloudflared

    然后把DNS地址设置成127.0.0.1,你就安全了!!!