用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子

wmproxy 将实现http/https代理, socks5代理, 后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 希望感兴趣的可以一起参与参与

项目 ++wmproxy++

gite: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

Proxy功能(代理用来做什么)

保护隐私

举个现实与客户交流的例子,这时候你和客户双方都互相认识, 了解对方

flowchart LR
你 <--> 客户

此时公司为了保护客户隐私, 要求你们统一在平台中沟通, 那沟通方式就变成了

flowchart LR
你 <--> 平台 <--> 客户

你们所有的沟通都由平台中转, 你再也没法得到客户的信息, 客户也没有办法得到你的信息, 保护了隐私的安全。在互联网上的表现就是隐藏了自己真实的IP地址,防止被攻击。

专属通道

正常有些内网资源无法通过外网直接访问

flowchart LR
你 --x 内网

此时内网安装了某代理统一对外保证安全,那你就可以通过取得该代理的信任(密码登录校验等),从而获取这些内网资源

flowchart LR
你 <--> 代理 <--> 内网

更快的速度

就比如访问github资源, 中间省略掉部分步骤,获取更少的丢包率,更高的访问速度

flowchart LR
你 -->|30ms| 代理 -->|30ms| github
你 -->|30ms| 城域 -->|30ms| 省域 -->|30ms| 国域 --> |500ms| github

代理类型

http代理

http代理是中间服务器接收到客户端的数据并原样的转发给服务端,在中间这一层他可以解析也可以不做解析,所以理论上代理服务器可以知道所有的数据,而且链路上都是明文传输,任何一层的中间节点都可以获得请求及返回的完整数据,不安全。

https代理

https代理是客户端优先给代理发送connect协议,比如访问https://www.baidu.com那么先优先发如下消息。

CONNECT www.baidu.com:443 HTTP/1.1\r\n
Host: www.baidu.com:443\r\n\r\n

后面的代理方收到客户端的消息转发给服务端,收到服务端的消息转发给客户端,无法获得客户端与服务端的通讯内容,因为是通过https的加密方式,中间方无法进行解密。

socks5代理

socks5由rfc1928进行定义,包含TCP,UDP,BIND三种相对较复杂,后面实现时再展开,还可以用用户密码进行认证,从而规避掉不合法的客户端请求。

项目引用

项目主要引用了下列的库,介绍了它在其中的作用

  1. 异步事件库tokio,高效的异步库,它已经集成了(epoll,kqueue, IOCP等)高效的事件通知方式。
  2. web解析库webparse,此外需要对接收的数据做初步解析需要一个web解析库,选择了webparse,依赖少,且已经实现了http1.1协议和http2协议的解析。
  3. 命令行解析框架commander,轻松解析命令行,无需再进行命令的二次分析。

为什么选Rust

Rust是一种快速、高并发、内存安全的语言,经过10来年的发展已经相当成熟,而且拥有良好的包管理系统,可以轻松的构建依赖。

RUST官网地址 https://www.rust-lang.org/

选用 1.72.0 版本

安装方法请参考网址

https://www.rust-lang.org/tools/install

用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子的更多相关文章

  1. 动手造轮子:实现一个简单的 AOP 框架

    动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...

  2. 动手造轮子:实现一个简单的 EventBus

    动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处理的很好的分隔开来,很好的实 ...

  3. 新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?

    ES给开发者提供了一个新特性:Proxy,就是代理的意思.也就是我们这一节要介绍的知识点. 以前,ATM还没有那么流行的时候(暴露年纪),我们去银行存款或者取款的时候,需要在柜台前排队,等柜台工作人员 ...

  4. Java实战_手把手编写记事本

    Java运用SWT插件编写桌面记事本应用程序 可实现windows系统桌面记事本基本功能.傻瓜式教学,一步一步手把手操作.小白也可自己编写出完整的应用程序. 须要工具:Eclipse(带SWT插件) ...

  5. 自己写一个java.lang.reflect.Proxy代理的实现

    前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...

  6. 手把手教你编写一个具有基本功能的shell(已开源)

    刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一步步完成一个模拟的shell(我命名之为wshell) ...

  7. 手把手教你编写一个简单的PHP模块形态的后门

    看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web ...

  8. Hexo+NexT(六):手把手教你编写一个Hexo过滤器插件

    Hexo+NexT介绍到这里,我认为已经可以很好地完成任务了.它所提供的一些基础功能及配置,都已经进行了讲解.你已经可以随心所欲地配置一个自己的博客环境,然后享受码字的乐趣. 把博客托管到Github ...

  9. [转]Proxy代理详解

    一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的. 动态代理技术就是用来产生一个对象的代理对 ...

  10. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

随机推荐

  1. Blazor资源大全,很棒的Blazor

    Blazor资源大全 一个收集了很棒的Blazor资源的集合. Blazor是一个使用C#/Razor和HTML在浏览器中运行的.NET Web框架. 欢迎贡献!请先查看贡献指南.感谢所有的贡献者,你 ...

  2. github上传文件报错failed to push some refs解决

    报错内容,不能推送文件到github上 error: failed to push some refs to github地址 原因是github项目与本地文件夹一些关键文件的确实,比如.git,re ...

  3. 《敏捷无敌之DevOps时代》读后感

    背景: 2020年基于我司业务形态,我开始实行敏捷项目管理.以敏捷为道,Scrum为法,迭代为术,禅道作器,大张旗鼓的搞了2年敏捷开发.随着时间推移,问题出现在2022年,当时我们已经完全按照Scru ...

  4. docker :repository docker.io/zookeeper not found: does not exist or no pull access

    分析 略 解决 vi /etc/docker/daemon.json { "registry-mirrors" : [ "http://registry.docker-c ...

  5. 使用MkDocs搭建个人博客

    使用MkDocs搭建个人博客 接触编程已经好几年了,阅读了无数大佬的博客文章,但是从来没有自己写过.这其中最重要的原因当然是懒惰,觉得写博客太费时间了,对自己的帮助也不大.可是如今发现自己的记性越来越 ...

  6. 个人用C#编写的壁纸管理器 - 开源研究系列文章

    今天介绍一下笔者自己用C#开发的一个小工具软件:壁纸管理器. 开发这个小工具的初衷是因为Windows操作系统提供的功能个人不满意,而且现在闲着,所以就随意写了个代码.如果对读者有借鉴参考作用就更好了 ...

  7. win10安装Redis5、配置自启动教程

    前提条件:首先我安装的是压缩包版的Redis5.0.14.1,下载链接为 https://github.com/tporadowski/redis/releases 安装教程 下载软件并解压 进入软件 ...

  8. Midjourney的一些学习心得:如何高效的图生图

    注意本文没有什么长篇大论,全部是自己的学习心得. 心得体会:如何图生图 今天在一篇midjourney看到好图应该怎么抄. 相信经常会看到好图也想要的,但是要么抄不出感觉,要么抄过来把水印也抄了,这一 ...

  9. vue3封装筛选项

    背景 项目开发中遇到筛选项,并且几个页面都有使用,依次写,太过于繁琐 筛选项解构如下 封装全局组件fjj-content <template> <div class="fj ...

  10. 接口自动化测试项目 | IHRM登录接口自动化测试

    项目内容如下: ### 需求- 地址:http://ihrm-java.itheima.net/#/login- 测试接口: - 登录接口:针对登录的13个cases### 技术 - V1:pytho ...