之前曾经将自用梯子由单纯的ss升级为ss+v2ray,但随着墙的继续增高,这种模式被检测封锁的可能性也在增加。
目前最稳妥的方案是在最外面包裹一层Web反向代理,通过websocket转发到v2ray服务。这样甚至可以模拟一个真实存在的网站,其中隐藏一个网址作为梯子,暴露的几率大大降低。
本文是配置此方案过程中的笔记,为保证完整性,内容和前一次的笔记有部分重复。
基本需求:
一台境外服务器,可通过SSH访问,操作系统Ubuntu18.04或更高版本,root用户或有sudo权限;
一个由Cloudflare管理的域名,如sulian.me。为梯子用的子域名如ss.sulian.me添加一条A记录指向此服务器IP。
操作步骤:
1、安装shadowsocks-libev
libev是二进制版,比python版性能高些。
SSH登录到服务器,运行:
sudoaptupdate
sudoaptinstallshadowsocks-libev
暂时不做配置,等后续都安装好后再配置。
2、安装v2ray-plugin
先访问https://github.com/shadowsocks/v2ray-plugin/releases获得下载地址,由于我们用的是64位linux,下载linux-amd64版本。
下载后解压并改名复制到系统目录:
tarzxfv2ray-plugin-linux-amd64-v1.3.1.tar.gz
3
sudomvv2ray-plugin_linux_amd64/usr/bin/v2ray-plugin
3、安装nginx
直接通过apt进行安装:
sudoaptinstallnginx
4、安装acme.sh并申请证书
执行以下命令安装acme.sh:
curlhttps://get.acme.sh|sh
安装后如果acme.sh无法运行,关闭当前shell窗口重连即可。
目前最简洁方式是添加DNS记录验证域名,托管在Cloudflare的域名可以通过API进行自动化配置。
使用GlobalAPIKey是不安全的,我们可以为申请证书专门创建一个APIKey。
登录后访问个人资料-API令牌,创建令牌。

按图中的设置,添加权限:
区域-区域设置-读取;
区域-区域-编辑;
区域-DNS-编辑
并将区域资源设置为所有区域。
创建完成后保存APIKey。
然后在首页点击要配置的域名,滚动到右下角,复制并保存账户ID。
现在回到服务器,执行下面语句添加环境变量。申请证书后这些变量会被记录在文件中,之后会自动使用,无需重新设置。
exportCF_Token="刚才保存的APIKey"
exportCF_Account_ID="刚才保存的账户ID"
然后执行下面语句自动为域名ss.sulian.me申请证书:
[size=1em][size=1em]
acme.sh--issue--dnsdns_cf-dss.sulian.me
申请成功后证书保存到临时目录,我们需要安装到外部目录并保证每次证书更新后自动重启服务器来加载。
[size=1em][size=1em]
acme.sh--install-cert-dss.sulian.me
--key-file/etc/nginx/certs/ss.sulian.me.key
3
--fullchain-file/etc/nginx/certs/ss.sulian.me.cer
4
--reloadcmd"sudosystemctlrestartnginx"
安装完成后,每三个月证书会自动更新并重启nginx,无需人工干预。
5、配置服务
所有程序安装完成,证书申请成功后,就可以进行配置了。
首先编辑ss的配置文件/etc/shadowsocks-libev/config.json:
[size=1em][size=1em]
{
"server":"127.0.0.1",
3
"server_port":10080,
4
"password":"(你的密码)",
5
"timeout":60,
6
"method":"chacha20-ietf-poly1305",
7
"mode":"tcp_and_udp",
8
"fast_open":false,
9
"plugin":"v2ray-plugin",
10
"plugin_opts":"server;path=/test"
11
}
其中三个地方可以修改:
server_port端口号;
password密码;
plugin_opts里面的path,也就是通过web代理访问时的路径。
然后编辑nginx的配置文件。为方便管理,可以直接在/etc/nginx/conf.d下创建ss.sulian.me.conf,内容如下:
[size=1em][size=1em]
server{
listen443ssl;
3
sslon;
4
ssl_certificate/etc/nginx/certs/ss.sulian.me.cer;
5
ssl_certificate_key/etc/nginx/certs/ss.sulian.me.key;
6
ssl_protocolsTLSv1TLSv1.1TLSv1.2;
7
ssl_ciphersHIGH:!aNULL:!MD5;
8
server_namess.sulian.me;
9
root/var/www/html;
10
11
location/test{
12
proxy_redirectoff;
13
proxy_passhttp://127.0.0.1:10080;
14
proxy_http_version1.1;
15
proxy_set_headerUpgrade$http_upgrade;
16
proxy_set_headerConnection"upgrade";
17
proxy_set_headerHost$http_host;
18
proxy_set_headerX-Real-IP$remote_addr;
19
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
20
}
21
}
其中注意:
location后面的/test就是配置ss时plugin_opts里面的path;
proxy_pass最后跟的端口号10080就是配置ss时的server_port。
配置完成后,重启服务:
sudosystemctlrestartshadowsocks-libev
sudosystemctlrestartnginx
一个ss+v2ray+ws+tls的服务就配置好了。
6、客户端配置:
由于使用了v2ray,直接用原生ss客户端是无法连接的,需要根据操作系统分别配置:
- Windows用户:
一般使用的是官方客户端(https://github.com/shadowsocks/shadowsocks-windows/releases),除此之外还需要下载v2ray-plugin。
在https://github.com/shadowsocks/v2ray-plugin/releases下载最新的windows-amd64版,解压,将里面的.exe文件改名为v2ray-plugin.exe,放置在shadowsocks的运行目录下。
然后进入服务器配置,添加一个新服务器,内容如下:

特别注意的就是其中的“插件程序”和“插件选项”必须填写。
插件程序就是放置在shadowsocks目录下的插件可执行文件名;
插件选项分三部分,用分号隔开:tls必填;host为我们的域名;path则与服务器plugin_opts中的path一致。
配置完之后点击确定。就可以像普通shadowsocks客户端一样随意上网了,只是安全性更高了一些。
- iOS用户
以ShadowRocket(小火箭)为例,由于App已经内置了v2ray的支持,只需进行一些配置即可。
首先输入服务器名、端口和密码:

然后点击“插件”,选择v2ray-plugin,进入配置:

模式选择websocket,输入域名和路径,保存即可。
- Android用户:
将两者都安装好,启动后添加配置文件,按服务器的配置进行填写:

其中插件要选择v2ray,进入配置,同样按服务器进行填写。注意Transport mode要选websocket-tls:

配置完成后保存,就可以连接外网了。