RE:137

时间是唯一致死的毒药。

自建科学上网代理服务

R.I.P 左耳朵

写在前面#

首先推荐参考左耳朵的文章《科学上网》,讲得很全面!(配置部分可以参考一下 GOST 的官方文档以及 Clash 的官方文档

同时在此大力感谢 Yuki 的帮助!

关于服务器#

目前使用了一个 Amazon EC2 (Osaka) 和一个 Amazon Lightsail (Tokyo) 来搭建 GOST 代理,主要区别是:Lightsail 有 IPv6 地址而 EC2 没有(以及 Lightsail 现在有前三个月免费的活动)。经测试,在电脑端不管是用 Clash 还是 GOST 均可科学上网,并且日间使用速度尚可;但是在 华为 手机上使用 ClashForAndroid 来代理时就失败了(华为真的不行)。之后若这两个服务器不能满足使用,会考虑购买 BandwagonHost 的 CN2 节点

我的服务器预装的操作系统均为 Debian GNU/Linux 11 (bullseye)。

设置 Docker 服务#

(为了方便复制,文章中的命令前均不添加$符号。)

根据官方文档 Install Docker Engine on Debian 进行安装,用到的命令复制如下:

Step 1:安装 prerequisit#

sudo apt install ca-certificates curl gnupg

Step 2:添加 Docker 的官方 GPG key#

sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Step 3:设置 repository#

echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Step 4:安装 Docker Engine#

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Step 5:测试是否安装#

sudo docker run hello-world

这时屏幕上如果显示如下信息则证明安装成功了!

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256: 一串乱码
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

附:Docker 基本使用方法#

docker image ls             # 列出本机的所有 image 文件
docker image rm [imageName] # 删除 image 文件

docker container ls    # 同下
docker ps              # 列出本机正在运行的容器
docker container ls -a # 同下
docker ps -a           # 列出本机所有容器,包括终止运行的容器

docker container kill [containerID] # 终止不会自动终止的容器
docker container rm [containerID]   # 删除已经终止运行的容器

执行以上命令时都需要 sudo,如果不想这么麻烦的话,可以将你目前的用户添加进 docker 组:

sudo usermod -aG docker [UserName]

开启 TCP BBR 拥塞控制算法#

虽然不太明白这一步是做什么的,但是看到 “Google 在 YouTube 上应用该算法,将全球平均的 YouTube 网络吞吐量提高了 4%,在一些国家超过了 14%”,就稀里糊涂地按照教程《开启 TCP BBR 拥塞控制算法》把这个算法打开了。仍旧把安装时用到的命令复制在下面:

Step 1:查看内核版本#

uname -r

屏幕输出

5.10.0-19-cloud-amd64
┄┄┄┄┬┄┄┄┄
    └┄┄┄┄┄┄> 内核版本只要大于 4.9 就没有问题啦!

Step 2:检测 BBR 是否已经启动#

lsmod | grep bbr # 结果中没有 "tcp_bbr" 的话就执行下一步

Step 3:一些看不懂的复杂的配置#

sudo modprobe tcp_bbr
echo "tcp_bbr" | sudo tee --append /etc/modules-load.d/modules.conf
echo "net.core.default_qdisc=fq" | sudo tee --append /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee --append /etc/sysctl.conf

sudo sysctl -p

屏幕输出

tcp_bbr
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

Step 4:测试内核是否开启 BBR#

sudo sysctl net.ipv4.tcp_available_congestion_control
sudo sysctl net.ipv4.tcp_congestion_control

屏幕输出

net.ipv4.tcp_available_congestion_control = reno cubic bbr
net.ipv4.tcp_congestion_control = bbr                  ┄┬┄
                                  ┄┬┄                   v
                                   └┄┄┄> 这里都有 bbr 则说明开启成功

Step 5:再次测试 lsmod | grep bbr#

# 屏幕输出
tcp_bbr                20480  1

这样就成功开启了 BBR。

用 GOST 设置 HTTPS 服务#

Step 0:使用 Certbot 发行 SSL/TLS 证书#

这里默认你已经将你的域名通过 DNS 服务器解析到了你的服务器的 IP 地址上,并且服务器的 80 (HTTP)443 (HTTPS) 端口也已经打开。下面把用到的命令复制一下。(Certbot official manual)(Snap official manual

Step 1:安装 Snap#

sudo apt install snapd
sudo snap install core          # 这是为了获取最新版本的 snapd
                                # 若之前安装过,则用 sudo snap refresh core 来保持为最新版本

sudo snap install hello-world   # 测试是否安装成功
hello-world                     # 这里我就没有成功,需要将 /snap/bin 添加进系统的 PATH
                                # 或在 /usr/bin 中添加一个指向 /snap/bin 的软链接

Step 2:安装 Certbot#

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot # 这个就是前面提到的添加软链接!

Step 3:发行证书#

sudo certbot certonly --standalone # 之后根据提示操作就可以

注:
我在配置的时候发现,如果服务器上已经安装了别的证书,或是域名已经被 Nginx 代理了的话,GOST 就不能顺利地启动起来。

启动 GOST 代理#

这里基本直接照抄左耳朵文章中的脚本(修改了一点点来使用最新的 GOST v3),更多细节配置可以参考官方文档小细节:GOST 官方网站顶级域名是 run)。

Step 1:利用脚本启动 GOST#

首先创建一个脚本,

touch gost_docker.sh
chmod +x gost_docker.sh

然后在脚本中复制如下内容:

#!/bin/bash
                          ┐
DOMAIN="YOU.DOMAIN.NAME"  ┆
USER="username"           ┆
PASS="password"           ├┄┄┄┄┄┄> 这些需要改成自己的
PORT=443                  ┆
                          ┘

BIND_IP=0.0.0.0
CERT_DIR=/etc/letsencrypt
CERT=${CERT_DIR}/live/${DOMAIN}/fullchain.pem
KEY=${CERT_DIR}/live/${DOMAIN}/privkey.pem
sudo docker run -d --name gost \
    -v ${CERT_DIR}:${CERT_DIR}:ro \
    --net=host gogost/gost \
    -L "http2://${USER}:${PASS}@${BIND_IP}:${PORT}?cert=${CERT}&key=${KEY}&probe_resist=code:404&knock=www.google.com"

保存退出后执行 ./gost_docker.sh,应该会出现如下输出:

Unable to find image 'gogost/gost:latest' locally
latest: Pulling from gogost/gost
f56be85fc22e: Pull complete
2e26542b3a4e: Pull complete
4f4fb700ef54: Pull complete
72cffe755f57: Pull complete
Digest: sha256:一串乱码
Status: Downloaded newer image for gogost/gost:latest
一串乱码

Step 2:检查 GOST 服务状态#

执行 docker ps 来确认 docker 服务有没有启动起来,输出应该像下面这样:

CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS       PORTS     NAMES
45740e811f4f   gogost/gost   "/bin/gost -L http2:…"   7 hours ago   Up 7 hours             gost

连通性测试:

curl -v "https://www.google.com" --proxy "https://YOUR.DOMAIN.HERE" --proxy-user 'USER:PASS' 2>&1 >/dev/null | grep -w '200'

出现这样的输出就说明没什么问题了!

< HTTP/1.1 200 OK
* Ignoring Transfer-Encoding in CONNECT 200 response
* Proxy replied 200 to CONNECT request
< HTTP/2 200

配置 WARP (by Cloudflare)#

因为有一键脚本,所以参考《科学上网》9.4.1 小节一步一步配置就可以了。

wget git.io/warp.sh # 下载脚本
chmod +x warp.sh

sudo ./warp.sh menu # 安装其中的 1、4、7 三项(安装每项均需再次执行此命令)

sudo ./warp.sh status # 测试运行状况
curl ipinfo.io

有类似的输出就说明 WARP 也没有问题了!

# 屏幕输出
----------------------------
WARP Client	: Running
SOCKS5 Port	: Off
----------------------------
WireGuard	: Running
IPv4 Network	: WARP
IPv6 Network	: WARP
----------------------------

{
  ......
  "org": "AS13335 Cloudflare, Inc.",
  ......
}%

本地 Clash 配置#

在 Mac 上直接执行brew install clashx 来安装 ClashX。(Windows 下可使用 ClashForWindows 之类的客户端,配置起来大同小异。)安装完成后在 ~/.config/clash 中新建一个配置文件(比如我的就是 gost.yaml),内容如下:

proxies:
  - name: "name1"
    type: http
    server: YOUR.DOMAIN.NAME1
    port: 443
    username: USER1
    password: PASSWD1
    tls: true
    skip-cert-verify: false

  - name: "name2"
    type: http
    server: YOUR.DOMAIN.NAME2
    port: 443
    username: USER2
    password: PASSWD2
    tls: true
    skip-cert-verify: false

  - ...

策略组之类的我嫌麻烦就没有设置,全局模式常开。(反正也不怎么看国内的网站,想看 bilibili 的时候关一下就好了)

最后在命令行配置代理。在 ~/.zshrc 或是 ~/.bashrc 中添加类似下面这样的命令就可以方便地开启、关闭代理和查询状态了:

alias pon="export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890"
alias poff="unset https_proxy http_proxy all_proxy"
alias pstat="env | grep -i proxy"

终于可以享受安全自由的网络了!Hurray!