用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子
用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子
wmproxy 将实现http/https代理, socks5代理, 后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 希望感兴趣的可以一起参与参与
项目 ++wmproxy++
gite: https://gitee.com/tickbh/wmproxy
github: https://github.com/tickbh/wmproxy
Proxy功能(代理用来做什么)
保护隐私
举个现实与客户交流的例子,这时候你和客户双方都互相认识, 了解对方
你 <--> 客户
此时公司为了保护客户隐私, 要求你们统一在平台中沟通, 那沟通方式就变成了
你 <--> 平台 <--> 客户
你们所有的沟通都由平台中转, 你再也没法得到客户的信息, 客户也没有办法得到你的信息, 保护了隐私的安全。在互联网上的表现就是隐藏了自己真实的IP地址,防止被攻击。
专属通道
正常有些内网资源无法通过外网直接访问
你 --x 内网
此时内网安装了某代理统一对外保证安全,那你就可以通过取得该代理的信任(密码登录校验等),从而获取这些内网资源
你 <--> 代理 <--> 内网
更快的速度
就比如访问github资源, 中间省略掉部分步骤,获取更少的丢包率,更高的访问速度
你 -->|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三种相对较复杂,后面实现时再展开,还可以用用户密码进行认证,从而规避掉不合法的客户端请求。
项目引用
项目主要引用了下列的库,介绍了它在其中的作用
- 异步事件库tokio,高效的异步库,它已经集成了(epoll,kqueue, IOCP等)高效的事件通知方式。
- web解析库webparse,此外需要对接收的数据做初步解析需要一个web解析库,选择了webparse,依赖少,且已经实现了http1.1协议和http2协议的解析。
- 命令行解析框架commander,轻松解析命令行,无需再进行命令的二次分析。
为什么选Rust
Rust是一种快速、高并发、内存安全的语言,经过10来年的发展已经相当成熟,而且拥有良好的包管理系统,可以轻松的构建依赖。
RUST官网地址 https://www.rust-lang.org/
选用 1.72.0 版本
安装方法请参考网址
https://www.rust-lang.org/tools/install
用Rust手把手编写一个Proxy(代理), 准备篇, 动手造轮子的更多相关文章
- 动手造轮子:实现一个简单的 AOP 框架
动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...
- 动手造轮子:实现一个简单的 EventBus
动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处理的很好的分隔开来,很好的实 ...
- 新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?
ES给开发者提供了一个新特性:Proxy,就是代理的意思.也就是我们这一节要介绍的知识点. 以前,ATM还没有那么流行的时候(暴露年纪),我们去银行存款或者取款的时候,需要在柜台前排队,等柜台工作人员 ...
- Java实战_手把手编写记事本
Java运用SWT插件编写桌面记事本应用程序 可实现windows系统桌面记事本基本功能.傻瓜式教学,一步一步手把手操作.小白也可自己编写出完整的应用程序. 须要工具:Eclipse(带SWT插件) ...
- 自己写一个java.lang.reflect.Proxy代理的实现
前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...
- 手把手教你编写一个具有基本功能的shell(已开源)
刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一步步完成一个模拟的shell(我命名之为wshell) ...
- 手把手教你编写一个简单的PHP模块形态的后门
看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web ...
- Hexo+NexT(六):手把手教你编写一个Hexo过滤器插件
Hexo+NexT介绍到这里,我认为已经可以很好地完成任务了.它所提供的一些基础功能及配置,都已经进行了讲解.你已经可以随心所欲地配置一个自己的博客环境,然后享受码字的乐趣. 把博客托管到Github ...
- [转]Proxy代理详解
一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的. 动态代理技术就是用来产生一个对象的代理对 ...
- java中Proxy(代理与动态代理)
转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...
随机推荐
- 记一次线上bug:crontab 被意外清空
记一次线上bug:crontab 被意外清空 目录 记一次线上bug:crontab 被意外清空 问题概述 问题排查 问题复现 其他测试 总结 又是一次难忘的经历. 问题概述 同事反馈,某台服务器的c ...
- AWVS——自动化检测发现漏洞
AWVS简介 *AWVS作为一个工具,不可能把所有漏洞扫描出来,仅仅是作为一个渗透网站时的辅助工具 自动化Web漏洞扫描工具(基于漏洞匹配方法,通过网络爬虫测试网站安全) AWVS通过SQL注入攻击. ...
- PNG结构
参考此博客 PNG的文件头总是固定的八个字节 89 50 4E 47 0D 0A 1A 0A 数据块长度13 00 00 00 0D 文件头数据块标识IDCH 49 48 44 52 13位数据块(I ...
- HTTP&HTTPS协议
HTTP协议 1.什么是HTTP 超文本传输协议( HyperText Transfer Protoco,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议. HTTP(HyperT ...
- Linux 软件包:lvm
lvm LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制. Linux用户安装Linux操作系统时遇到的一个常见的难以决定的 ...
- vue中使用Tinymce
1.安装tinymce编辑器 npm i tinymcenpm i @tinymce/tinymce-vue 或: yarn add tinymce yarn add @tinymce/tinymce ...
- [ABC143E] Travel by Car
2023-02-20 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4.5 题目来源 AtCoder 题目算法 最短路 解题思路 我们枚举每一对点 \((u_i,v_i)\) 间的距 ...
- Java 中的日期时间总结
前言 大家好,我是 god23bin,在日常开发中,我们经常需要处理日期和时间,日期和时间可以说是一定会用到的,现在总结下 Java 中日期与时间的基本概念与一些常用的用法. 基本概念 日期(年月日, ...
- Seata AT和XA模式
一.分布式事务产生得原因: 1.1.数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多 ...
- MySQL 分表查询
分表是一种数据库分割技术,用于将大表拆分成多个小表,以提高数据库的性能和可管理性.在MySQL中,可以使用多种方法进行分表,例如基于范围.哈希或列表等.下面将详细介绍MySQL如何分表以及分表后如何进 ...