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

by Macgoy, at 09 March 2020, tags : 编程 点击纠错 点击删除
使用CN2/CN2GIA顶级线路,支持Shadowsocks/V2ray科学上网,支持支付宝付款,每月仅需 5 美元
## 加入品葱精选 Telegram Channel ##

品葱用户 Macgoy 提问于 3/9/2020

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

品葱用户 projectpolaris 评论于 2020-03-09

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

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

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

3. 序列化库,用于配置解析,例如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证书签名

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

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

品葱用户 ilovejp 评论于 2020-03-09

想搞正规一点的话,从Java入手
想搞快一点,做个玩具,从Python入手
想从原子级别开始做一套完全自主的工具,从C++入手
(以上皆针对PC端而言)
另外现在VPN要解决的问题主要是混淆
v2ray是个很不错的方案,你可以照着做一个
如果光是用Python快速做一个的话,只需要先学会Python语法,然后学会使用一些http、加密、混淆之类的库,组装起来就可以做一个“自主可控”的翻墙软件
要是用C++从原子层面做起的话,还得学习密码学、计算机网络这种底层的知识,用C++逐步实现,才能开始往上逐步搭一个平台出来

要是想做移动端的话,还得学习对应的编程语言
安卓:Java或者kotlin
ios:Objective-C

品葱用户 立紗Lisa 评论于 2020-03-10

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

我给个思路,不说具体的
首先,我翻墙的主要用途是浏览器。那么浏览器如何翻墙呢?设置代理!
第二个问题,浏览器支持哪些代理方式?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,你就安全了!!!

品葱用户 Crench 评论于 2020-03-09

Racket吧(逃)
迷雾通有一部分就是用Racket写的。

一本正经的说,从头造轮子不是不可取(自由门跟迷雾通基本上就是从底层开始写起),但是花费的时间和精力太多。

品葱用户 灰色幽灵 评论于 2020-03-08

不要从头造轮子,有很多现成的产品可以用了,作为通讯工具vpn及vpn协议在稳定性和安全性上都有很高的要求,需要大量的与网络相关的知识以及编程经验(还有安全审计方面的知识),是一个需要漫长周期的工程,参考wireguard吹了多少年还是没能换掉openvpn。不是打击你的热情,如果编程基础都没有就想搞这个确实有点难,好好用现在成熟的工具和协议吧。当然如果你只是玩点花样折腾一下,借用现有协议和各种开源模块做一个自己的换皮客户端,以便于你可以对你的朋友说“看啊,这是我自己的翻墙软件”,建议去网上学一下安卓开发就好。

品葱用户 被注册新用户 评论于 2020-03-09

這話說的我只能推薦你去學好Python後再說VPN的事情。

品葱用户 pincong9898 评论于 2020-03-09

和语言没有关系,和网络协议有关系.

这点都分不清楚,就别下水游泳了.

现在的小孩无知到这种程度了?

品葱用户 Wixipedia 评论于 2020-03-08

Android app:kotlin java
shadowsocks-libev服务器端是c++
我也想学,谁带带我
20字是干嘛的字体的人物的时候就是这样的时候就是这样

品葱用户 Resistance 评论于 2020-03-08

俺推荐 Rust。但你要做好思想准备,开发翻墙工具对计算机网络要有深入了解,对你的编程水平也有很高的要求,一般人很难做到。

品葱用户 jordan8 评论于 2020-03-10

服务端其实不是太麻烦。主要是客户端麻烦。基本每个客户端都需要单独做一个软件出来,工作量非常大。

品葱用户 梁啓超 评论于 2020-03-09

底层协议基本都是用现成的,无非是用什么套壳,建议Python

品葱用户 calciumonoxide 评论于 2020-03-09

除非题主真的有很好的想法和储备知识,不然我不大推荐这样做,比较花时间效果也不一定好。
可以先学学一些开源梯子是怎么实现的。

至于语言的话,现在蛮多工具都是基于Go的,可以试试,PC跨平台GUI的话推荐用electron。

品葱用户 HatsumeMiku 评论于 2020-03-09

