使用Apache反代Shadowsocks并通过Cloudflare worker加速

前面的文章讲到过如何搭建Shadowsocks+V2ray-plugin,但是由于使用了一键安装脚本,当服务器上已经有HTTP服务器在运行时,必然会出现端口冲突的问题。为了使两者能共存,我们来手动安装并设置反向代理。

p.s. 本文使用的环境为Ubuntu18 + Apache2.4,且默认已有一个域名指向了当前服务器。

安装Shadowsocks

我们使用秋水逸冰的一键安装脚本来安装Shadowsocks:

wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh

chmod +x shadowsocks-all.sh

./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log

注意安装的时候选择安装Shadowsocks-libev版本,并且不需要安装simple-obfs

其余选项按照提示自定义即可。其中path我用了根目录/

安装完后有几个管理命令可能会用到:

  • 启动/关闭/重启/查看运行状态:
/etc/init.d/shadowsocks-libev start
/etc/init.d/shadowsocks-libev stop
/etc/init.d/shadowsocks-libev restart
/etc/init.d/shadowsocks-libev status
  • 查看日志(由于找不到日志存放地址,直接查看系统日志)
tail -f /var/log/syslog
  • 手动运行(实时查看日志,用于测试,ctrl+c即可停止运行)
/usr/local/bin/ss-server -v -c /etc/shadowsocks-libev/config.json
  • 修改配置文件
nano /etc/shadowsocks-libev/config.json

安装v2ray-plugin

进入v2ray-plugin的release页面,找到需要的版本并下载。我用的是linux-amd64-v1.3.1:

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

并移动到其他地方,如/var/www/gfw,重命名为v2ray-plugin

mv v2ray-plugin_linux_amd64 /var/www/gfw/v2ray-plugin

修改权限:

chmod 755 /var/www/gfw/v2ray-plugin

修改Shadowsocks的配置文件,加入如下两行:

"plugin":"/var/www/gfw/v2ray-plugin",
"plugin_opts":"server;path=/;mode=websocket;host=指向服务器的域名"

如果path不是根目录,根据自己的实际情况修改,如path=/test

重启Shadowsocks,或关闭Shadowsocks后手动启动看一下日志是否正常。

安装Certbot

certbot可以用来申请免费SSL证书。官网有详细的安装步骤。对于Ubuntu18 + Apache2,只需如下命令:

snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

Apache设置

首先需要开启Apache模块:

a2enmod ssl
a2enmod proxy
a2enmod proxy_wstunnel
a2enmod proxy_http
a2enmod rewrite
a2enmod headers

新建一个虚拟主机:

nano /etc/apache2/site-available/gfw.conf

输入如下内容:

<VirtualHost *:80>
        ServerName 指向服务器的域名
        ServerAdmin [email protected]
        DocumentRoot /var/www/gfw
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

保存并启用:

a2ensite

从列表中选择刚刚新建的主机,并重新加载apache使其生效:

systemctl reload apache2

通过Certbot获取证书:

certbot --apache

选择刚刚新建的主机,将会自动获取证书。再次提醒:域名必须指向当前服务器IP

完成后,修改虚拟主机配置文件:

nano /etc/apache2/site-available/gfw-le-ssl.conf

在DocumentRoot下面新加下面内容:

ProxyRequests Off
ProxyPreserveHost On
RequestHeader set Host %{HTTP_HOST}s
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
ProxyPass / ws://127.0.0.1:9000  upgrade=WebSocket

其中9000为Shadowsocks使用的端口号,根据自己的实际情况自行修改。

如果shadowsocks中配置的path不是根目录,根据实际情况修改,如:

ProxyRequests Off
ProxyPreserveHost On
RequestHeader set Host %{HTTP_HOST}s
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
ProxyPass /test ws://127.0.0.1:9000  upgrade=WebSocket

重新加载apache使其生效:

systemctl reload apache2

客户端配置

在Clash中该节点配置如下:

  - name: "随意"
    type: ss
    server: 指向服务器的域名
    port: 443
    cipher: 加密方式
    password: "密码"
    plugin: v2ray-plugin
    plugin-opts:
      mode: websocket
      tls: true
      skip-cert-verify: true
      host: 指向服务器的域名
      path: "/或者自定义的path如/test"
      mux: true

在其他客户端中,插件选择v2ray-plugin,插件选项为:

tls;host=指向服务器的域名

套Cloudflare

首先你得有一个Cloudflare账号。

在Cloudflare后台,找到Workers:

选择Manage Workers>Create a Worker,在新窗口的Script中输入下面代码:

addEventListener(
    "fetch", event => {
        let url = new URL(event.request.url);
        url.hostname = "指向服务器的域名";
        url.protocol = "https";
        let request = new Request(url, event.request);
        event.respondWith(
            fetch(request)
        )
    }
)

点击左上角gfw2的地方可以自定义子域名。

选择Save and Deploy即可完成部署。

在客户端中,用左上角的域名替代原本的域名即可。

自选Cloudflare的IP(可选)

如果对套上Cloudflare后的速度不满意,可以通过自选Cloudflare的IP来加速。

下载此项目下的工具,直接运行其中的二进制文件即可进行测速,完成后在同目录下会生成结果文件result.csv,挑选其中最满意的IP,在本地hosts文件中新加一行:

IP Worker应用的域名
%d 博主赞过: