目标

经过多年的发展和迭代,v2ray或者xray已经成为了fuck-the-gfw领域的事实标准。 目前xray的vless + reality + vision协议的方案稳定性和速度都非常令人满意,只要机房节点合适,体验非常舒适。

但是经过代理访问网络服务时,有时候会给我们带来额外的困扰,例如Netflix以及ChatGPT都会检查访问者的IP属性,如果是来自于机房数据中心,可能会直接拒绝服务。

因此2023年的fuck-the-gfw方案,需要达成以下目标:

  1. 可以访问自由的互联网世界
  2. 避免因为机房IP属性而导致的拒绝服务
  3. 环境配置和管理简单,容易维护和更新

方案选型

先决条件

使用国外的服务,一般都要求通过外币信用卡付款(Visa或者Mastercard支付),有些可以通过PayPal直接绑定境内的人民币银行卡支付,但是PayPal的普及率并不很高。请先准备好一张Visa或者Mastercard的外币信用卡或者外币借记卡。

域名注册

有一个域名可以让我们更便利地访问VPS上部署的服务,而不必记住IP地址来访问。 在namecheap每年花10美元左右即可得到一个个性域名。

VPS

代理协议实际上对使用体验的影响并不会特别大,毕竟这些代理协议发展了这么多年,能优化的方面都已经优化的差不多了,差距都是理论极限层面的,对于日常使用并不关键。实际上VPS的位置和网络线路的质量才是关键。

好的VPS需要满足以下标准:

  1. 直连线路,延迟低,丢包率低。有的VPS虽然地理位置近,但是延迟可能很高,因为绕路了,需要注意测试VPS的ping值和丢包率。
  2. 机房不会有大量机器全部用于代理服务,大批量的流量很容易引起GFW的AOE伤害,直接把整个网段拉黑,导致VPS失联。
  3. 服务稳定可靠,服务商不会跑路。当VPS被封禁后,可以重新申请IP或者申请新的VPS。基于这种思路,按时间付费而不是包月包年的服务商最优。

基于以上考虑,推荐以下2家服务商:

  • AWS ec2: 最老牌的顶尖云服务商,其稳定性和可靠性是毋庸置疑的,所提供的功能也是十分丰富和强大。唯一的缺点就是贵。
  • DigitalOcean: 操作界面简洁,价格十分便宜。 除此之外,Vultr也是很不错的VPS服务商,价格和DigitalOcean差不多,但是机房区域更多,在东京也有机房(DigitalOcean没有东京的机房)。另外DigitalOcean由于前些年有大量中国用户薅github学生优惠的羊毛,导致对中国用户的审核非常严格,现在使用中国信息和中国信用卡有可能无法顺利注册账户。而Vultr由于有东京机房而且价格便宜被广泛推广和使用,在高峰期时段有可能出现线路拥塞,在敏感时期有可能被针对。

而AWS由于使用门槛比较高,对小白用户不太友好,而且价格相对也比较高,使用它作为代理服务的用户数量很少。因此它的线路质量非常高,稳定性非常好,即使在敏感时期,基本也不会有什么问题。

服务商 线路质量 代理用户量 服务质量和计费友好
AWS 最高 最少 非常好
DigitalOcean 比较高 比较少 非常好
Vultr 比较低 非常好

代理服务部署

尽管现在很多代理服务都有人写了一键部署脚本,功能丰富,十分便利,但是使用成本仍然比较高,很多时候需要登录到VPS上命令来操作,甚至需要修改复杂的配置文件,成本很高。

因此我们优先考虑使用更加先进的docker来进行容器化部署,容器化部署不仅部署简单,不容易出错,而且很容易进行迁移和恢复。

我们使用如下服务:

  • Nginx manager: 容器化版本的nginx,虽然无法支持nginx的所有功能,但是胜在图像化配置,操作简单,而且支持https证书自动申请和续期。
  • x-ui: v2ray/xray的docker部署版本,加图形化管理面板。可以在网页上很轻松地完成代理服务的配置管理。请注意使用alpha-zh版本,这是最后一个活跃版本。

Ready to go

下面以AWS为例子,我们开始搭建属于我们自己的fuck-the-gfw服务。DigitalOcean之类的更加简单,在此不讨论了。

申请AWS账户

