Pages

Saturday, 22 August 2015

使用obfsproxy4混淆shadowsocks流量

Shadowsocks + obfsproxy 混淆翻墙的实现(不错,我成功按此文翻墙)


Shadowsocks 的作者 @clowwindy 近期被喝茶了,并被迫删除了 Github 上的源码。这意味着 ss 以后不会得到更新,其流量特征也许会被不断进化的 GFW 识别并封锁。故使用 obfsproxy 进行二次混淆,降低被识别的风险。
  以下步骤均在 Debian 7 32 位系统上进行。

1. 配置 shadowsocks-libev 服务端

参考官方文档,这里从源直接安装。
添加 GPG public key:
1
wget -O- http://shadowsocks.org/debian/1D27208A.gpg | sudo apt-key add -
向 /etc/apt/sources.list 添加以下内容:
1
deb http://shadowsocks.org/debian wheezy main
执行以下命令安装:
1
2
sudo apt-get update
sudo apt-get install shadowsocks-libev

安装完成后编辑/etc/shadowsocks-libev/config.json 文件配置加密方式与端口:
1
2
3
4
5
6
7
8
9
{
    "server":"0.0.0.0",
    "server_port":8990,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"---",
    "method":"aes-256-cfb"
}
server 填写 0.0.0.0 允许所有设备连接.
加密方式一般选择 aes-256-cfb。
配置完成后执行:
1
sudo /etc/init.d/shadowsocks-libev start
启动ss服务端。

2. 配置 shadowsocks 客户端(Windows 平台)

在 http://shadowsocks.org/en/download/clients.html 下载 win 客户端
启动后在 GUI 中填写服务器信息并保存,本地端口以1080举例。
右击托盘图标以配置开机启动,搭配 SwitchyOmega + Chrome 使用。
若连接正常,则继续进行 obfsproxy 的部署。

3. 配置obfsproxy服务端

使用 python-pip 安装:
1
2
apt-get install gcc python-pip python-dev
pip install obfsproxy
运行服务端:
1
obfsproxy --data-dir /tmp/scramblesuit-server scramblesuit --password FANGBINXINGFUCKYOURMOTHERSASS444 --dest 127.0.0.1:8990 server 0.0.0.0:3578
scramblesuit 是一种安全性稍高的加密工作方式,该方式工作时需要临时文件夹存放yaml ticket,故用--data-dir 参数指定目录。--password 指定了加密密码,必须为 BASE32 字符,即大写字母加数字共32位的字符串。
--dest 指定目标端口,此处填写ss服务器所监听的端口。 server 为混淆后对外监听端口,0.0.0.0 表示允许所有ip地址连接。
运行成功后会提示:
1
2015-08-25 21:22:02,412 [WARNING] Obfsproxy (version: 0.2.13) starting up.
2015-08-25 21:22:02,412 [ERROR]
################################################
Do NOT rely on ScrambleSuit for strong security!
################################################
并不知道那句 [ERROR] 是什么意思,所以不要理它好了=。=
启动成功后需要将其加入自启动。编辑/etc/rc.local 文件添加如下内容:
1
obfsproxy --data-dir /tmp/scramblesuit-server scramblesuit --password FANGBINXINGFUCKYOURMOTHERSASS444 --dest 127.0.0.1:8990 server 0.0.0.0:3578 > /dev/null &
重启 VPS,服务端应已开始工作。

4. 配置 obfsproxy 客户端

Tor 并没有提供单独的 obfsproxy 客户端下载,需要手动从 Tor Browser 安装包中提取。
在 https://www.torproject.org/projects/obfsproxy.html.en 下载 Tor Browser with obfsproxy
下载后作为压缩包打开,定位至 Browser\TorBrowser\Tor\PluggableTransports\
由于客户端程序有依赖,故将该目录下除子目录 fteproxy 外的所有文件提取至单独文件夹中。
运行客户端:
1
obfsproxy\obfsproxy.exe scramblesuit --password=FANGBINXINGFUCKYOURMOTHERSASS444 --dest vps-public-ip:3578 client 127.0.0.1:6666
运行成功的提示与服务端的类似。
obfsproxy客户端将运行在本机的6666 端口上,修改 shadowsocks客户端的参数,其服务器地址填入 127.0.0.1,端口 6666。测试连接是否成功。
将客户端加入 Windows 自启动。由于启动后会产生一个控制台窗口,故需要用 vbs 启动客户端以隐藏控制台窗口。
1
CreateObject("WScript.Shell").Run "obfsproxy\obfsproxy.exe scramblesuit --password=FANGBINXINGFUCKYOURMOTHERSASS444 --dest vps-public-ip:3578 client 127.0.0.1:6666",0
存为 VBS 文件,到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp(Windows 8.1)


