当前位置:首页 > 资讯 > 正文

通过Sockets对网络请求拦截并转发的思路和简单实例(Java)

通过Sockets对网络请求拦截并转发的思路和简单实例(Java)

前一阵子突然对网络安全和数据传输这方面有了点兴趣,加上朋友介绍了新的CrossWall的工具,便也想自己做个小工具试试看。

因为我觉得如果只是简单的使用工具,而不去深入理解原理,作为一个程序员就不会有进步。

这里只是分享一下我的思路和简单的例子,并没有使用复杂的数据加密和协议(像SSR)。

但仍然需要购买海外服务器,具体哪个我就不介绍了,只要海外的都行。

 

一. 思路:

原理其实很简单,

①通过代理服务器拦截所有的本地Http和Https请求

②通过Sockets接收到请求后,截取请求头并加密(为了不让防火墙拦截),将加密后的请求头再拼回原请求,并发送到海外的服务器

③海外服务器接收到加密后的请求后,对header解密,并将请求发送到对应的目标服务器(如Google)

④将目标服务器返回的数据流加密后返回给本机

⑤将海外服务器返回的数据解密后返回给浏览器

第④⑤步加密解密我并没有做,因为我只是通过将header加密解密就通过了防火墙。

由此可见,防火墙似乎并没有对数据本身做Check,只是校验了Header。

这也可以理解,因为返回的数据本身是很难验证的,而且现在网络那么发达,如果对每一条请求做太多的验证会影响整个互联网的访问速度,防火墙服务器的处理压力也会变得很大。

防火墙能封国外IP还是因为它不仅能拦截,还能主动探测端口,这个就不在这里讨论了。

另外,我对Header的加密,也只是简单的将字节加了1位而已,毕竟加密不是这里讨论的重点。

 

二. 本机Client端:

2.1. 目录结构:

2.2. Client.java:

定义了客户端的启动界面,可以设置海外服务器的IP和Port。

2.3. Register.java:

通过register.jar和ICE_JNIRegistry.dll修改注册表,设置代理服务器拦截Http和Https请求。

注意测试的时候和打成Jar包以后,static方法不太一样。

2.4. Proxy.java:

代理服务器的修改方法类

2.5. ClientProxy.java:

将客户端发送过来的数据转发海外服务器,并将海外服务器返回的数据转发给客户端。

2.6. HttpHeaderClient.java

客户端解析头部

2.7. codeUtils.java

加密解密类

 

三. 海外服务器Server端:

3.1. Server.java

海外服务器的Socket启动程序

3.2. ServerProxy.java

海外服务器的数据处理

3.3. HttpHeaderServer.java

海外服务器的头部处理

3.4. pom.xml

3.5. 其他:

将register.jar和ICE_JNIRegistry.dll放在lib目录下(64位的Register注册表修改包网上自己搜吧)

 

四. 运行方法:

4.1.由于需要修改注册表,用到了lib下面的ICE_JNIRegistry.dll文件。
在Register.java里面的static方法中,有设置dll的路径。
要执行编译后的jar包就用上面那种方法,调试的时候可以用下面的。

4.2.我是通过IDEA中的Build Artifacts编译了两个Jar包
ssrClient.jar是在本机运行。
ssrServer.jar是在国外的服务器运行。

4.3.运行本机的ssrClient.jar:
(1)把ssrClient.jar和ICE_JNIRegistry.dll放在C:ssr目录下
(2)cmd中执行

(另外说一句,我这里的Password是一开始准备使用AES加密用的,现在没用到)
(3)界面中修改海外服务器的IP地址,点击StartProxy
(4)修改注册表中的代理服务器好像有延迟,如果不行,就手动在IE里面改代理服务器算了。

4.4.运行海外服务器的ssrServer.jar:
(1)环境CentOS+jdk1.8.0_172,配置文件/etc/profile修改好
(2)ssrServer.jar到/usr/local/ssr目录中(没有就自己建)
(3)执行

4.5.测试:

输入打开www.google.com:

本机的ssrClient显示如下:

海外服务器的ssrServer显示如下:

 

五. 资料:

Github代码:https://github.com/sunroyi/sunSocks

最新文章