注意:由于 Shodowsocks 加入了 V2ray 插件(见本文结尾),目前 Simple-Obfs 插件已被 Showdosocks 官方标记为 Deprecated。
最近TG上有很多人在问这个问题,于是打算在这里说一下。
站长既然铁了心不会把网站搬回国内,我想这个贴子发在这里也不会有什么大问题。
反正,“随便滑稽”
敏感内容预警!!
- 以下内容可能与天朝网络的某些相关管理规定相悖,从而对网站造成一些无法预知的后果;
- 鉴于上条规则,以下内容可能会带给管理员的粪怒,从而删除本贴;
- 鉴于上条规则,本帖可能随时不复存在,如果觉得有价值,请按Ctrl+S保存网页或Ctrl+P打印到文件。
本篇以Ubuntu为例,Debian系统应该没有区别,CentOS用户配置方法类似,但请先检查iptables和SELinux。
首先安装依赖环境:
apt-get install -y wget automake autoconf libtool nano build-essential git libpcre3-dev libev-dev libc-ares-dev libmbedtls-dev libsodium-dev
首先,创建一个干净文件夹来编译程序,避免一些不必要的问题(比如文件已存在等)
mkdir ss-build-work && cd ss-build-work
为确保编译能够顺利通过,下载最新的Release源码,并且解压
wget https://github.com/shadowsocks/shadowsocks-libev/releases/download/v3.1.0/shadowsocks-libev-3.1.0.tar.gz
tar fx shadowsocks-libev-3.1.0.tar.gz && cd shadowsocks-libev-3.1.0
最新的Release源码请在这里找到,Downloads下面第一个就是。
准备编译。
./configure --prefix=/usr --disable-documentation
此过程要求不能有错误,也就是说,最终你看到的输出应该是像这样子的
开始编译并安装
make && make install
此过程不能有错误(Error),最终你看到的输出应该是像这样子的
到这里Shadowsocks-libev的编译就结束了,输入
ss-server --help
你应该能看到类似下面的内容,否则编译安装就没有成功。
完成后,我们返回上级目录
cd ..
接下来是Simple-obfs,截止目前,Simple-obfs的开发节奏比Shadowsocks-libev慢的多,应此Release也要很久才一个版本,我们建议选择从最新源码编译安装,当然,如果你遇到编译不通过的问题,就自行解决吧(建议下载最后发布的Release源码,参考上文)。
git clone https://github.com/shadowsocks/simple-obfs
cd simple-obfs && git submodule init && git submodule update
生成编译设置工具(下载Release的不需要这步):
./autogen.sh
此步骤一般不会有多大问题,成功后像下图一样输出
接下来如同上面和Shadowsocks-libev一样的配置和编译安装:
./configure --prefix=/usr --disable-documentation
make && make install
如果你Shadowsocks-libev都顺利编译安装完成了的话,这一步就不应该有什么问题,如果出现问题那就很有可能是源码的问题了。
完成后输入输入obfs-server --help
应该能看到像下面
到现在,我们安装Shadowsocks-libev with Simple-obfs的过程就结束了。
接下来我们要重设HTTP(S)服务的端口,你可能使用的是Nginx,也可能是Apache,Lighttpd等,它们的配置方法都不尽相同,但总的来说我们要修改端口,把80或443端口留出来给Shadowsocks代理使用。这里我以Nginx为例子,打开Nginx的配置文件,更改默认的HTTP端口,这里我修改为8080端口。如果你希望使用tls混淆的话请编辑“listen 443 ssl”中的443为其它端口,如8443。保存配置文件后重启Nginx(“service nginx restart”)。
(提示:如果你不希望通过8080访问到网站的话,请在端口号前加上“127.0.0.1:”)
我们先进入刚才编译Shadowsocks-libev的目录:
cd ../shadowsocks-libev-3.1.0
编辑一下默认的配置文件
nano debian/config.json
将server
修改为0.0.0.0
,server_port
修改为80
(如果用的TLS则为443),password
为连接密码,method
为加密方式(推荐aes-256-gcm
或chacha20-ietf-poly1305
),然后添加两项plugin
和plugin_opts
填入参数,像下图一样,特别注意一下引号和逗号,都是英文半角标点(其中内容可能会因你之前的操作不同而有所区别)。
编辑好后,按Ctrl+O(字母O,不是数字0)保存,再按Ctrl+X关闭编辑。
将配置文件复制到它该在的目录
mkdir /etc/shadowsocks-libev
cp debian/config.json /etc/shadowsocks-libev/config.json
修改一下开机脚本:
Shadowsocks-libev默认是以nobody:nogroup运行的,根据Linux的特性,只有以root权限运行的程序才能监听1024以下的端口(据我所知,80%的人都死在这里了),因此我们需要改运行用户组。
nano debian/shadowsocks-libev.default
修改
USER=nobody
GROUP=nogroup
为
USER=root
GROUP=root
像下图中的一样,然后保存并退出编辑器。
将开机启动的脚本复制到正确的目录,并设置VPS开机启动Shadowsocks-libev
cp debian/shadowsocks-libev.init /etc/init.d/shadowsocks-libev
cp debian/shadowsocks-libev.default /etc/default/shadowsocks-libev
chmod +x /etc/init.d/shadowsocks-libev
update-rc.d shadowsocks-libev defaults
目前只是设置了开机自动启动,但服务还没有启动,我们手动启动一下:
service shadowsocks-libev restart
到这里,所有的设置就都完成了,现在用浏览器打开一下VPS的IP地址,不管能不能看到正常的网页,403也好404也好甚至500也好,只要能用浏览器打开,那么设置就基本上算成功了。
最后一步,设置客户端,Android用户请安装“Shadowsocks”和“Simple Obfuscation”,两个软件都可以在Google Play上下载到,在Shadowsocks服务器设置中激活插件“Simple Obfuscation”,iOS用户请切换非国区帐号到App Store中购买下载相应的软件,按照说明设置,Windows用户建议下载Shadowsocks-CSharp和对应的obfs-local.exe(可以自己用msys或cygwin编译),在插件中填写obfs-local.exe的路径(可以是绝对路径也可以是相对路径),Linux用户我相信你不需要我教。所有客户端插件参数填写obfs=http
或obfs=http;obfs-host=www.baidu.com
替换www.baidu.com
为你想混淆的域名,如果你使用的是TLS,那么填写obfs=tls
。
--------以下为2018-01-29新增内容--------
最近VPS被墙两2个,以前的心情好补充的内容不补充了,不过我带来了新的内容
继续前面的话,这样做有一个麻烦,那就是如果Shadowsocks遇到意外或需要重启等情况就会影响到网站,另外Web服务器的日志里面的访问记录中的Remote Address也全变127.0.0.1了,不利于网站统计及优化。
因此,如果你的VPS做网站比Shadowsocks优先很多的话,那么推荐你将网站服务暴露在最外层,而不是Simple-obfs服务,这样能降低网站的处理负荷,而且能更容易的获得用户的真实IP地址。
在这里我们使用Nginx作为示范的Web服务程序,在接下来的教程中,我们将Nginx暴露到最外层,用Nginx反代Simple-obfs,而不是Simple-obfs failback到Nginx。
Nginx反代翻墙工具,这个本身不是什么稀罕的,尤其是V2Ray推广过后。可能是因为Shadwosocks现在的主力开发者madeye这个人十分低调,对Simple-obfs的一些特殊的使用方法并没有过多的说明,很少有人知道其实Shadowsocks用的Simple-obfs是可以用Nginx反代了。不过,相比于反代V2Ray来说,Simple-obfs在这方面确实有着很大的局限性,例如不支持TLS,不支持自定义路径和Headers。随着的V2Ray项目的完善,其客户端也越来越好用了,虽然配置相对复杂,但部署难度并不比Shadowsocks+Obfs高。目前我也在将自己的翻墙方案逐渐转移向V2Ray。如果你也希望更加灵活的代理的话,我强烈建议选择V2Ray。
好了,话不多说,回到主题,让我们开始吧。
首先你应该是已经部署好Shadowsocks+obfs的(上文),Nginx肯定也是部署好的(不然你不会有这个需求)。
首先,修改Shadowsocks配置文件
nano /etc/shadowsocks-libev/config.json
将端口修改到非80端口,这个端口将是Shadowsocks with obfs的备用端口,这里使用的是8080端口,修改plugin_opts
为obfs=http
,由于已经在Nginx后方了,建议删掉failover
项,改好后如下图,保存。
尤其注意不要failback到当前的网站所用的80端口,否则可能会因为Simple-obfs在失败时会将原TCP请求无任何修改地发送到Failback的地址的缘故,出现Nginx和Simple-obfs之间互相failover
和proxy_pass
的死循环耗尽服务器资源的现象(我就遇到过一次,Nginx的503错误日志把空间都写满了)。
接下来我们修改Nginx的配置文件(由于Nginx的安装不在本教程范围内,配置文件可能因安装而不同,在这里就不写路径了)将网站的端口修改为80(其实默认就是这样)。然后在http
->server
中添加一个location = /
段(如果你的配置段中已经有一个location = /
段,那么直接写到里面),段内代码如下,其中proxy_pass http://
后是你的Shadowoscks-obfs监听的端口。
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "upgrade";
if ($http_upgrade = "websocket") {
proxy_pass http://127.0.0.1:8080;
}
修改好了如下:
如果你的配置中有一个location /
段,那么你需要把这个段的内容也复制到添加的段里面去(通常Nginx默认配置有一个try_files,这个其实可以不用管,直接删掉都可以),举个例子:
如果你的配置原来这部分是像这样:
那么添加后就会像这样:
由于不同网站配置也不一样,这个配置也会有很大的差别,需要结合你的网站的具体情况来进行不同的配置,我相信这个应该难不倒会配置网站的你。
配置修改好后,重启Shadowsocks和Nginx,为了防止和原来的端口冲突,不使用restart
,而是先双停再双开。
service shadowsocks-libev stop
service nginx stop
service shadowsocks-libev start
service nginx start
接下来像前面的那样设置你的客户端:服务器IP、密码,端口80
,插件obfs-local
,插件选项obfs=http;obfs-host=your-domain.com
,注意这里obfs-host
要是你的网站域名哦(网站用IP就能访问的可忽略);否则的话,根据你的配置,Web服务程序可能不能正确将流量导向到后端的Shadowsocks-obfs哦。
Android端的Obfs插件官方Release并不是最新的Binary,这会造成与新版的服务端不兼容的问题。您可能需要自己编译一个obfs-android。我编译了一个自用,不介意的话可以直接下载使用。
最后,我再次推荐一下V2Ray,这个翻墙工具可以说是相当的强大。 就在今年(2019)年初,Shodowsocks官方加入了一个新的插件:V2ray(V2ray Plugin Android),这让Shodowsocks与V2ray之间互相兼容成为了可能。这也使得Showdosocks与网站共存的方式有了更多的花样。
Q&A 注意
- 一概不回答
****: command not found
这种错误的解决方法
- 一概不回答关于“被探测”,“被检出”,“被破解”的相关问题
- 一概不回答关于“购买VPS”的相关问题