部署一台抗封锁的SS服务器

6月25号更新的方法属于手动操作

目前秋水大佬已经将这一系列的软件: shadowsocks-libev,shadowsocks-rust,go-shadowsocks2,v2ray-plugin,xray-plugin 都放在rpm包里面了,安装卸载维护非常方便。

Shadowsocks 编译版 by Teddysun

 

2022年6月25日更新:使用v2ray-plugin 插件来伪装,增加隐蔽性。

1.请确保已经正确安装好了 ss-libev

没有安装则请看: 如何部署一台抗封锁的Shadowsocks-libev服务器

2.购买域名或申请免费域名

如果不是在 Cloudflare 购买域名, 还需要在域名提供商的管理后台将域名 DNS 解析替换成 Cloudflare DNS 例如阿里云,在域名列表,找到域名,点击最右边的管理,找到修改 DNS, 填入 Cloudflare 的 DNS(把域名添加到 Cloudflare 时会提供 Cloudflare 的 DNS)

3.登录 Cloudflare 并配置 dns 解析

本文参照的 Cloudflare 英文语言页面

  • cloudflare -> DNS Add Record 一条 A 记录;name=你的域名,ipv4=服务器IP地址, ProxyStatus=关闭(灰色) , TTL=Auto 配置完成后再设置成橙色代理模式

  • cloudflare -> SSL Full (strict) 总是开启 HTTPS ( 自签名证书选 Full )

  • 检查 DNS 解析 在本地电脑上 ping 域名, 确认和服务器的 ip 地址一致(由于 dns缓存 等原因可能需要过些时间才生效)

由于下面使用 acme 脚本申请的证书是 CA 颁发的,而不是自签证书,所以选择 Full (strict) 或者 Full 都行。又因为使用的是免费版套餐(cloudflare 的服务器在国外), 选择 Flexible 也行; 不管选 Flexible 、Full 还是 Full-strict , 想要 CDN 代理都需要把 cloudflare 的小云朵设置成橙色时才有意义。

4.申请免费 CA 证书

  • 和官方文档一样使用 acme 脚本自动申请免费证书 (免费证书有效期是 3 个月,该脚本会每隔 60 天自动更新一次证书有效期)

  • 准备 cloudflare 注册时的 Email

  • 准备 cloudflare api key ( 点击头像,然后点击 My Profile ,点击左侧列表的 API KEYs -> Global API KEY)

  • 申请证书(服务器)

export CF_Email="cloudflare 邮箱"
export CF_Key="cloudflare api key"
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --register-account -m 你的个人邮箱
~/.acme.sh/acme.sh --issue --dns dns_cf -d 你的域名

执行完上面命令,acme 脚本就会自动帮你申请好证书,证书存放在 root/.acme.sh/你的域名/ 目录下。里面包含了 fullchain.cer 和 .key 等文件。

v2ray-plugin 会自动识别并且引用 root/.acme.sh 下的证书文件;但更建议把证书拷贝到另外的目录为好.

  • 复制证书文件到指定目录(acme 脚本会自动更新对应的目录证书)
/root/.acme.sh/./acme.sh --install-cert -d 你的域名 --key-file /root/ssl/你的域名.key --fullchain-file /root/ssl/fullchain.cer

6.安装 v2ray-plugin

  • 方式2:直接下载使用官方编译好的可执行二进制文件 在 v2ray-plugin 页面直接下载对应 v2ray-plugin 执行文件, 解压后把文件移动到 /usr/bin/ 目录下 也可以使用 windows 下载到本地重命名为 v2ray-plugin, 然后再上传到服务器, 这里我使用的是 amd 64 位架构的文件作为例子:
wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.3.1/v2ray-plugin-linux-amd64-v1.3.1.tar.gz
tar -zxvf v2ray-plugin-linux-amd64-v1.3.1.tar.gz
rm v2ray-plugin-linux-amd64-v1.3.1.tar.gz
mv v2ray-plugin_linux_amd64 /usr/bin

