haoel.github.io README

The project's README from github.com/haoel/haoel.github.io. As one markdown file: README.md.

科学上网

作者:左耳朵 http://coolshell.cn 更新时间:2023-05-02

这篇文章可以写的更好,欢迎到 https://github.com/haoel/haoel.github.io 更新

0. 序

首先,我们先明确一下,我科学上网的目的主要是为了学习、工作、交友、查资料、和丰富自己的眼界,不是其它的事。

对我来说,科学上网很重要,下面罗列一下需要科学上网,我才能真正学习工作和生活的网站:

所以,科学上网后,英文是一件很重要的事。

为什么这么说?这主要是针对计算机相关的知识,逻辑是这样的,如果你上了Google还是在用中文关键词,那么你好不容易出来了,结果又回去了,所以没什么意义。 换言之,科学上网的目的是为了进入广阔的世界范围与全世界的人交流,所以,英文是必备的,如果你英文有问题,VPN过去的用处也不大。

所以,我把这个前提条件放在第一的位置,就是说—— 真正的墙不是GFW,而是人的大脑! 意思是,屏蔽你获得信息能力的不是墙,而很大一部分则是我们自己的语言能力!

1. 机场 vs 自建

对于科学上网,我强烈建议通过自建的方式。因为使用一些“机场”会有如下的几个问题:

  1. 机场主需要公开售卖,使用的人也比较多,所以,都会被重点关注,非常容易被封;
  2. 机场需要购买一堆服务器,所以,很容易经营不善跑路;
  3. 使用机场很容易泄漏自己的隐私,因为你的所有流量都经过了机场的服务器;

自建梯子会是一条很好的路,不过,问题就是,自建梯子需要一定的技术能力,成本和门槛都比机场要高,但是,在安全性方面会比较好一些。自己动手,自力更生,让人有更多的安全感。

所以,如果你不是很有技术能力,或者不想花钱,那么,还是使用“机场”吧。

本文主要是针对自建的文档!

2. 购买VPS

自建梯需要购买一台服务器 VPS。现在你买一台VPS也不贵了,一个月几十元钱。当然,如果需要好的线路得需要多花一些钱,但是也不贵。。

购买的 VPS 有几个要点 - “流量” 和 “位置”:

上述的这些东西在后面都会讲到。另外,VPS 建议安装成 Ubuntu,版本用 18.04,20.04,22.04 都行。

2.1 常规VPS

对于常规 VPS,主要是一个云服务提供商,大的原厂商都提供免费使用和赠金,所以,可以白嫖一段时间。

Note

  • 你要知道很多云厂商的 VPS 服务器和流量是分开计费的,所以,你要确认一下你的云帐单以免出现不预期的费用。所以,最好购买包流量的 VPS。比如:AWS 的 LightSail, RackNerd 等。

  • 在中国,因为有太多的网络提供商,所以,不同的地方,不同的网络,不同的时间,到不同的国家完全不一样,而且还经常性地调整路由,所以,经常性地有时候快有时候慢,简直就是随机的。如果你对上网要求比较高的人,最好会备 2-3个不同国家地区的VPS。

  • 香港网速应该是比较好的,但是香港的成本也是比较高的(使用 Microsoft Azure 的 East Asia 可以把 VPS 买在香港区)。台湾的网速也是不错的(可以通过 Google Cloud 购买),日本的网速其次,新加坡再次之,然后是美国的东海岸。但是,因为线路的问题,如果没有为中国区优化的线路,丢包率是非常大的,日本区 ping 值虽然很低,但是经常性的丢包,好的线路的美国的 ping 值虽然大,但是也会飞快。

  • Google Cloud Platform - GCP 的香港和台湾节点也是很快的。但是你要能买GCP的主机,你还得先翻墙,所以,感觉有点死锁了。所以,你可能先用其它方式翻墙,然后再到GCP上购买。

2.2 CN2 线路

如果你需要更好更高速的网络服务(比如你要看 Youtube 的 1080P),那么,你需要下面的这些服务器资源了(价格也会高一些)