请注意申请AWS国际版的账户,而不是中国版,认准地址https://aws.amazon.com/。绑定支持Visa或者Mastercard的外币信用卡或者借记卡。

创建vpc

如果我们希望ec2 instance中支持ipv6,那么需要创建启用了ipv6的vpc,然后将这个vpc绑定给ec2 instance.

进入到VPC dashbaord

选择Virtual private cloud -> Your VPCs,点击右上角的Create VPC

然后在 VPC settings 中选择VPC and more以及Amazon-provided ipv6 CIDR block

创建vpc的security groups

Network & Security -> Security Groups,点击右上角的Create Security Group

在创建页面中,选择关联的VPC为前面创建的那个VPC,并且配置一个允许所有tcp, udp, icmp的ipv4和ipv6任意流量以及ssh的ipv4流量的入站规则,以及允许任意ipv4和ipv6流量的出站规则。Security group nameDescription填写任意内容即可。

创建ec2 instance

注册完成后,进入AWS的console界面,切换到tokyo区域。

如下图所示,选择Instances -> Launch Instances 点击右上角的Launch Instances.

按照如下内容对ec2 instance进行配置。

使用Ubuntu 22.04镜像

选择虚拟机配置和ssh key

这里选择的是1核心CPU, 1GB内存的t2.micro,可以根据需求情况酌情选择。

如果还没有ssh key,可以点击Create new key pair创建。

配置网络

Network settings中,选择Edit,然后修改相关配置。

  1. 选择vpc为刚刚创建的那个。
  2. 选择自动分配Publich IP(ipv4地址)
  3. 选择自动分配ipv6 IP。
  4. 选择已经存在的security groups,分别是这个vpc默认的default,以及我们刚刚创建的那个。

配置存储

选择默认的gp2即可,一般情况下,10GB就足够了,也可以根据需求调整。

确认以上配置无误,点击launch instance即可创建虚拟机。

配置公网ipv6

进入到这个ec2 instance的管理界面中,选择Actions -> Networking -> Manage IP address

在编辑页面中选中eth0,勾选其中的Assign primary IPv6 IPEnable

如果你本地的网络支持ipv6,那么此时你就能ping通这个ipv6地址了。至此我们完成了VPS的创建和配置工作。

然后我们就可以使用ssh-key来登录VPS了,注意VPS的主机名是ubuntu,~/.ssh/config中的配置类似如下:

如果你完成配置后,无法马上登录,提示验证错误,那么你可能需要refresh一下ssh-agent,在当前shell中执行指令ssh-agent -s即可。

配置alerm

有时候e2 instance会出现异常,导致无法使用,此时只能reboot或者重建。一般情况下,这些问题都可能通过reboot解决。 在Status checks -> Actions -> Create status check alerm中创建新的alerm

在配置中选择Alert action为reboot,选择Type of data to sampleStatus check failed: either 当容器出现状态检查异常时,就会自动重启以恢复正常。

安装配置nginx manager

我们使用nginx manager来让虚拟机中的服务能够通过域名而不是IP地址提供服务。nginx manager使用docker compose来部署,因此我们需要先安装docker compose。

安装docker compose

参考docker官方文档

1
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
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

# Add the repository to Apt sources:
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
1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

最后执行hello-world即可

1
sudo docker run hello-world

输出如下内容即表示docker compose安装正常

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:ac69084025c660510933cca701f615283cdbb3aa0963188770b54c31c8962493
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/

部署nginx manager

根据nginx manager doc,按照如下方式配置compose yaml:

1
2
3
4
mkdir -p ~/docker-deploy/nginx-manager
cd ~/docker-deploy/nginx-manager
mkdir data letsencrypt
touch docker-compose.yml

docker-compose.yml中的内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-manager
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

然后运行sudo docker compose up -d即可启动nginx manager。

配置nginx manager

访问http://host_ip_address:80,其中host_ip_address是你的VPS的ipv4地址,可以在aws ec2 instance界面看到。看到如下内容,那么nginx manager就在正常工作:

然后访问http://host_ip_address:81即可登录nginx manager的管理界面。 第一次登录使用默认用户名密码,参考nginx manager doc。登录按照提示立即修改用户名密码。

配置letsencrypt

nginx manager使用letsencrypt自动获取并续期https证书,它需要使用域名注册商的API secret来认证域名所有权。