最后记得将配置文件的 v2ray-plugin 文件名字修改成解压后的文件名字: v2ray-plugin_linux_amd64 如果 snap 的 ss 不能访问 /bin/v2ray-plugin , 就放到 snap 能访问的目录,如 root 或者 var

7. ss + v2ray-plugin 配置

  • https(websocket + tls)
{
  "server": "0.0.0.0",
  "nameserver": "8.8.8.8",
  "server_port": 443,
  "password": "你的密码",
  "method": "chacha20-ietf-poly1305",
  "timeout": 400,
  "no_delay": true,
  "mode": "tcp_and_udp",
  
  "plugin": "root/v2ray-plugin",
  "plugin_opts": "server;tls;mode=websocket;host=你的域名;cert=/证书目录/fullchain.cer;key=/证书目录/你的域名.key"
}
  • http3(quic)
{
  "server": "0.0.0.0",
  "nameserver": "8.8.8.8",
  "server_port": 443,
  "password": "你的密码",
  "method": "chacha20-ietf-poly1305",
  "timeout": 400,
  "no_delay": true,
  "mode": "tcp_only",
  
  "plugin": "v2ray-plugin",
  "plugin_opts": "server;mode=quic;host=你的域名;cert=/证书目录/fullchain.cer;key=/证书目录/你的域名.key"
}

Quic 默认强制启用了 tls,所以不需要再在 plugin-opts 中再添加 tls 选项 Quic 的内部使用的是 udp, 为了让 v2ray-plugin 的 quic 处理 udp, 所以不要在 ss 配置中使用 udp

  • 重启 ss 然后在浏览器上用 https 访问域名,是否返回显示 Bad Request, 并查看 https 是否安全(点击地址栏左边的小锁头), 如果没问题就可以去配置客户端来使用了

  • 配置文件中需要注意:

  1. v2ray-plugin 和 ss-server 文件的路径要正确

  2. 开放 443 端口

  3. host=你的域名(不包含 https 或 http)

  4. cert=证书存放的位置/fullchain.cer

  5. ket=证书存放的位置/xxxxxx.com.key

  6. cloudflare -> Network 打开 Http/3 (如果使用 quic)

8.Windows

先下载ss客户端:

https://github.com/shadowsocks/shadowsocks-windows/releases

  • 请先把 v2ray-plugin-win.exe 文件下载到本地 SS 目录下
  • 服务器地址: xxxxxxx.com
  • 端口: 443
  • 密码和加密看自己的配置文件
  • 插件程序:v2ray-plugin
  • 插件选项: tls;host=xxxxxx.com

9.Android

  • 和 PC 差不多,从 github 或 谷歌应用市场下载安装 v2ray-plugin-android.apk,
  • Trasport mode 选择: websocket-tls
  • Hostname:xxxxxxxx.com
  • 剩下默认即可(如果使用自签名证书,需要下载证书到本地使用)

10.最后

  • 如果你看重的是隐蔽性,那么将 cloudflare -> DNS 的灰色云朵改为橙色,利用 cloudflare 中转代理, 此时数据会从客户端先发往 cloudflare
  • 如果服务器在香港等临近的区域, 不建议开启中转代理, 因为会让流量绕一大圈才到达客户端(延迟增大)
  • 如果中转代理速度实在太慢,就把小云朵改成灰色的 dnsonly。数据依然是 websocket + tls 隐蔽加密传输的。
  • 由于 quic 的普及程度还不够高,受 qos 等限制, 选择 quic 可能会很慢.

参考地址:https://gist.github.com/shuanghua/c9c448f9bd12ebbfd720b34f4e1dd5c6

 

 

2022年6月7日更新:

昨天上午学校网络中心打电话来问我上外网干什么的,今年是严打时期,警告我不要再用了!已经是第二次被抓到了,就没敢再用了。

今天上午导员又打电话来问我是不是科学上网了,干什么的?还要写一个报告下午去找她。

过一会导师又让我过去谈话,让不要用了!

所以不封锁但还是被发现了,这有什么意义?即使加密了但还是知道你在通信!

