科学上网 - 最佳实践


科学上网最佳实践

参考左耳朵的文章: https://github.com/haoel/haoel.github.io

创建代理服务器

Google Cloud VM

  1. 首先创建VPC 网络

    • 名称: “name of the vac”
    • 子网创建模式:自定义
    • 新子网:
      • 名称:“name of the subnet”
      • 区域: “select the region”
      • IPv4 范围: “IP address range for the subnet”
    • 防火墙规则
      • 可以选择与定义的规则, 比如allow-icmp, allow-rep, allow-ssh
      • 需要新建allow-https,允许访问443 端口(此端口是代理端口,后文会提到)
  2. 创建虚拟VM: Computer Engine - > 虚拟机实例 -> 新建虚拟机实例

    • 名称: “name of the VM”

    • 区域/可用区:”select the region and AZ”

      区域建议选择TW: asia-east1

    • 机器配置

      • 系列: 第一代 N1
      • 机器类型: e2-micro
    • 启动磁盘

      • 更改映像image: Ubuntu 18.04 LTS
    • 防火墙

      • 允许HTTPS 流量
    • 高级选项 - > 网络

      • 网络接口: 选择之前设置的VPC 网络和子网
  3. SSH 到创建的虚拟VM

    • 本地生成相应的SSH public key (macOS)

      1
      ssh-keygen -t rsa -f ~/.ssh/<username>_gcp_key -C <your-user-name-for-SSH>
    • 拷贝public key的内容到虚拟VM

      1
      cat ~/.ssh/<username>_gcp_key.pub

      虚拟机 -> 元数据 -> SSH 密钥 -> 修改, 添加一项,添加拷贝的public key的内容

    • SSH 连接到VM

      1
      ssh -i /Users/<username>/.ssh/id_rsa <your-user-name-for-ssh>@<public-ip or hostname>

配置代理服务器

安装设置Docker

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt-get update
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

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

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

sudo docker run hello-world

开启TCP BBR 拥塞控制算法

TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google设计,于2016年发布的拥塞算法。以往大部分拥塞算法是基于丢包来作为降低传输速率的信号,而BBR则基于模型主动探测。该算法使用网络最近出站数据分组当时的最大带宽和往返时间来创建网络的显式模型。数据包传输的每个累积或选择性确认用于生成记录在数据包传输过程和确认返回期间的时间内所传送数据量的采样率。该算法认为随着网络接口控制器逐渐进入千兆速度时,分组丢失不应该被认为是识别拥塞的主要决定因素,所以基于模型的拥塞控制算法能有更高的吞吐量和更低的延迟,可以用BBR来替代其他流行的拥塞算法,例如CUBIC。Google在YouTube上应用该算法,将全球平均的YouTube网络吞吐量提高了4%,在一些国家超过了14%。

BBR之后移植入Linux内核4.9版本,并且对于QUIC可用。

如果开启,请参看 《开启TCP BBR拥塞控制算法

1
2
3
4
5
6
7
8
9
10
uname -r
lsmod | grep bbr
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
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr

准备域名, DNS解析,HTTPS证书

  1. 域名

    • 直接从腾讯云DNSPod 购买的域名和DNS 服务
  2. DNS 解析

    • 创建一个A 记录指向后续创建的虚拟机 (公网地址)
  3. 安装certbot

    1
    2
    3
    4
    5
    6
    7
    sudo apt install snapd
    sudo snap install core
    sudo snap refresh core
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    sudo certbot renew --dry-run

  4. 申请一个证书(使用standalone的方式,然后,需要输入电子邮件和解析到 VM的域名):

    1
    $ sudo certbot certonly --standalone

    证书默认生成在 /etc/letsencrypt/live/<YOUR.DOMAIN.COM/> 目录下,这个证书90天后就过期了,所以,需要使用一个 cron job 来定期更新, 使用命令 crontab -e 来编辑定时任务:

    1
    2
    0 0 1 * * /usr/bin/certbot renew --force-renewal
    5 0 1 * * /usr/bin/docker restart gost

用Gost设置HTTPS 服务

gost 是一个非常强的代理服务,它可以设置成 HTTPS 代理,然后把你的服务伪装成一个Web服务器,这比其它的流量伪装更好,也更隐蔽。这也是这里强烈推荐的一个方式

接下来就是启动 gost 服务了,我们这里使用 Docker 的方式建立 gost 服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
felix_yang@c1ws-test:~$ cat gost_install.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 ginuerzh/gost \
-L "http2://${USER}:${PASS}@${BIND_IP}:${PORT}?cert=${CERT}&key=${KEY}&probe_resist=web:www.bing.com&knock=www.google.com"

Note:

  1. 在 Gost 的启动上加上这个参数:probe_resist=web:www.bing.com,这样,当有人探测你的端口的时候,会返回bing.com,这样,就会让探测者以为你的端口是一个 Web 服务器,而不是一个代理服务器。

  2. 开启了探测防御功能后,当认证失败时服务器默认不会响应 407 Proxy Authentication Required,但某些情况下客户端需要服务器告知代理是否需要认证(例如Chrome中的 SwitchyOmega 插件)。通过knock参数设置服务器才会发送407响应。对于上面的例子,我们的knock参数配置的是www.google.com,所以,你需要先访问一下 https://www.google.com 让服务端返回一个 407 后,SwitchyOmega 才能正常工作。

  3. 如果认证信息(也就是用户名和密码)中包含特殊字符,则可以(应该是必须!否则客户端一侧会有很多不兼容)通过auth参数来设置,下面是使用 auth 参数的例子(注意,需要 gost 在 2.9.2+ 以上版本):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DOMAIN="YOU.DOMAIN.NAME"
    USER="username"
    PASS="password"
    PORT=443
    AUTH=$(echo -n ${USER}:${PASS} | base64)

    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 ginuerzh/gost \
    -L "http2://${USER}:${PASS}@${BIND_IP}:${PORT}?cert=${CERT}&key=${KEY}&probe_resist=web:www.bing.com&knock=www.google.com"

如无意外,你的服务就启起来了。 你可以使用如下命令在检查有没有启动成功:

  • sudo docker ps 来查看 gost 是否在运行。
  • netstat -nolp | grep 443 来查看 gost 是否在监听 443 端口。
  • sudo docker logs gost 来查看 gost 的日志。

你可以使用下面的命令验证你的 gost 服务是否正常。

1
curl -v "https://www.google.com" --proxy "https://DOMAIN" --proxy-user 'USER:PASS'

使用代理

  1. 电脑 - Chrome 代理

    • 使用SwitchyOmega

      image-20230606112051680
    • 代理上网,需要先访问knock参数配置的网址进行认证

  2. iPhone/iPad - Shadowrocket

    How to get Shadowrocket: taobao 购买, 和美国appstore 官网价格差不多,2美金,但是省了不少事情,比如美国付款方式,美国appstore 账号等等

    image-20230606111533591

科学上网 - 最佳实践
https://blog.excelsre.com/2023/06/05/ke-xue-shang-wang-zui-jia-shi-jian/
作者
Felix Yang
发布于
2023年6月6日
许可协议