CN2 和 GIA 是两个关键词。CN2 GIA 全称 China telecom Next Carrier Network- Global Internet Access 电信国际精品网络,特征是路由线路上骨干节点均为59.43开头的IP。如果想要寻找接入CN2线路的国外VPS提供商,建议使用 Next Carrier Network 或者 CN2 这个关键词搜索即可。

多说一句, CN2本身又分为两种类型:

关于 CN2 线路的主机提供商,好些都不靠谱,只推荐下面两个,首推搬瓦工。

更多的可以参考这篇文章《CN2 GIA VPS主机收集整理汇总-电信,联通,移动三网CN2 GIA线路VPS主机》(注:随时间推移,这篇文章的内容可能会失效)

重点说一下,CN2 GIA + 香港机房,你会得到巨快无比的上网速度(无论你在中国的哪个位置,无论使用哪家运营商,CN2 GIA都是最优的),然而,香港地区的VPS的确是有点贵了。在 Youtube上看 4K 的视频毫无压力。虽然阿里云和腾讯的也有,但是被查到的风险基本上是100%,不建议使用,被抓了别怪我没警告过你。

3. 搭建相关代理服务

注:如下的搭建和安装脚本可参看本库的 scripts 目录下的脚本,如: Ubuntu 18.04 Installation Script (感谢网友 @gongzili456 开发),另外,这个脚本可能年久失修,不一定能用,但是可以参考,如果有问题,可以提交 PR。

3.1 设置Docker服务

首先,你要安装一个Docker CE 服务,这里你要去看一下docker官方的安装文档:

然后开始设置你的VPN/SS服务

3.2 开启 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拥塞控制算法 》

3.3 申请域名和证书

为了更为的隐蔽,使用 HTTPS 服务,你需要完成如下工作:

1) 一个域名(可以上 GoDaddy,但一定要使用美国版)

2) 然后在 GoDaddy 上修改域名解析服务器,把其指向 Cloudflare —— 当你注册完 Cloudflare 帐号后,Cloudflare 会告诉你怎么做。

3)然后,你在 Cloudflare 上创建一个子域名解析到你的 VPS 上 IP 上(注:不要开启 Cloudflare 的 Proxy 模式)

4)最后,使用 Let's Encrypt 来签 一个证书。使用 Let's Encrypt 证书你需要在服务器上安装一个 certbot,点击 certbot 这个链接,你可以选择你的服务器,操作系统,然后就跟着指令走吧。

接下来,你需要申请一个证书(我们使用standalone的方式,然后,你需要输入你的电子邮件和你解析到 VPS 的域名):

$ sudo certbot certonly --standalone

证书默认生成在 /etc/letsencrypt/live/<YOUR.DOMAIN.COM/> 目录下,这个证书90天后就过期了,所以,需要使用一个 cron job 来定期更新(稍后给出)

3.4 用 Gost 设置 HTTPS 服务

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

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

#!/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=code:404&knock=www.google.com"

上面这个脚本,你需要配置:域名(DOMAIN), 用户名 (USER), 密码 (PASS) 和 端口号(PORT) 这几个变量。

关于 gost 的参数, 你可以参看其文档:Gost Wiki,上面我设置一个参数 probe_resist=code:404 意思是,如果服务器被探测,或是用浏览器来访问,返回404错误,也可以返回一个网页(如:probe_resist=file:/path/to/file.txt 或其它网站 probe_resist=web:example.com/page.html)

Note

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

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

    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://${BIND_IP}:${PORT}?auth=${AUTH}&cert=${CERT}&key=${KEY}&probe_resist=code:404&knock=www.go   ogle.> com"
    

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

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

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

接下来就是证书的自动化更新。

可以使用命令 crontab -e 来编辑定时任务:

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

这样,服务器就配置完成了。客户端请移动后面的客户端章节。

使用 Cloudflare 的注意事项

上述的方法并不支持 Cloudflare CDN,如果你想使用了 Cloudflare CDN,你需要使用 WebSocket 协议,如下所示,你需要使用 mwss 协议。

