mproxy: c 语言实现的一个最小的http代理,支持FQ
https://github.com/examplecode/mproxy
mproxy 使用说明
这是一个微型的http代理服务器实现,使用c语言实现,核心代码量不足500行,不依赖任何第三方的库(只能工作在unixlike系统下面). 其主要功能如下:
- http代理
- 支持https隧道
- 支持简单加密隧道
注:本代码实现简陋,完成仓促,目前还停留在一个原型的阶段,经测试访问facebook,twitter,youtube ,google是OK的,但不保证所有的网站兼容性的问题,希望能够起到一个抛砖引玉的作用。欢迎提交pull request 继续完善. :)
通常情况下存在两种工作模式,普通代理模式和加密隧道模式.
普通代理
这种工作模式和普通的http代理一样,mproxy目前只做简单的http转发,不做任何页面的缓存。
加密隧道(FQ专用)
这种工作模式需要以client,server的模式进行配合使用,即mproxy分别作为客户端和服务端,并在客户端及服务端形成一个简单的加密隧道,从而躲过GFW的侦测。具体的工作模式如下图所示:
+----------+ +-----------+ +----------+ +----------+
| | | | | | | |
| | | | | | | |
| APP +------->| mproxy |+------> mproxy +------> Web |
| | | | | | | |
| | | client | | server | | |
+----------+ +-----------+ +----------+ +----------+
编译
mproxy可以运行在unix-like 的操作系统下面,程序很小没有第三方的依赖,所以编译很简单,下面的一行命令搞定!
gcc -o mproxy mproxy.c
使用方法
作为普通的代理服务器。
./mproxy -l 8000 -d
这种工作方式对我们来讲意义不大,只做功能展示,重点在下面。
注: "-d" 参数表示程序作为deamon服务,避免终端退出程序结束
作为加密隧道的部署方式(翻墙专用)
有翻墙需求的同学需要使用mproxy分别作为本地代理和远程代理,并且指定两个代理之间传输数据的方式为加密方式。 注:翻墙的话远程代理服务器需要部署在不受GFW管制的国外(找个便宜的VPS即可).
step1 : 在远程服务器启动mproxy作为远程代理
你需要把mproxy源码在远程的服务器编译(直接拷贝二进制应该也可以)然后运行下面的命令。
./mproxy -l 8081 -D -d
-D 指定接受数据进行解密,其对应参数'-E'应用在本地代理 -d 指定启动作为后台服务,避免终端退出程序结束
step2 : 本地启动 mproxy 作为本地代理,并指定传输方式加密。
在本地启动一个mporxy 并指定目上一步在远程部署的服务器地址和端口号。
./mproxy -l 8080 -h xxx.xxx.xxx.xxx:8081 -E
-l 指定本地监听端口 -h 指定远端下一跳步的服务器地址及端口号,如果翻墙需要是一台国外的服务器 -E 发送数据的时候进行加密,其对应参数'-D' 应用在远程代理
step3 : 配置浏览器http代理使用mporxy本地代理
设置你的浏览器http代理指向你的本地代理,使用chrome浏览器的同学强烈推荐使用 switchSharp,安装完毕swichSharp以后只需要为switchSharp增加一个情景模式就好,如下图:

保存设置以后如果想翻墙的话就切换到你刚才配置的情景模式吧。

注: mproxy暂不支持windows用户,但是可以和已经部署好的机器共享,只需要在switchSharp中把代理服务器的地址从“localhost"改成已经部署好mproxy的ip即可。
mproxy: c 语言实现的一个最小的http代理,支持FQ的更多相关文章
- SQLite C++ Wrapper 是一个 C++ 语言对 SQLite 的最小封装包。
SQLite C++ Wrapper 是一个 C++ 语言对 SQLite 的最小封装包. 示例代码1: #include <string> #include <iostream ...
- Minus-C 一个最小化的C语言规范
资深C++程序员都不会对C++编程规范太陌生,C++实在太复杂,以至于所有项目都需要裁剪一个子集共项目组内使用.经过在家休息这一小段时间,我发现其实C语言更需要一个相同的规范,这就是本文的目标,最大可 ...
- Swift3.0语言教程获得一个公共的前缀
Swift3.0语言教程获得一个公共的前缀 Swift3.0语言教程获得一个公共的前缀,当在一个程序中有多个字符串时,我们需要判断是否有两个字符串有公共的前缀时,是很困难的.在NSString中的co ...
- 采用 PAT工具及CSP语言,对一个问题进行自动机 建模
pat是新加坡国立开发的工具,需要的去官网下http://www.comp.nus.edu.sg/~pat/ ,学了一天,是个不错的自动机验证工具,感觉还不错啊. 验证一个数是否为斐波那契数且为质数 ...
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序
前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解法一:暴力求解.从1开始查找M,然后判断M*N=X这个数字是否只含有0,1. 解法二:由 ...
- 关于吴恩达机器学习支持向量机的问题,讲到对偶前有一个最小化f(w)使用拉格朗日求解时转化成一个最大的相等式的理解和一些困惑
(纯属个人理解) 参考: https://www.zhihu.com/question/267482928 https://www.cnblogs.com/90zeng/p/Lagrange_dual ...
- 不好意思啊,我上周到今天不到10天时间,用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊
花10天时间用C语言做了个小站 http://tieba.yunxunmi.com/index.html 简称: 云贴吧 不好意思啊,我上周到今天不到10天时间,用纯C语言写了一个小站!想拍砖的就赶紧 ...
- 用Racket语言写了一个万花筒的程序
用Racket语言写了一个万花筒的程序 来源:https://blog.csdn.net/chinazhangyong/article/details/79362394 https://github. ...
随机推荐
- 解决java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName'
今天使用mysql,用java程序往mysql中写数据,出现如下错误: Caused by: java.sql.SQLException: Incorrect string value: '\xD3\ ...
- EXCEPTION-STRUTS2
CreateTime--2016年8月29日17:05:50Author:Marydon 声明:异常类文章主要是记录了我遇到的异常信息及解决方案,解决方案大部分都是百度解决的,(这里只是针对我遇到 ...
- TRIZ系列-创新原理-25-自服务原理
自服务原理的详细表述例如以下:1)物体在实施辅助和维修操作时.必须能自我服务:2)利用废弃的材料和能量: 自服务原理的第1)个比較好理解,假设一个系统在执行过程中须要进行辅助和维护操作时,最好不要借助 ...
- SpringMVC 类内部的RequestMapping注解能否被继承?
首先注意标题,说的是类内部的注解 结论是: 不能,但是子类却可以享有父类中该注解带来的效果. 看了一下这个:http://elf8848.iteye.com/blog/1621392 自己也试了一下, ...
- CEF 各个版本适应的平台参考表
This Wiki page provides information about CEF branches and instructions for downloading, building an ...
- 解决windows下MySQL表名大写自动变小写的问题
解决windows下MySQL表名大写自动变小写的问题 有些人可能会遇到在windows下,表名不能用大写字母, 即使使用了大写字母的建表语句,还是会被自动转成小写. 解决方法: 打开 My ...
- hduoj----(1033)Edge
Edge Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- python练习笔记——用列表推导式生成二维列表
用列表推导式如何生成如下列表:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] inner_list = [] outer_list = [] for i in range(1,10 ...
- RHCE7 管理II-6ACL的使用
ACL允许向文件分配细化的权限.除标准的文件所有者.组所有者.和其他文件权限之外,还可以指定用户或组,以及uid或guid确定的用户和组授予权限. 命令: ·setfacl 设置acl策略 ·getf ...
- AOE网与关键路径简介
前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...