之前曾经将自用梯子由单纯的ss升级为ss+v2ray,但随着墙的继续增高,这种模式被检测封锁的可能性也在增加。
目前最稳妥的方案是在最外面包裹一层Web反向代理,通过websocket转发到v2ray服务。这样甚至可以模拟一个真实存在的网站,其中隐藏一个网址作为梯子,暴露的几率大大降低。
本文是配置此方案过程中的笔记,为保证完整性,内容和前一次的笔记有部分重复。
基本需求:
- 一台境外服务器,可通过SSH访问,操作系统Ubuntu 18.04或更高版本,root用户或有sudo权限;
- 一个由Cloudflare管理的域名,如sulian.me。为梯子用的子域名如ss.sulian.me添加一条A记录指向此服务器IP。
操作步骤:
1、安装shadowsocks-libev
libev是二进制版,比python版性能高些。
SSH登录到服务器,运行:
sudo apt update sudo apt install shadowsocks-libev
暂时不做配置,等后续都安装好后再配置。
2、安装v2ray-plugin
先访问https://github.com/shadowsocks/v2ray-plugin/releases获得下载地址,由于我们用的是64位linux,下载linux-amd64版本。
下载后解压并改名复制到系统目录:
wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.3.1/v2ray-plugin-linux-amd64-v1.3.1.tar.gz tar zxf v2ray-plugin-linux-amd64-v1.3.1.tar.gz sudo mv v2ray-plugin_linux_amd64 /usr/bin/v2ray-plugin
3、安装nginx
直接通过apt进行安装:
sudo apt install nginx
4、安装acme.sh并申请证书
执行以下命令安装acme.sh:
curl https://get.acme.sh | sh
安装后如果acme.sh无法运行,关闭当前shell窗口重连即可。
目前最简洁方式是添加DNS记录验证域名,托管在Cloudflare的域名可以通过API进行自动化配置。
使用Global API Key是不安全的,我们可以为申请证书专门创建一个API Key。
登录后访问个人资料-API令牌,创建令牌。
按图中的设置,添加权限:
- 区域-区域设置-读取;
- 区域-区域-编辑;
- 区域-DNS-编辑
并将区域资源设置为所有区域。
创建完成后保存API Key。
然后在首页点击要配置的域名,滚动到右下角,复制并保存账户ID。
现在回到服务器,执行下面语句添加环境变量。申请证书后这些变量会被记录在文件中,之后会自动使用,无需重新设置。
export CF_Token="刚才保存的API Key" export CF_Account_ID="刚才保存的账户ID"
然后执行下面语句自动为域名ss.sulian.me申请证书:
acme.sh --issue --dns dns_cf -d ss.sulian.me
申请成功后证书保存到临时目录,我们需要安装到外部目录并保证每次证书更新后自动重启服务器来加载。
acme.sh --install-cert -d ss.sulian.me \ --key-file /etc/nginx/certs/ss.sulian.me.key \ --fullchain-file /etc/nginx/certs/ss.sulian.me.cer \ --reloadcmd "sudo systemctl restart nginx"
安装完成后,每三个月证书会自动更新并重启nginx,无需人工干预。
5、配置服务
所有程序安装完成,证书申请成功后,就可以进行配置了。
首先编辑ss的配置文件 /etc/shadowsocks-libev/config.json:
{ "server":"127.0.0.1", "server_port":10080, "password":"(你的密码)", "timeout":60, "method":"chacha20-ietf-poly1305", "mode":"tcp_and_udp", "fast_open":false, "plugin":"v2ray-plugin", "plugin_opts":"server;path=/test" }
其中三个地方可以修改:
- server_port端口号;
- password密码;
- plugin_opts里面的path,也就是通过web代理访问时的路径。
然后编辑nginx的配置文件。为方便管理,可以直接在/etc/nginx/conf.d下创建ss.sulian.me.conf,内容如下:
server { listen 443 ssl; ssl on; ssl_certificate /etc/nginx/certs/ss.sulian.me.cer; ssl_certificate_key /etc/nginx/certs/ss.sulian.me.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; server_name ss.sulian.me; root /var/www/html; location /test { proxy_redirect off; proxy_pass http://127.0.0.1:10080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
其中注意:
- location后面的/test就是配置ss时plugin_opts里面的path;
- proxy_pass最后跟的端口号10080就是配置ss时的server_port。
配置完成后,重启服务:
sudo systemctl restart shadowsocks-libev sudo systemctl restart nginx
一个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用户:
官方客户端:https://github.com/shadowsocks/shadowsocks-android/releases
官方插件:https://github.com/shadowsocks/v2ray-plugin-android/releases
将两者都安装好,启动后添加配置文件,按服务器的配置进行填写:
其中插件要选择v2ray,进入配置,同样按服务器进行填写。注意Transport mode要选websocket-tls:
配置完成后保存,就可以连接外网了。
搭好之后第二天早上端口就被墙了,看上面的留言,这方法看来还是容易被识别
对照配置发现ss配置文件中加入插件的两行后无法启动服务器端了,看了github关于插件用法的说明,没提到代理路径这一项。想请教下路径的含义和配置方法。
shadowsocks-libev.service – Shadowsocks-libev Default Server Service
Loaded: loaded (/lib/systemd/system/shadowsocks-libev.service; enabled; vendo
Active: failed (Result: exit-code) since Tue 2023-06-06 16:15:08 EDT; 34min a
Docs: man:shadowsocks-libev(8)
Process: 5660 ExecStart=/usr/bin/ss-server -c $CONFFILE $DAEMON_ARGS (code=exi
Main PID: 5660 (code=exited, status=255)
Jun 06 16:15:08 salix systemd[1]: Started Shadowsocks-libev Default Server Servi
Jun 06 16:15:08 salix ss-server[5660]: 2023-06-06 16:15:08 ERROR: 8:0: Expected
Jun 06 16:15:08 salix systemd[1]: shadowsocks-libev.service: Main process exited
Jun 06 16:15:08 salix systemd[1]: shadowsocks-libev.service: Failed with result
状态记录显示启动失败
是我蠢了,漏了个逗号,不过ss和nginx都active running后客户端没连上。之后按顺序再装一遍试试吧
大佬,我目前已经是SS+V2ray plugin的配置了,现在要怎么操作呢?证书什么的都已经安装了,但是没有申请那个CF的KEY,直接用你的命令申请的,并移动了目录。
现在是直接安装nginx,并配置nginx文件,同时修改SS的配置文件,就可以做到像本文讲的这样了吗?
还是需要从头来过?
对背后技术原理不清楚的话建议从头来,毕竟有些地方一旦遗漏就是个难以查出问题的坑。
写的很清楚。谢谢大佬。
有问题筒子检查下这些地方
1/ config.json处的端口(10080) 和 location处的端口相同;nginx server 监听的端口(443)和ss客户端的端口相同
2/ cloudflare的DNS解析,proxy status 改为 DNS only,否则也会出错。
其实改成proxied也是一种方案,等于cloudflare替你中转。如果服务器本身不快甚至已经被墙可以用这种方法拯救一下。
而且证书也不用更新了,直接用cloudflare的回源证书。
2022年10月起,这个方案现在好像会被盯上,端口没几天就没了,好在IP没事,不知道博主有没有类似的情况
目前还没有,在二十大封得最严的时候也一直流畅。
我也是,最近已经换了好几个端口了,只要晚上一用第二天很大概率就会被噶
大佬,请教一下,既然现在已经开启tls了,ss还有必要chacha20-ietf-poly1305加密嘛?还望指点一二。
加密这东西,能用较新的、主流的就不要为了省那点所谓的计算资源。SS不仅是为了加密还为了混淆,能存活下来的不仅是不被窃听,甚至连“是SS流量”这件事都尽可能隐瞒起来。
楼主,我有2个问题:1、我的系统是CENT OS 7 没有 APT命令怎么办? 2、 acme.sh 安装后执行楼主的命令显示COMMAND NOT FOUND:127怎么办? 3、export CF_Account_ID=”刚才保存的账户ID” 是填的是我在Cloudflare的注册账号(邮箱地址)吗?
你这个问题怕是会被别人笑死。
web代理访问时的路径 这里填什么
学到了,感谢大佬
按照文章方法配置完成,但是客户端连接不上……不知道哪里有问题……客户端用ss+v2方式现在正常。然后你文章中有个地方需要手工新建目录,否则步骤不对。
所有客户端都连不上还是某个平台的连不上?
是/etc/nginx/conf.d下创建ss.sulian.me.conf这个Nginx配置文件出问题了吧。我弄的时候说没有这个目录