首先在namecheap中启用API访问,在namecheap的dashboard中选择Profile -> Tools -> Business & Dev Tools -> Namecheap API access

按照如下方式启用API access,并将VPS的ipv4地址填入到Whitelisted IPs中:

在nginx manager中选择SSL Certificates -> Add SSL Certificate 域名中默认填写一级域名以及通配符的二级域名:

1
yourdomain.address, *.youdomain.address

配置反向代理

首先在namecheap中添加一条指向VPS的ip地址的二级域名DNS记录. 直接指向ip地址的记录是A Record类型。

然后在nginx manager中配置相关的反向代理记录: 选择Dashboard -> Proxy Hosts -> Add proxy host 注意这里的forward hostname写为docker地址172.17.0.1,而无需填写VPS的实际IP地址。

需要注意SSL certificate选择为与该方向代理记录中域名一致的。

然后就可以通过https域名访问nginx manager了。

至此nginx manager的安装以及配置工作就完成了,我们可以把VPS中nginx manager的配置和数据文件(~/docker-deploy/nginx-manager)保存到本地,如果旧的VPS删除,直接传送到新的VPS中启动运行即可。部署新的VPS后仅仅需要将DNS server(namecheap)中的相关联的DNS记录指向到新的VPS的地址即可。

x-ui安装

参考docker简介中的内容,按照如下方式安装:

1
2
3
4
mkdir -p ~/docker-deploy/x-ui
cd ~/docker-deploy/x-ui
mkdir db
touch docker-compose.yml

docker-compose.yml中写入以下内容:

1
2
3
4
5
6
7
8
9
version: '3.8'
services:
  x-ui:
    image: enwaiax/x-ui:alpha-zh
    container_name: x-ui
    network_mode: host
    restart: unless-stopped
    volumes:
      - ./db/:/etc/x-ui/

x-uinetwork_mode需要设置为host

1
sudo docker compose up -d

启动后即可通过http://host_ip_address:54321登录。初始用户名密码为admin:admin

进入到settings -> panel settings,修改服务前缀为你想要的前缀:

settings -> user config中,即可修改登录账户名密码:

x-ui域名反向代理

不同于nginx-manager的配置,x-ui因为有prefix路径,需要配置Custom Locations,location中填入刚刚在xui配置中缩写的路径前缀。

配置服务端

选择inbounds -> 添加入站,添加代理服务

关键选型为:

  • protocol: vless
  • flow: xtls-rprx-vision
  • network: tcp
  • reality: enable

目标网站随便选一个就行。

添加完成后,选择查看即可看到配置链接或者二维码

到此为止,一个基础版的代理服务就配置完了,我们现在可以愉快地访问网络了。

代理客户端

v2ray/xray的比较好的客户端有如下选择:

  • v2raya: 桌面客户端,支持docker安装。
  • v2rayn: windows桌面客户端。
  • v2rayng: 安卓客户端。
  • nekoray:支持桌面端和安卓端。
  • sing-box: 安卓和iOS移动端,轻量级,仍在快速迭代中,支持很多新协议和新特性,但是配置较为复杂。

除了sing-box以外的客户端,基本都支持直接通过链接或者二维码的方式导入配置,使用无需特别说明。

对于sing-box客户端,我们可以使用sing-box-subscribe一键将v2ray/xray的链接转化为sing-box的配置文件。

打开https://sing-box-subscribe.vercel.app/ ,填入我们的代理链接到tag1的URL LINK。

填入后点击save,如果sing-box版本低于1.8.0那么选择2. config_template_groups_tun,否则选择第1项。最后点击select and generate,网页将会跳转到一个json页面,全部复制该文件的内容,然后传输到手机中。

在sing-box客户端中选择Profiles -> New Profile

  • Type: Local
  • Source: Import 然后点击Import File即可。

突破机房IP屏蔽

目前代理服务已经搭建完成,但是尚未解决机房IP可能被某些服务屏蔽的问题。事实上很多服务提供商是通过IP的性质来判定是否拒绝服务。IP地址大致可以分为:

  1. 普通机房IP
  2. 白名单IP
  3. 静态住宅IP
  4. 真住宅IP

其中静态住宅IP也是部署在机房的代理所提供的IP,但是这种机房往往是某些ISP服务商提供的,其被屏蔽的风险仅次于真住宅IP(个人用户被ISP服务商分配IP)。