gost -L=mwss://username:password@:443?cert=/path/to/your/cert/file\&key=/path/to/your/key/file

在 CloudFlare 上,请将TLS/SSL设置为 完全

如果你的客户端只能使用 socks 协议,你还要在客户端这边转一下:

gost -L socks://:YourLocalPort -F mwss://username:[email protected]:443

然后在其他软件中设置socks5代理即可

3.5 设置 ShadowSocks 服务 (不推荐)

(注:ShadowSocks 被查的机率非常大,不推荐使用)

(如果有隧道转发,可以使用)

ShadowSocks 的 Docker 启动脚本 (其中的 SS_PORT 和 SS_PASSWD 需要重新定义一下)

#!/bin/bash

SS_PORT=1984
SS_PASSWD=MyPasswd

sudo docker run -dt --name ss \
   -p ${SS_PORT}:${SS_PORT} mritd/shadowsocks \
   -s "-s 0.0.0.0 -p ${SS_PORT} -m aes-256-cfb -k ${SS_PASSWD} --fast-open"

3.6 设置L2TP/IPSec服务 (不推荐)

(注:VPN方式被查的机率非常大,不推荐使用)

L2TP/IPSec 的启动脚本,其中的三个环境变量 USER, PASS 和 PSK 需要替换一下。

#!/bin/bash

USER=someone
PASS=password
PSK=psk_key

sudo docker run -d  --privileged \
    -e PSK=${PSK} \
    -e USERNAME=${USER} -e PASSWORD=${PASS} \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -p 1701:1701/tcp \
    -p 1194:1194/udp  \
    siomiz/softethervpn

4. 客户端设置

4.1 电脑端设置

4.1.1 Chrome 代理设置

你可以使用 Chrome 插件 SwitchyOmega进行代理设置。在 SwitchyOmega 中,你需要设置一个代理服务器。

  1. 打开 SwitchyOmega 的设置页面,点击左边导航栏上的“New Profile”,输入一个名字,比如“代理”。
  2. 然后在 Protocol 中选择 HTTPS, 填上你的 Gost 的 VPS 服务器和端口号。
  3. 点后面的 🔒 按钮,输入 Gost 服务器的用户名和密码。

具体的教程可以参看官方教程 - 《最新 SwitchyOmega 使用教程快速入门篇》

如果无法直接配置 HTTPS 代理,具体原因可能是因为你设置了probe_resist以开启探测防御功能。这里,你需要在服务器端设置 knock 参数(参看 用 Gost 设置 HTTPS 服务 中的“注意”一节 )

