之前打hvv的时候发现nps的流量会被安全设备做掉,所以想自己写一个内网代理
最近把比较火的开源框架挖了一点洞,看了一下代码,大概学到点java开发的一些规范,当然目前我这个项目的代码规范程度虽然比以前规范,但肯定还是不规范的,感觉比以前写起来顺手很多
目前流量混淆领域比较强的项目当然是科学上网那些,只是我这个内网代理项目还处于debug阶段,后期会考虑在现在的协议设计基础上套一层混淆
服务端这次用java写了,java实在是太好用了,其实这个内网代理项目我很早之前就开始写,一开始是用rust,因为rust有win7的toolchain,支持win7,后来rust版本写出来发现不知道为啥会丢包,流量大流量小都没事,流量不大不小的时候会丢包
所以说并发人的事情很难说,当时我也没debug清楚,只能放弃了
这次内网代理架构是这样的

spring integration和spring框架深度契合了,我客户端和服务端的连接就是通过这个框架做的,从连接工厂、入站网关、channel到adapter都是bean;由于代理功能我可能会开多个端口的,那每监听一个端口就都要新增bean,取消监听又要把相关的bean回收,这样就会把bean弄的到处都是,管理起来很麻烦
所以代理这块我用了netty,netty天生支持socks5协议的解析,非常方便,只要继承一下它的handler实现自己的socks协议处理逻辑,然后把decoder和handler串在pipline里面就行了
那么spring integration和netty之间数据如何交换呢?spring integration作为服务端,我不知道怎么通过它主动向客户端推送消息,所以我做了个interceptor插到spring integration的tcp factory里面,有新的连接来了之后interceptor就会向我自己定义的registry对象里面记录tcp连接,当我需要向客户端发送消息时,我就从registry里面找到tcp连接把数据灌注进去就好了
那么现在服务端的数据可以发给客户端了,客户端的数据是由spring integration接收的,现在客户端的数据回到了服务端的spring integration里面,但是目前还不清楚这份数据是要返回给哪个socks服务,也不知道要返回给某个socks服务的某个连接。为了解决这个问题,我引入了request id机制,经常研究协议的大伙应该知道,很多协议都要求在回复的时候,把收到的数据包的request id复制到回复数据包里,俺寻思这玩意就是这么用的
但是netty和spring integration之间怎么连通呢?毕竟是两个不同的框架。最近网上冲浪的时候看到很多java开发在找工作,有几位大哥分享了面试题,里面有关于flux的,我一想,哎!我可以把FluxSink放到registry里,和request id坐一桌,netty那边等着客户端数据的,就对着Flux subscribe一下,等到spring integration收到客户端数据了,把数据包里的request id找registry一套,套出来个FluxSink(也可能是null),那就对着FluxSink一顿大调用,netty作为订阅方就收到数据了
写到这里大伙是不是发现我还没开始说golang做了啥,其实这次golang做的是客户端,很抽象,我还在debug呢,就被卡巴杀掉了

看来免杀这块还是要免杀

Comments | NOTHING