用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. 选择排序与冒泡排序(c语言+Java语言)

    选择排序 O(n2) 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 重复第二步,直到所有元素均排序完毕. 例 ...

  2. 5.2 基于ROP漏洞挖掘与利用

    通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这 ...

  3. 使用docker构建可动态启动的FreeSWITCH实例

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Docker版本:23.0.6   使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的 ...

  4. NOIP模拟测试A3

    A. 谜之阶乘 题目是让我们把 \(n\) 分解成两个阶乘的商,本来想推个式子什么的,结果发现推不出来. 我们知道,阶乘的增长速率非常的快啊!那么这个 \(b - a\) 的值肯定不会太大,我们可以暴 ...

  5. C++(类成员的访问控制)

    访问控制 如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么? struct Student { int age; int sex; void P ...

  6. nmcli 命令简单使用

    centos7/8 机器上默认有安装nmcli,可直接使用修改ip. nmcli c add type ethernet ifname eth0 # 会提示 'ethernet-eth0' 创建成功 ...

  7. 使用 virt-install 命令创建虚拟机

    实践 参考文档:官方手册 这个命令适用于创建第一个虚拟机,后面如果再增加,修改xml文件或者使用clone命令就可以了. centos.sh #!/bin/bash name='centos7' is ...

  8. jQuery事件冒泡和默行为

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 绕过PHP执行命令的函数执行系统cmd命令

    <?php $evil=`set`; echo '<pre>'.$evil.'</pre>'; ?> 成功执行set命令,你懂的! 顺手写了个php执行cmd命令的 ...

  10. nodejs中如何使用http创建一个服务

    http模块是nodejs中非常重要的一部分,用于开启一个服务,我们可以用它自定义接口供客户端使用.   开启服务的方式也比较简单,几行代码就可以搞定 const http = require('ht ...