$hadow$ocks与Privoxy基础原理

以下所有提到$hadow$ocks的均以ss指代

为什么要用ss呢?

在早期(如今绝大多数也是),对于互联网的访问流程是及其简单的:浏览器(或其他客户端)向互联网服务器提出一个请求(request),然后等待互联网服务器回应(response),最后在本地解析渲染。麻烦一点的,中间会有多个代理帮助我们进行数据的请求。

后来,墙出现了,我们不能再愉快的访问外网了。因为墙相当于一个巨大的墙阻挡着我们和外界,当我们想要访问外网的时候,这个请求数据包必然会经过墙的检查:

当检查到被墙禁止访问的内容请求的时候,自然会被“过滤”或被“忽视”掉。但,有人还是想要往墙外看看。怎么办呢?有人想出了一个方法,如同最上面图中右边的拓扑,但是中间代理服务器本身就在国外,当我们想要访问外部内容的时候,首先和这个在国外的代理服务器进行ssh通信,告诉它,我想要请求xx资源,再让这台代理服务器去访问目标服务器,得到回应之后,再把我们想要的数据通过ssh传递给我们:

刚开始这样还不错。因为ssh本身基于RSA加密,所以首先,墙无法查看其请求内容(ip、内容等),所以也就无法分析你的请求关键词(用于筛选连接),避免了被重置链接的问题,但由于创建隧道和数据传输的过程中,ssh本身的特征是明显的,我们的墙研发人员根据相关的如连接频率、连接时间等进行分析,再通过一定的手段干预连接,于是后来墙愈来越强了。使用ssh tunnel的方式不太灵了!

既然ssh你还能看出连接时间、频率等特征值。那我干脆不用了,转换一下,我往外界发送合法的TCP数据包该没有问题吧?好,每次我访问某个资源的时候,首先将请求在本地转换为(拆分、加密等手段)一个个非常规端口的TCP数据包,里面的内容也是加密过的。当我发送给外部服务器的时候,墙只能知道你发送的是合法TCP数据包,它也不敢妄自丢弃和查看特征值,因为他没法保证这个TCP数据包究竟是要请求什么,外面看来本身就是个普通的数据包。等发到外部的代理服务器的时候,我运用相关的协议进行重组解密,得到原始请求。后面就和ssh tunnel有异曲同工之妙。于是,如下的拓扑出现了:

理解了这个之后,搭建服务器就是一件很简单的事情了。网上资源很多,这里不再赘述。

Privoxy作用

当我们搭建好了ss服务器之后,我们本地需要使用ss客户端监听1080(通常的默认端口),配置相关的命令,从而实现当我们本地机器访问外部网络的时候,请求数据首先经过本的1080端口进行加密拆分为原始的TCP数据包。然而需要注意的是,当我们监听了默认的1080端口之后,并不意味着,我们访问数据的时候,所有网络数据就走1080这个ss客户端监听的端口了。由于Windows和macOS客户端通常包含了相关的代理转发功能,所以我们在进行HTTP或者是HTTPS的时候,会默认的启动一个代理转发的模块,来替我们监听HTTP和HTTPS请求,并将这些请求数据送入1080端口应用(即ss客户端)。

然而,在Linux下的ss客户端,并没有包含这个功能,所以,但我们进行HTTP(s)请求的时候,需要设置代理,当我们使用Privoxy的时候,安装Privoxy:

$ sudo yum -y install epel-release
$ sudo yum -y install privoxy

第一步的安装epel这是因为像centos这类衍生出来的发行版,他们的源有时候内容更新的比较滞后,或者说有时候一些扩展的源根本就没有。EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。

默认的配置文件地址在 /etc/privoxy/config 目录下。

# 把本地HTTP流量转发到本地1080 SOCKS5代理
# 即当我们发出HTTP(S)请求的时候,会将请求转为Socks5
# 注意最后的 "."
forward-socks5 / 127.0.0.1:1080 .
# 可选,默认监听本地连接端口为8118
# listen-address 127.0.0.1:8118

接下里启动:

systemctl start privoxy

配置完成以后还没有结束!请考虑一下,目前我们只是设定了如果有对于所有HTTP(S)的访问(即foward-sock5后面的“/”)都将转为socks5送入被ss客户端监听的1080端口中去,但是并没有设定HTTP(S)代理服务器!,所以,最后你还需要在.bash_profile(或者是.bashrc)中设定代理服务器的环境变量:

export http_proxy=http://127.0.0.1:8118
export https_proxy=https://127.0.0.1:8118
# 最后再source一下

最后,我们再以一个整体拓扑来表达一下我们的访问流程:

最新文章

  1. metasploit模块字典爆破tomcat
  2. Python数据类型之“数字(numerics)”
  3. VS代码片段(snippet)创作工具——Snippet Editor(转)
  4. Sublime Text 3 文本编辑器
  5. C# 钩子HOOK专题(1)
  6. iostream/fstream中的输入输出流指针的绑定,tie函数的使用。
  7. python中pip的使用和安装
  8. android 点滴记录
  9. NPOI helper
  10. Kindle支持文档类型
  11. Tip:HttpServletRequest
  12. Linux命令——head/tail
  13. Oracle 当前日期如何添加指定年数、月数、天数、时数、分钟数、秒数
  14. [转][CentOS]修改IP后立即生效
  15. log_bin_trust_function_creators
  16. 数据储存为base64编码,如何实现模糊搜索
  17. Service的启动过程分析
  18. 关于C#低版本升级高版本时,项目中引用Microsoft.Office.Interop.Word,程序提示不存在类型或命名空间名office.
  19. Canvas的save和restore
  20. vs2015+opencv3.3.1 实现 c++ 双边滤波器(Bilateral Filter)

热门文章

  1. 解决Openstack Dashboard无法获取实例故障
  2. php实现验证码(数字、字母、汉字)
  3. Mybatis-plus<二>通用CRUD,分页
  4. 再见了,我的散装研发管理平台;再见了,4台ECS!
  5. JVM详解(四)——类加载过程
  6. Djangoform组件——ModelForm的基本使用
  7. C# 爬虫框架实现 流程_爬虫结构/原理
  8. NumPy的基本操作
  9. 常量&&变量
  10. python库--sklearn--流程图