5. 总结

全部完工后端口如下:
服务端:
Shadowsocks服务器所监听的端口号: 8990 
obfsproxy服务器所监听的端口号: 3578 
客户端:
Shadowsocks客户端所监听的端口号: 1080 
obfsproxy客户端所监听的端口号: 6666 
加入 obfs 混淆后,访问速度及稳定性明显增加.

连接流程:ss client -->  obfsproxy client -->  obfsproxy server --> ss server

如果是用stunnel做加密处理,也是类似的连接流程:
ss client -->  stunnel client -->  stunnel server --> ss server
---------------------------------------------------------------------------------
最近,在 shadowsocks 的 GitHub 上出现了这样一个 Issue:https://github.com/shadowsocks/shadowsocks/issues/410
内容是说,最近有很多服务器因使用 shadowsocks 而受到干扰或者暂时性的封锁。当然,其真实性和是否与GFW有关,我都无从得知。但是后来又听说某些地区的 中国移动 开始尝试干扰 shadowsocks, 另外,这两天我的 shadowsocks 的确会出现在某些时刻突然完全无法访问的现象,与GFW是否有关?仍然无从得知。
但是 shadowsocks 的确有一些缺陷,比如说 iv 固定等等。这都导致了其封禁的可能性。
在这么多 疑似 的事情之后,对流量做一定的混淆还是有必要的,虽然我也有备用的方案。

工具

大名鼎鼎的 Tor Project 之所以能够一直在国内活到今天,非常依赖于它所开发的各种 Pluggable Transport,就是各种传输层面的插件。这些插件中很多都是用来混淆加密流量,使其看起来没有特征或类似于另一种正常协议的特征。
其中比较有名的就是 obfsproxy。当然,其版本 1 2 3 都已经被某长城识别并成功实现干扰或者封锁,而第四个版本 obfs4proxy 至少在目前仍然没有受到干扰。因此,我选择使用 obfs4proxy 作为混淆的工具
这些插件都是为 Tor 设计的,要将它们应用到非 Tor 的自建代理协议上,还需要一个脚本
里面的 ptproxy.sh,它使用 socat 对任意基于 TCP 的协议通过 Tor的 Pluggable Trasnport 进行混淆后传输。这就是我们所要的东西。
哦对了,顺便提一下,这个 ptproxy 工具调用的是 socat,而这个东西在2.0以前根本就不支持 SOCKS5,在2.0的测试版本中也仅仅实现了最基础的 SOCKS5 ,连用户名-密码的认证都没有实现,而这是 PT 所要求的。非常遗憾, obfs4proxy 的最新版本使用的正是 SOCKS5。所以,我在 GitHub 上fork了它,并revert了那条升级到 SOCKS5 的commit:https://github.com/PeterCxy/obfs4

原理

我们假设原来我们使用的是 shadowsocks 作为代理,那么,其传输过程是这样的
You -> (SOCKS5 ->) shadowsocks client ->...-> shadowsocks server -> Internet
注意从客户端到服务端的这一部分,这就是受到干扰或者阻断的地方。
如果使用了 obfs4proxy, 那么它就是这个样子
You -> (SOCKS5 ->) shadowsocks client -> (SOCKS4 ->) obfs4proxy client ->...-> obfs4proxy server -> shadowsocks server -> Internet
也就是说,obfs4proxy 的服务端在服务器上监听一个端口,将其从这个端口收到的数据包解除混淆后传递给 shadowsocks 的服务端。当客户端链接的时候,由 shadowsocks 客户端链接到运行在本地或者国内中转服务器的 obfs4proxy 监听的端口上,然后 obfs4proxy 会将链接进行混淆,再传输到服务端。对于 shadowsocks 本身来说,这层混淆位于客户端和服务端的中间,对其本身没有任何影响, shadowsocks本身并不需要对混淆作出任何调整,只不过需要把客户端链接的端口改成obfs4proxy 所监听的端口。