ChatGPT以及Netflix一般只屏蔽普通机房IP,我们只需要把自己的IP性质变成白名单IP即可。常见的白名单IP有cloudflare warp以及Google One VPN。它们所提供的IP,在欺诈检查中会得到比较低的分数,会被认为是低风险的。cloudflare可以被免费使用,我们可以直接借用已有的一键安装脚本部署在VPS上。

参考warp.sh

1
2
3
4
5
wget git.io/warp.sh
chmod +x warp.sh
sudo su
./warp.sh install
./warp.sh proxy

现在warp在本地的4000端口启动了代理客户端,我们只需要让特定网站的流量经过warp这一层代理。因为额外增加了一层代理,会从产生额外开销,所以我们只希望特定的网络流量走warp。

在x-ui面板中选择settings -> xray settings,输入以下内容:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
{
  "api": {
    "services": [
      "HandlerService",
      "LoggerService",
      "StatsService"
    ],
    "tag": "api"
  },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 62789,
      "protocol": "dokodemo-door",
      "settings": {
        "address": "127.0.0.1"
      },
      "tag": "api"
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv4"
      }
    },
    {
      "protocol": "socks",
      "settings": {
        "servers": [
          {
            "address": "127.0.0.1",
            "port": 40000
          }
        ]
      },
      "tag": "cloudflare_v4"
    },
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv6"
      },
      "tag": "normal_v6"
    },
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIPv4"
      },
      "tag": "normal_v4"
    },
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    }
  ],
  "policy": {
    "system": {
      "statsInboundDownlink": true,
      "statsInboundUplink": true
    }
  },
  "routing": {
    "rules": [
      {
        "domain": [
          "domain:whatismyipaddress.com",
          "domain:scamalytics.com",
          "domain:openai.com",
          "geosite:netflix",
          "geosite:disney"
        ],
        "outboundTag": "cloudflare_v4",
        "type": "field"
      },
      {
        "domain": [
          "domain:www.baidu.com"
        ],
        "outboundTag": "normal_v4",
        "type": "field"
      },
      {
        "domain": [
          "domain:byr.pt"
        ],
        "outboundTag": "normal_v6",
        "type": "field"
      },
      {
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api",
        "type": "field"
      },
      {
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "blocked",
        "type": "field"
      },
      {
        "outboundTag": "blocked",
        "protocol": [
          "bittorrent"
        ],
        "type": "field"
      }
    ]
  },
  "stats": {}
}

以上配置中除了配置了openai, netflix等网站走warp代理,还配置了让byr.pt强制走ipv6出口,因为这个网站只允许境外的ipv6以及境内的教育网访问。

修改配置后,点击saverestart即可生效。然后我们本地通过代理访问whatismyipaddress.com将会看到以下结果: 这里IP不再是我们的VPS的ip地址,而且服务商也变为了CloudFlare,说明warp已经生效了。

在服务器上,我们可以通过netflix-verify来检查warp代理对netflix的访问权限:

1
2
3
wget https://github.com/sjlleo/netflix-verify/releases/download/v3.1.0-1/nf_linux_amd64
chmod +x nf_linux_amd64
./nf_linux_amd64 -proxy socks5://127.0.0.1:40000

有时候可能出现解锁不彻底的情况,即仅可以观看自制剧:

cloudflare warp解锁是否能观看自制剧,纯粹取决于运气,因为这个方法是免费的,目前被大量使用,所以可能造成某些代理IP被Netflix识别。

如果希望稳定解锁,那么可以使用Google One VPN。(只有安卓和iOS客户端)。Google One VPN会根据你的IP判定所在地区,然后就近选择同区域的VPN服务器。 此服务在某些地区不支持,但是可以通过特殊的手段打开。

  1. 先在手机上打开V2rayNG或者sing-box代理。
  2. 打开Google One,点击连接VPN,Google One VPN启动后,将会把原来生效的V2rayNG或者sing-box关闭,但是它将无法连接到VPN服务器。
  3. 再次打开V2rayNG或者sing-box代理,Google One VPN将会很快连上其服务器,开始生效。

似乎通过软路由之类的方式,直接让wifi具备代理能力,也能让Google One VPN成功连接,但是成本比较高。

参考

不良林