这篇教程记录了如何安装,配置并维护一台Shadowsocks-libev服务器。 这篇教程的亮点在于, 按照这里的配置建议,你的Shadowsocks-libev服务器可以抵御各种已知的攻击, 包括来自GFW的主动探测和封锁以及partitioning oracle攻击。 我们还在教程的最后加入了有关Shadowsocks-libev部署的常见问题。 截止2021年11月7日,我们收到零星的用户报告按此教程配置的服务器仍遭到了端口封锁,我们因此在文中分享一个配置备用端口来缓解端口封锁的方法。

安装Snap应用商店(VPS虚拟机架构必须为KVM)

  • 如果你的服务器运行Ubuntu 16.04 LTS及以上的版本,Snap已经默认安装好了。
  • 如果你的服务器运行了其他的Linux发行版,你只需跟着对应的发行版安装Snap core

在 Debian 9 (Stretch) 和更新版本上,可以直接从命令行安装 snap:

apt update
apt install snapd
snap install core

安装Shadowsocks-libev

snap install shadowsocks-libev --edge

配置

现在打开通过Snap安装的Shadowsocks-libev默认的配置文件:

nano /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json

下面是我们推荐的Shadowsocks-libev服务器配置:

{
    "server":["::0","0.0.0.0"],
    "server_port":8399,
    "method":"chacha20-ietf-poly1305",
    "password":"7IS+B1Qjh1NnNGo3mXUjqg==",
    "mode":"tcp_and_udp",
    "fast_open":false
}

注意,你需要把里面的ExamplePassword替换成一个更强的密码。 强密码有助缓解最新发现的针对Shadowsocks服务器的Partitioning Oracle攻击。 (你可以用以下命令在终端生成一个强密码:openssl rand -base64 16)。

你还可以考虑将server_port的值从10000改为102465535之间的任意整数。

将上方替换过密码的配置信息复制粘贴到配置文件后, 按Ctrl + x退出。 退出时,文本编辑器将问你"Save modified buffer?",请输入y然后按回车键。

防火墙

我们使用ufw来管理Shadowsocks服务器的防火墙。

在基于Debian的服务器上,可以通过如下命令安装ufw

apt install -y ufw

然后开放有关sshShadowsocks-libev的端口。 (请注意,以下命令假设你在/var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json中的server_port的值为8399。)

如果你的server_port用了其他的值,请对以下命令作相应的修改:

ufw allow ssh
ufw allow 8399

现在我们启动ufw:

ufw enable

启动时如果弹出Command may disrupt existing ssh connections. Proceed with operation (y|n)?,请输入y并按回车键。

最后,请用ufw status检查一下你的配置是否和下面的一样:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
8399                      ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
8399 (v6)                  ALLOW       Anywhere (v6)

运行Shadowsocks-libev

启动Shadowsocks-libev:

systemctl start snap.shadowsocks-libev.ss-server-daemon.service

设置Shadowsocks-libev开机自启动:

systemctl enable snap.shadowsocks-libev.ss-server-daemon.service

以下命令可以查看Shadowsocks-libev的运行状态:

systemctl status snap.shadowsocks-libev.ss-server-daemon.service

如果你看到绿色的Active: active (running),那么你的Shadowsocks-libev服务器就在正常的运行; 如果你看到红色的Active: failed,请用跳至如下命令journalctl -u snap.shadowsocks-libev.ss-server-daemon.service的尾部查看问题出在哪里了。

重新加载配置文件

每当你修改过配置文件后,请用如下命令重启Shadowsocks-libev以加载修改后的文件:

systemctl restart snap.shadowsocks-libev.ss-server-daemon.service

配置备用端口来缓解端口封锁

截止2021年11月7日,我们收到零星的用户报告按此教程配置的服务器仍遭到了端口封锁。

因为报告的封锁方式均为端口封锁,而非IP封锁,我们在此分享一个用备用端口来缓解端口括封锁的方法。

你可以在服务器上使用以下命令来将服务器从1200012010端口接收到的TCP和UDP流量全部转发到8388端口:

iptables -t nat -A PREROUTING -p tcp --dport 12000:12010 -j REDIRECT --to-port 8399
iptables -t nat -A PREROUTING -p udp --dport 12000:12010 -j REDIRECT --to-port 8399

记得:

  1. 12000:12010替换成一个只有你自己知道的端口号,或者端口区间(我们建议从102465535之间任选几个端口或一个区间)。
  2. 8399端口替换成你的Shadowsocks服务端实际使用的端口。

这样一来,如果你使用的12000端口遭到了封锁,那么你无须更换IP,或者登录服务器修改配置文件。而是只需要在客户端(电脑或者手机上)将端口从12000改为12001就可以继续使用了。

如果你配置正确,那么以下命令的输出应该类似于:

iptables -t nat -L PREROUTING -nv --line-number
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpts:12000:12010 redir ports 8399
2        0     0 REDIRECT   udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:12000:12010 redir ports 8399

注意任何102465535的端口都可以作为备用端口。即使使用ephermeral端口(/proc/sys/net/ipv4/ip_local_port_range)作为配用端口也不会干扰服务器正常的向外连接。

常见问题

Q:为什么我用了教程里的配置,服务器还是被封了?

A: 截止2021年11月7日,我们收到零星的用户报告服务器的端口被封。因为通过这篇教程配置的Shadowsocks-libev服务器已经可以抵御已知的所有来自GFW的主动探测,所以有可能审查者使用了未知的攻击手段。如果你也遇到了类似问题,请考虑使用上述的备用端口方法来缓解封锁。我们鼓励你将封锁情况汇报给我们,我们会认真地调查。

Q: 我应不应该从发行版的仓库下载安装Shadowsocks-libev?

A: 发行版仓库里的Shadowsocks-libev不一定是最新版的。比如,截止2021年1月,Debian buster仓库的Shadowsocks-libev的版本为v3.2.5。而这个版本的Shadowsocks-libev是不够防御来自GFW的主动探测的(详见Figure 10)。

Q: 我应该怎样更新用Snap安装的Shadowsocks-libev?

A: 因为Snap会每天自动更新通过其安装的软件,因此通常情况下你不需要手动更新。如若需要手动更新,请用: sudo snap refresh

Q: 为什么用chacha20-ietf-poly1305作为加密方式?

A: 因为它是其中一种AEAD ciphers。而AEAD ciphers可以抵御来自GFW的主动探测。它同时也是Shadowsocks-libev及OutlineVPN的默认加密方式。

Q: 我应该用Shadowsocks的stream cipher吗?

A: 完全不应该。因为Shadowsocks的stream cipher有着不可接受的安全隐私漏洞,并且可以被准确的主动探测。如Figure 10所示,即使是最新版的Shadowsocks-libev,在使用stream cipher时同样可以被准确识别。更具灾难性的是,在不需要密码的情况下,攻击者可以完全解密被记录下来的Shadowsocks会话

Q: 但为什么我用的机场仍在使用stream cipher?

A: 这清楚地说明你的机场缺乏安全意识和安全措施。请把这篇教程这个演讲,和这篇总结,分享给你的机场主。

Q: 我应该把配置中的server_port改为像443这样的常见端口吗?

A: 不应该。因为不论你使用哪个端口,GFW都会检测并怀疑你的Shadowsocks流量。

Q: 为什么配置文件使用tcp_and_udp模式?

A: 我们之前使用tcp_only模式是为了缓解Partitioning Oracle攻击。但正如Vinicius所指出的,如果你使用了长的随机密码,那么partitioning oracle攻击就不能成功。因此也就不需要禁用UDP代理模式。开启UDP代理模式可能会让经过Shadowsocks代理的视频通话质量更佳。

Q: 为什么配置文件禁用了fast_open?

A: 我们推荐你阅读这里的讨论

联系

这篇报告首发于GFW Report。我们鼓励您或公开地或私下地分享您的评论或疑问。我们私下的联系方式可见GFW Report的页脚。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录