服务端

我在 ConoHa 上的VPS运行的是 Gentoo Linuxobfs4proxy 是使用Go 编写的,也就意味着这东西的打包脚本写起来比较容易 —— 非常容易,因为 Go 全部是静态链接。所以我就写了个 ebuild 在我的个人overlay里面
https://github.com/PeterCxy/gentoo-peter/tree/master/net-proxy/obfs4proxy
安装好以后,接下来只需要把 https://github.com/gumblex/ptproxy 这个git repo 克隆到本地的一个目录下就可以了。
我的服务器上并不止一个端口需要混淆,这就意味着我需要运行多个obfs4 实例。如果手工管理当然是很麻烦的,不过我使用的 systemd 完全可以胜任这类工作 —— 每个 unit 都可以接受一个传入的参数。但是,这要求 ptproxy 支持配置文件 —— 很可惜,它并不支持。所以我写了一个脚本来做一个 伪配置文件
#!/bin/bash

cat /path/to/config/dir/${1}.conf | xargs /path/to/ptproxy.sh
这样的话,只要在 /path/to/config/dir (这是一个任意目录,随便放在哪里,用于存放配置文件) 里面放入一些 .conf 后缀的文件,内容是要传给 ptproxy 的参数,然后调用这个脚本,将配置的文件名传给它(不带后缀),就可以将该配置文件的内容当作参数传递给 ptproxy
比如说,如果你的服务器上有一个监听在 5555 端口的 shadowsocks 服务端,想要让 obfs4proxy 在 5556 端口监听并将数据解除混淆后传递给这个 shadowsocks 服务端,那么配置文件就是这样的
-s 0.0.0.0:5556 127.0.0.1 5555
保存到配置目录里以后(扩展名为 .conf)再调用刚刚保存的脚本,即可启动服务端。你可以写一个 systemd 服务,接受参数并将其传递给这个启动脚本。这个写起来非常简单,我就不附上来了。不过,要注意设置好工作目录,否则可能会出现没权限创建日志/配置文件之类的奇怪问题。

客户端

因为我使用的电信网络到国外的延迟和丢包实在太大,所以我使用的是阿里云 中转。因为从我到阿里云这段网络上 应该 没有干扰,所以我只要混淆从 阿里云 到国外VPS这段的流量就可以了。所以,下面所讲的都是在国内中转服务器上配置的。当然,在本地配置也大同小异,只不过你需要链接到一个本地端口而不是中转端口罢了。
我在阿里云上使用的是 CentOS,而且 Tor 的网站还被墙了,这样,在它上面构建 obfs4proxy 就非常麻烦。所以我直接从我的国外VPS上拖了一个编译好的 obfs4proxy 可执行文件回来,然后安装一个 golang, 问题就解决了。
在客户端上,同样需要用到刚刚在服务端所使用的 ptproxy 脚本和我写的那个简单的配置文件脚本。我们继续刚刚的假设,你在服务端的 5556端口上配置好了 obfs4proxy,现在需要在配置一个客户端。假设你需要这个客户端监听在中转服务器(或者本地)的 5555 端口(对,这是客户端,所以和服务端的 5555 一点都不会冲突)并将其收到的数据混淆后发往服务端的 5556 端口。
-c server-ip:5556 0.0.0.0 5555 pt-args
其中, server-ip 是服务端的IP,pt-args 嘛……当服务端执行脚本启动混淆后,会在控制台输出一坨这样的东西
===== Client config =====
xxxxxxxxxxxx
TRANSPORT_ARGS=xxxxxxxxx
那个 TRANSPORT_ARGS 的等号右边的值就是我们需要的 pt-args 。这个值是固定的,除非你在服务端的运行环境手动修改。
好了,现在客户端也已经运行好了。你在本地启动一个 shadowsocks客户端,链接到这个中转服务器(或者本地计算机/路由器)的 5555 端口,即可使用加上了混淆的 shadowsocks

最后

