首页 > 其他分享 > 用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子

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

时间:2023-09-16 21:38:17浏览次数:35  
标签:-- 手把手 代理 Proxy https flowchart 解析 Rust 客户端

用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

标签:--,手把手,代理,Proxy,https,flowchart,解析,Rust,客户端
From: https://www.cnblogs.com/luojiawaf/p/17707315.html

相关文章

  • 前端项目实战肆佰零玖react-admin和material ui-跨域方案http-proxy-middleware
    const{createProxyMiddleware}=require('http-proxy-middleware');module.exports=(app)=>{app.use(createProxyMiddleware('/postgrest',{target:'http://localhost:4000',changeOri......
  • rust_trait个人理解
    0概述什么是traitrust中有许许多多的类型(枚举、结构体...),如果这些不同类型,都有类似的行为,我们把这个行为抽象出来,把他定义为一个特征(trait)一个trait中可以包含,一个或者一组行为,表现形式就是方法or函数1特征约束1.1特征约束1.2特征做函数参数的语法糖真特么nb,看下......
  • 【DSP视频教程】DSP视频教程第12期:TI开源分享IQmath DSP源码,适用于所有Cortex-M内核,本
     今年TI推出MSPM0系列产品配套的SDK软件包里面将此库开源了,之前的时候也移植过IQmatb,不过只有库版本,这次竟然开源了,确实是不可多得的好资源。这个是定点库,非常适合用于M0,  M0+,  M3和不带硬件FPU的M4内核上,当然,用在M4F,M7,M33等器件上也是没问题的。本次视频配套的例子将ARMDS......
  • 程序设计之——手把手教你如何从Excel文件中读取学生信息
    在当今信息化时代,计算机技术已经深入到各个领域,而程序设计则成为推动信息化建设的关键技术之一。在众多领域中,学生信息管理系统无疑是其中一个重要的应用。本文将从学生信息管理系统的开发入手,探讨开如何高效且保证质量的完成开发。假设有一个学生信息管理系统,需要从Excel文件中......
  • 程序设计之——手把手教你如何从Excel文件中读取学生信息
    在当今信息化时代,计算机技术已经深入到各个领域,而程序设计则成为推动信息化建设的关键技术之一。在众多领域中,学生信息管理系统无疑是其中一个重要的应用。本文将从学生信息管理系统的开发入手,探讨开如何高效且保证质量的完成开发。假设有一个学生信息管理系统,需要从Excel文件中读......
  • Rust 开发命令行工具(上)
    ❝你必须按所想去生活,否则只能按生活去想。--王小波❞大家好,我是「柒八九」。作为一个前端/Rust/AI知识博主,之前的文章中,大部分篇幅都是关于前端的知识分享,而对Rust和AI的内容只是做了几篇内容梳理和介绍。而,我们今后的重心也会逐渐偏移,势必能达到前端/Rust/AI「三足鼎立」的局面......
  • 手把手搭建一个完整的javaweb项目(适合新手)
    手把手搭建一个完整的javaweb项目本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。 下载地址:http://download.csdn.net/detail/qq_23994787/9904842  点击下载主要功能有:1.用户注册2.用户登录3.用户列表展示4.用户信息修改......
  • 手把手教你Shiro整合JWT实现登录认证!
    1.所用技术SpringBootMybatis-plusShiroJWTRedis注:最后会给出完整代码2.前置知识Shiro:Shiro是一个基于Java的开源的安全框架。在Shiro的核心架构里面,Subject是访问系统的用户。SecurityManager是安全管理器,负责用户的认证和授权,相当于Shiro的老大哥。Realm相......
  • 用 Rust 的 declarative macro 做了个小东西
    最近几天在弄ddnspod的时候,写了个宏:custom_meta_struct解决什么问题#[derive(Debug,Clone,serde::Serialize,serde::Deserialize)]structActionA{url:String,//https://example.comversion:String,//v1.2.3a:u64,//...}#[derive(Deb......
  • 使用mysql-proxy代理mysql集群
    本文系统环境为:CentOSLinuxrelease7.9.2009(Core)安装mysql-proxy下载地址:dev.mysql.com/downloads/m… 服务信息 markdown复制代码mysql-proxy:192.168.1.113:4040//目标配置信息已搭建mysql数据库(双主):192.168.1.113:3306192.168.1.113:3307......