$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. Spring Data JPA:解析JpaSpecificationExecutor & Specification

    源码 在前面关于SimpleJpaRepository的文章[地址]中可以得知,SimpleJpaRepository间接实现了JpaSpecificationExecutor接口,本文就详细探究一下 ...

  2. C# - 音乐小闹钟_BetaV2.0

    时间:2017-11-21 作者:byzqy  介绍: 虽然上一版本基本实现了闹钟的功能,但是界面.功能.用户体验(简直谈不上体验^_^),以及众多的bug,所以升级,刻不容缓! 还是先看一下Beta ...

  3. linux centos7 tail

    2021-08-30 # 不指定行数,默认显示 10 行 # 显示 /var/log/crond 后100行 taile -100 /var/log/crond # 动态显示 /var/log/cro ...

  4. msyql redo log和binlog

    更新语句执行流程 下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c: create table T(ID int primary key, c int); 如果要将 ID=2 这一行 ...

  5. 临时性备用 socks 巧(科)妙(学)上网,你懂的,不多解释

    最近 Shadowsock s 不稳定,极大的影响了工作效率.不过 ssh 还能连上自己的机器,所以掏出 ssh -D 满足自己 #!/usr/bin/env bash disable_proxy() ...

  6. LeetCode刷题模板(1):《我要打10个》之二分法

    Author       :  叨陪鲤 Email         : vip_13031075266@163.com Date          : 2021.01.23 Copyright : 未 ...

  7. 关于FeignClient上的RequestMapping不能生效的问题

    问题 我有两个FeignClient共同继承了一个接口,两个Client有各自不同的url实现,其中一个需要加上类似于@RequestMapping作用在类上的效果,因为@RequestMapping ...

  8. 双非Java的学习之旅以及秋招路程

    个人信息: 趁着中秋写个帖子记录一下吧.渣渣本,无实习,无高质量证书,走了很多弯路,最后选择的Java后端.现在算是半躺平了,接了几个中小厂的offer保底,20w多的薪资,后面还有几家公司接着面.不 ...

  9. python 打字小游戏

    最近随便用python的pygame编了这个打字小游戏 只要有字母调到窗口底部就结束 上代码: import pygame.freetype import sys import random pyga ...

  10. IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用,无需三方依赖,开源微服务全栈项目有来商城云环境的部署方式

    一. 前言 最近有些童鞋对开源微服务商城项目 youlai-mall 如何部署到线上环境以及项目中 的Dockerfile 文件有疑问,所以写了这篇文章做个答疑以及演示完整的微服务项目发布到线上的流程 ...