我也不知道 obfs4proxy 能活多久,也不知道 shadowsocks 是否真的会被枪毙,但是在这个神奇的地方,你只能这么做。能用多久就是多久吧。
REF: https://github.com/Yawning/obfs4
FROM https://typeblog.net/tech/2015/08/18/obfourscating-shadowsocks-with-obfs4.html
--------------------------------------------------------------------------------------------
使用obfsproxy混淆socks代理服务器程序/http代理服务器程序,用来翻墙(不错,我成功用来翻墙)

obfsproxy是由Tor Project为Tor在被审查的国家使用而开发出的流量混淆插件以规避这些国家的防火墙…不过这个插件不仅可以用在Tor网桥上,还可以用在socks代理服务器程序/http代理服务器程序上。
配置服务端:
我们可以从python-pip安装,或者从torbrowser提取,不建议使用debian/ubuntu源安装,因为缺少scramblesuit特性..
如果是Debian/Ubuntu类系统:
先安装环境
apt-get install gcc python-pip python-dev
如果是CentOS则执行
yum install python-pip python-devel gcc pycrypto
之后安装obfsproxy
pip install obfsproxy
执行obfsproxy查看支持的混淆方式:
xiaolan@cui:~$ obfsproxy
usage: obfsproxy [-h] [-v] [--log-file LOG_FILE]
[--log-min-severity {error,warning,info,debug}] [--no-log]
[--no-safe-logging] [--data-dir DATA_DIR] [--proxy PROXY]
{managed,obfs2,dummy,obfs3,scramblesuit,b64} …
运行服务端
一般使用scramblesuit模式.
scramblesuit是obfs3的加强版,使用密码加密..使得GFW无法模拟obfs客户端来探测被混淆的是什么..我们这里以scramblesuit作为示范..
注意:scramblesuit的密码必须为BASE32字符..
BASE32字符是:ABCDEFGHIJKLMNPQRSTUVWXYZ3456789 且必须为32位!
obfsproxy --data-dir ~/.obfs/ scramblesuit --dest 127.0.0.1:20080 --password SBSB4444FANGBINXING4SBSBSBSBSBSB server 0.0.0.0:2333 &
127.0.0.1:20080 是转发到的服务(比如socks代理服务器程序或http代理服务器程序)的端口。(这里20080是我搭建在vps上的socks代理服务器程序mocks的端口号)
0.0.0.0:2333 是obfsproxy所监听的端口。
那一大串长的是密码..
如果不需要后台运行则去掉最后蓝色的&。
如果运行成功后应该会提示:
2015-08-21 22:54:12,282 [WARNING] Obfsproxy (version: 0.2.13) starting up.
2015-08-21 22:54:12,282 [ERROR]
################################################
Do NOT rely on ScrambleSuit for strong security!
################################################
至此服务端已经配置完成….
运行客户端:
Windows请下载Tor Browser后, 解压打开Browser\TorBrowser\Tor\PluggableTransports\obfsproxy.exe复制出来,用法同下..
obfsproxy scramblesuit --dest xx.xxx.xxx.xxx:2333 --passwordSBSB4444FANGBINXING4SBSBSBSBSBSB client 127.0.0.1:2345
xxx.xxx.xxx.xxx:2333是你的obfsproxy服务器的IP地址:端口号。
长串是密码,需与服务端一致.
127.0.0.1:2345 是本地端口.设置你的浏览器的socks代理为127.0.0.1:2345,浏览器即可翻墙。
你在服务器上所运行的后端代理服务器程序是socks代理服务器程序(比如mocks/kingate),则本地机器的浏览器的代理就设为socks代理;
你在服务器上所运行的后端代理服务器程序是http代理服务器程序(比如squid/tinyproxy),则本地机器的浏览器的代理就设为http代理;
你可以通过obfsproxy混淆socks代理服务器程序/http代理服务器程序等协议。
修改自https://xiaolan.me/obfsproxy.html
-----------------------------------------------------------------------------------------------

相关帖子:
https://briteming.blogspot.com/2016/03/obfsproxysockshttp.html

http://briteming.blogspot.com/2016/01/obfsproxy-pluggable-transports-proxy.html

http://briteming.blogspot.com/2013/02/bypassing-censorship-by-obfuscating.html