或是,干脆使用 gost 客户端在本机启动一个 SOCKS 5的代理服务用来代替(gost -L socks5://:1080 -F 'https://USER:PASS@DOMAIN:443'),然后在 SwitchyOmega 配置代理为'127.0.0.1:1080'即可。

4.1.2 全局 Clash 代理设置

在电脑上,使用 Clash 一个就可以了。Clash 支持很多翻墙协议:ShadowSocks(R), Vmess, Socks5, HTTP(s),Snell,Trojan。 而且支持多个代理服务器的分组和负载均衡。

Clash 的客户端支持多种平台,包括 Windows, MacOS, Linux 等,你可以在 Clash 的 Release 页面 下载到最新的版本。这个是命令行版本,但配置其实并不复杂。

另外,有一些比较高级的功能,如:开启 Tun 网卡,需要使用 Clash Premium,这个版本不收费,但是是闭源的。

当然,如果你要安装 GUI 版本,你可以通过如下的项目安装:

下面是 Clash 安装完后的配置目录结构:

├── clash                <- 建一个 clash 的目录
│   ├── clash            <- 运行文件
│   ├── config.yaml      <- 配置文件
│   ├── Country.mmdb     <- IP地址库
│   └── ui               <- Clash 的 UI
│       ├── index.html
│       ├── ...

说明一下:

下面是个示例:

port: 7890
socks-port: 7891
redir-port: 7892
mixed-port: 7893
ipv6: false
allow-lan: true
mode: Rule
log-level: info
external-controller: '0.0.0.0:9090'
external-ui: ui
secret: ''
tun:
  enable: true
  stack: system
  dns-hijack:
    - tcp://8.8.8.8:53
    - udp://8.8.8.8:53
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:53
  default-nameserver:
    - 114.114.114.114
  #enhanced-mode: redir-host
  enhanced-mode: fake-ip #如果要玩netflix,需要使用fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 114.114.114.114
    - 223.5.5.5
    - tls://8.8.8.8:853
  fallback:
    - tls://8.8.8.8:853

# 两个代理服务器
proxies:
  # http
  - name: "https01"
    type: http
    server: https.server.domain
    port: 443
    username: user
    password: "password"
    tls: true # https
    skip-cert-verify: true
  - name: "https01"
    type: http
    server: https.server.domain
    port: 443
    username: user
    password: "passowrd"
    tls: true # https
    skip-cert-verify: true

# 配置 Group
proxy-groups:
  # 自动切换
  - name: "auto"
    type: url-test
    proxies:
      - us01_https
      #- us02_https
      #- hk_https
    # tolerance: 150
    url: 'https://www.google.com/'
    interval: 300
  # 按需选择 - 可以在UI上选择
  - name: "netflix"
    type: select
    proxies:
      - us01_https
      - us02_https
      - hk_https

rules:
# LAN
  - DOMAIN-SUFFIX,local,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,172.16.0.0/12,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT

# Netflix
  - DOMAIN-SUFFIX,fast.com,netflix
  - DOMAIN-SUFFIX,api-global.netflix.com,netflix
  - DOMAIN-SUFFIX,netflix.com,netflix
  - DOMAIN-SUFFIX,netflix.net,netflix
  - DOMAIN-SUFFIX,nflxext.com,netflix
  - DOMAIN-SUFFIX,nflximg.com,netflix
  - DOMAIN-SUFFIX,nflximg.net,netflix
  - DOMAIN-SUFFIX,nflxso.net,netflix
  - DOMAIN-SUFFIX,nflxvideo.net,netflix

# 最终规则(除了中国区的IP之外的,全部翻墙)
  - GEOIP,CN,DIRECT
  - MATCH,auto

更多的规则网上可以找到很多,也可以参看这里:SS-Rule-Snippet/LAZY_RULES/clash.yaml



Note

除了 Clash 外,你可以安装原生的客户端。如:

1) VPN 客户端

对于L2TP/IPSec,几乎所有的客户端操作系统(无论是Windows/Mac/Linux的电脑,还是iPhone/Android)都支持,你可以自行Google。

2) Shadowsocks 客户端

对于 Shadowsocks 客户端,可以到这里查看 Shadowsocks Clients

注:关于 Shadowsocks 客户端的配制, 加密协议必须是跟 Shadowsocks 服务端相一致。可以自行约定在 Shadowsocks , 如:之前章节示例中使用的是 aes-128-gcm 。

3) Gost 客户端

Gost 并不支持智能代理(也就是该翻的时候翻,不用翻的时候不翻), 所以我们可以重用 ShadowSocks 的客户端。

对于电脑来说,你同样可以 下载 gost 程序,然后使用下面的命令行:

# 此处的ss服务端加密协议(eg: aes-128-gcm)必须是ss客户端支持的协议
gost -L ss://aes-128-gcm:passcode@:1984 -F 'https://USER:PASS@DOMAIN:443'

这样用 gost 在你的本机启动了一个 ShadowSocks 的服务,然后,把请求转到你在上面配置的 HTTPS服务器上,这样就完成转接。

┌─────────────┐  ┌─────────────┐            ┌─────────────┐
│ ShadowSocks │  │             │    WAN     │             │
│    Client   ├──► Gost Client ├────────────► Gost Server │
│ (PAC Auto)  │  │             │            │             │
└─────────────┘  └─────────────┘            └─────────────┘

ShadowSocks Client 主要完成:自动设置操作系统代理服务器的 pac (自动设置翻墙或是不翻墙的路由)