題主提到了APP…
APP 的話如果是 Android 需要 java 或者 kotlin ,ios的話則是Objective-C或者Swift,當然最主要的是通訊協議的問題,可以參考下市面上開源的 vpn軟件,當然也可以自實現,不過不建議重複造輪子,像v2ray 或者shadowsocks 在 github上開源,可以clone后二改,當然這個對編程水平要求較高,你可以從簡單的入手,比如去看看SOCKS5(rfc1928)的通訊邏輯然後先實現簡單的局域網SOCKS5代理等等等,先把基礎打牢吧。

品葱用户 习习哈哈 评论于 2020-03-10

语言从来就不是重点,重点是你要做到何种深度
当前回答字数不足20,是否回复为讨论?

品葱用户 patrick999 评论于 2020-03-10

介紹你參考wireguard,已有opensource,不過使用的技術門檻很高,只要把code拿來包裝成普通人也容易用就行了。

另外v2ray和shadowsocks嚴格來說不是VPN,而是Proxy。

品葱用户 咸鱼老李 评论于 2020-03-10

服务端用Python吧,至少开发难度小一点,现有的库不少,很多翻墙软件用的就是Python开发的服务端,比如说有名的GoAgent、原生SS,但是这类软件不是严格意义上的VPN,只是增强版的加密代理,安全性上比不过传统的VPN乃至Tor,要开发高安全性的翻墙工具,请使用C/C++/Java此类语言,而且还要结合着其他编程语言使用,在目前的需求下只使用一种编程语言来开发强大的翻墙工具是不现实的
客户端得看平台,桌面(Linux/Windows/Mac os)的话Python/C/C++/Java都行,但是手机端就受制于平台了,Android只能用Go/Java/Kotlin,iOS只能Swift/Objective-C,~不提具体需求光谈实现方式简直就是耍流氓啊~
然后在开发的时候多看看开源的那些梯子是怎么实现的,这玩意才是一款梯子性能高低以及安全程度的关键问题,要多借鉴学习现有的协议,别从头开始造轮子,那样太费事,当然借鉴的过程中也别违背开源协议(尤其是GPL),当然这些都是大工程,新手还是先从学习现有梯子的原理做起吧,打好基本功再来魔改现有协议或是创造新的协议。

品葱用户 Jero 评论于 2020-03-11

个人建议go
容易学的里面它最快
性能高的里面它最容易学

品葱用户 第三新索多玛 评论于 2020-03-10

答案就是别写,你根本不知道一个新手写程序能出多少BUG。
普通程序出BUG无所谓,VPN出BUG就是送人头。

品葱用户 小君撫 评论于 2020-03-11

楼主是想独自创新一种流量传输协议还是给现有的协议带个套做成client呢?后者的话看平台,Android的话kotlin吧,pc端Python/Go,C++学习曲线太陡了不建议。前者的话我也不知道,创新这种东西都是可遇不可求的,而且需要很长的时间积累

另外软件这种东西单打独斗基本上比较困难,个人开发者我觉得能做到不出重大bug下给v2ray-core 这种带个套已经很不错了(当然本质上还是玩具)

品葱用户 rocks1 评论于 2020-03-10

这么多软件高手,兄弟借这个话题,请教一下各位高手,不知道是不是会违反平台规定?谢谢!
我在做邮件群发,因为手上有非常多的客户邮件地址,同时也有很多带密码的邮件,购买邮件发件箱费用太高,所以我一直在找邮件及其密码的是否还有效的验证软件,也就是我已经有的带密码邮件,不知道密码是否被修改了,用这个密码是不是还可以打开这个邮箱的验证软件,而且需要批量的验证这些邮件及对应的密码。
兄弟们有这方面的软件或者其他什么方法推荐吗?另外,动态变动IP地址和MAC码的软件,大家有好的推荐吗?万分感谢!如果违反平台规定,请管理提醒我,我马上删除,再次感谢!

点击品葱原文参与讨论

最简单好用的 VPS,没有之一,注册立得 100 美金
comments powered by Disqus

See Also