这样,你的ShadowSocks客户端只需要简单的配置一个本机的 SS 配置就好了。

4.2 手机端设置

4.2.1 Android

4.2.2 iPhone

对于 Apple 上的 iPhone/iPad,就比较麻烦了。因为相关的客户端在国内的 App Store 上全都被下架了。所以,你需要注册一个美国的苹果ID,然后 iTunes/App Store 用这个美区的ID登录(不是退出iCloud ,而是退出App Store)。

关于如何注册美区 Apple ID账号,你需要有两个前提条件:

关于如何搞到美国的手机号以及美国的 PayPal 账号以及其必要性,可以参看5. 美国手机和支付

然后,你就可以用电脑登录 https://appleid.apple.com/ 全新注册一个帐号,注册的时候,你需要选择美国的地区,然后,你需要用你的美国手机号码接收验证码,最后,你需要用你的美国 PayPal 账号来绑定你的信用卡。

iPhone 上的客户端我推荐使用下面这两个(需要付费),这两个客户端都支持很多协议,如:ShadowSocks, HTTP(s), VMess, Socks5,等。

Note

Potatso 作为 shadowsocks 的客户端也是可以的,而且免费,但是无法使用 Gost 的 HTTPS 代理,所以,我不推荐使用。

4.3 平板端设置 (服务端使用gost代理)

4.3.1 iPad

5. 美国手机和支付

现在越来越多 APP 需要使用海外的手机和支付,所以,你需要有一个美国的手机号码和美国的支付方式。

5.1 美国手机

美国的手机号目前最好的方式是购买 [Ultra Mobile 的 P

haoel.github.io (haoel/haoel.github.io)

letsencrypt
Searching Database…

What is this?A long-form Chinese guide by Bilibili engineer 左耳朵 (haoel) that walks through everything needed to bypass internet censorship (the GFW) by renting your own VPS and self-hosting a proxy, from choosing a server all the way to configuring clients on every device.
Is this a ready-made tool, or just documentation?It's primarily a markdown tutorial, plus a handful of reference shell/docker setup scripts in the repo's scripts folder, rather than a packaged application you install and run directly.
How do I actually set this up end to end?Rent a VPS (Ubuntu recommended), install Docker, spin up a Gost proxy container over HTTPS with a Let's Encrypt certificate behind your own domain, then configure a client like Clash, SwitchyOmega, or ShadowRocket to connect to it.
What do I need before I start, besides a VPS?You need Docker CE installed on the server, a domain routed through Cloudflare DNS, and a Let's Encrypt certificate issued via certbot; on the client side you'll need Clash, SwitchyOmega, or an app like ShadowRocket depending on the device.
Which protocols should I avoid, and why?The guide explicitly warns against ShadowSocks and L2TP/IPSec because they're very likely to be detected and blocked; it recommends disguising traffic with Gost over HTTPS as a normal-looking web server instead.
Which devices can I connect from once the server is running?Clash clients cover Windows, macOS, Linux and Android, Chrome gets a SwitchyOmega profile, and iOS/iPadOS is handled with paid apps like ShadowRocket or Quantumult; there's also guidance for turning an OpenWRT router or Raspberry Pi into a whole-home transparent gateway.
What is CN2 GIA and why does the guide care about it?CN2 GIA is China Telecom's premium international backbone line with the lowest packet loss and fastest routes back into China; the guide recommends VPS providers like BandwagonHost (搬瓦工) and HostDare specifically because they offer it.
Can this set up a transparent gateway for my whole home network?Yes, section 8 covers flashing an OpenWRT router or using a Raspberry Pi as a bypass gateway with iptables forwarding, so every device on the home network routes through the proxy automatically without per-device setup.
Does the guide also cover datacenter-level or Kubernetes gateways?Yes, section 9 walks through building a transparent gateway inside AWS using a VPC and EC2 instances in a private subnet, and even routing a private-subnet Kubernetes cluster's traffic through Clash.
Creator
haoel
Size
1 MB
Stars
13.1K
Updated
CommitMay 09
Age
10y
Commits · 90 Days