开了一台 GCP 免费机,搭了第二个代理节点
在 linux.do 上看到一个开 GCP 免费机的脚本,在 Cloud Shell 里跑一行命令就能建好一台 e2-micro。我照着开了一台,本来只想看看它能干什么,结果折腾了一整天:算清楚收费、配 SSH、装监控、搭代理,中间还顺带把美国 VPS 的 Xray 升了级、重启换了内核。这篇按顺序记下来。
文中不写服务器 IP、UUID、密钥和令牌。
脚本做了什么
脚本是 fatekey/gcp_free,在 GCP 控制台右上角打开 Cloud Shell,执行:
git clone https://github.com/fatekey/gcp_free && cd gcp_free && bash start.sh
start.sh 只是开通两个 API、建 Python 虚拟环境,真正干活的是 gcp.py,一个数字菜单:
- 新建实例:在俄勒冈、爱荷华、南卡三个免费区里选一个,建 e2-micro、30 GB 标准盘,网络用标准层级;
- 反复关机开机,直到分到 AMD 的 CPU(作者自己说美西基本刷不出来,提升也不到 10%);
- 防火墙:一条放行所有入站,一条禁止访问 Akamai、Cloudflare、Fastly 的 IP 段;
- Debian 换源、装 dae、装流量监控脚本(到 180 GB 封网或关机)。
我建的是 Ubuntu 22.04。后来才知道换源那一项是专门给 Debian 写的,在 Ubuntu 上执行会把 Debian 的源写进系统,好在我没点。Ubuntu 在 GCP 上默认用的是 Google 自己的镜像,不经过那三家 CDN,本来也不需要换源。
流量监控的两个脚本我看了一下,关机版读的是 vnstat 输出的第 5 列,那是当天的出站量,月出站量在第 10 列(封网版读的就是第 10 列)。也就是说关机版要一天跑满 180 GB 才会触发。最后两个都没装,流量交给后面的 Komari。
收费怎么算
这部分来回查了好几次,最后以官方的免费层级说明和网络价格页为准,再参考帖子里大家的实际账单。
免费层级包括:每月一台 e2-micro(按小时算,开两台会提前用完)、30 GB 标准盘、1 GB 出站流量(不含发往中国和澳大利亚的)。
出站流量要看网络层级:
| 标准层级(脚本用的) | 高级层级(默认) | |
|---|---|---|
| 每月免费 | 200 GiB,整个账号所有区域合计 | 1 GiB |
| 超出后 | 0.085 美元/GiB | 0.12 美元/GiB 起 |
| 发往中国 | 同上 | 没有免费额度,0.23 美元/GiB |
价格页上写着标准层级「基于流量的来源地理位置」计费,我一开始据此以为它不分目的地,那条屏蔽 CDN 的规则在计费上没必要。后来看帖子里的账单才知道不对:发往 Akamai、Cloudflare、Fastly 的出站流量是单独收费的,不在 200 GiB 里,有人给网站套了 Cloudflare,几天扣了 0.45 美元。我猜是因为这三家都是 Google 的 CDN 互连合作方,价格页的注释里也写了这些费率不适用于 CDN 互连流量,不过这只是我的推测。
好在只算服务器发出去的部分。通过代理看网页时,大头数据是 CDN 发给服务器,属于入站,免费;服务器再转给我,算进 200 GiB。所以正常浏览每月也就几美分,真正花钱的是往这些网站大量上传。
外网 IPv4 按文档是 0.005 美元/小时,一个月大约 3.65 美元,免费层级里没提它。帖子里好几个人说临时 IP 实际没扣钱,我还没看到自己的账单,先按收费算。
费用这边我有 Google AI Pro 每月送的 10 美元 GCP 赠金,每笔一年后才过期,用不完会攒着。按文档算,10 美元扣掉 IP 费还能买大约 75 GiB 流量,也就是每月能用 275 GiB 左右;IP 要是不收费,就是 318 GiB 左右。
最后在「预算和提醒」里设了每月 10 美元的提醒。这里有个细节:「节省的费用」那一栏如果把赠金全勾上,预算算的就是扣完赠金后要刷卡的钱,赠金消耗时不会提醒,只有真开始扣卡才会提醒。我想要的正是后者,就保持全勾。
SSH 和速度
GCP 的镜像默认不能用密码登录。gcloud compute ssh 能登上去,是因为它每次自动生成一把密钥放到服务器上;控制台「SSH 密钥」里那些带 expireOn 的条目,是浏览器 SSH 自动加的临时密钥,过期会自己清掉。
我在 Mac 上单独生成了一把 ed25519 密钥,把公钥末尾的注释改成现有用户名,粘到实例的「SSH 密钥」里。之后 ssh gcp 就能直接登,这个用户有免密 sudo,sudo -i 进 root。root 本身不能直接 SSH 登录,我也没去打开。
防火墙方面,SSH 的 22 端口本来就有 GCP 默认规则放行,不用加什么。脚本加的那条全端口放行其实没必要,另加一条只放行 80 和 443 的规则就够了。
速度测下来是这样:
| 测试 | 结果 |
|---|---|
| GCP 从美国测速点下载 | 30~70 MB/s |
| Mac 到 GCP 延迟 | 183 ms |
| GCP 发给 Mac(单连接) | 约 3.6 MB/s |
| 同一网络下,美国 VPS 发给 Mac | 约 2.5 MB/s |
服务器上开了 BBR,前后没有区别。两台不同厂商的美国机器到我这边都是 180 多毫秒、两三 MB/s,瓶颈在我这边的网络到美国这一段,和 GCP 没关系。
装 Komari 监控
流量监控最后用了 Komari。面板装在美国 VPS 上,独立一个 Compose,端口只绑 127.0.0.1,由博客的 Nginx 反代到 status.arcueidblog.top,走 Cloudflare。美国 VPS 和 GCP 各装一个 agent。
几个值得记下来的地方:
- Komari 第一次启动时会开一个安装页,谁先打开谁就能创建管理员。所以先只绑本机端口,用 SSH 隧道把管理员建好,再接 Nginx。
- 官方的 agent 安装脚本,直连 GitHub 失败时会自动换第三方镜像下载程序,而且不校验。我装的时候固定了版本,加了
--install-no-mirror,另外关掉了网页终端(--disable-web-ssh),不然面板被攻破就等于拿到所有机器的 shell。 - GCP 要经过 Cloudflare 才能连到面板,那条屏蔽 CDN 的规则就只能删了。
- 通知用 Webhook 接 Bark,方法要选 POST。默认是 GET,GET 不发请求体,Bark 收不到标题和正文。
- GCP 节点的流量阈值设 200 GiB、只统计出站,到 80% 开始推送,之后每多 5% 推一次。它统计的是网卡全部出站,比 GCP 实际计入的只多不少,拿来防超额正好。
后来又加了三网延迟,目标用北京的运营商 DNS:联通 123.123.123.123 和移动 221.130.33.60 用 ICMP,北京电信的 DNS 从国外 ping 不通,改测 TCP 53。结果 GCP 那台三网全是 100% 丢包,美国 VPS 正常。原因是安装脚本用执行 sudo 的那个普通用户跑 agent,没有发 ICMP 的权限;美国 VPS 是用 root 装的。给 GCP 的 agent 加了一个 systemd drop-in,只授予 CAP_NET_RAW,就正常了:
[Service]
AmbientCapabilities=CAP_NET_RAW
CapabilityBoundingSet=CAP_NET_RAW
搭代理:偷自己的域名
代理和美国 VPS 用同一套:VLESS + REALITY + Vision。REALITY 要借一个真实网站的 TLS 握手,我一开始想用 dl.google.com,理由是它不在那三家 CDN 里,GCP 访问 Google 也免费。
后来看到 linux.do 上一个帖子,说的正是这种做法的问题:Google 在国内是被封的,服务器自称是 dl.google.com,一被探测就会被当成新的 Google IP 封掉;偷套了 Cloudflare 的站也不行,别人访问你 IP 上的 /cdn-cgi/trace 就能看出这是代理。楼主还提到最近不少 AI 都在推荐 dl.google.com。
最后照美国 VPS 的做法,偷自己的域名:
客户端 ──► GCP:443 Xray ──► 有密钥:代理出去
└► 没有密钥 / 探测:127.0.0.1:8443 Nginx 诱饵站
GCP:80 Nginx ──► 只给 Let's Encrypt 验证用,其余跳转 https
在 Cloudflare 给 arcueidlwl.date 加了一个灰云子域名 gcp.arcueidlwl.date 指向 GCP,GCP 上装 Nginx 和 certbot,放一个静态页,证书用 webroot 方式申请,Nginx 的 HTTPS 只监听本机 8443。Xray 的 dest 指向 127.0.0.1:8443,serverNames 写这个子域名,路由规则和美国 VPS 一样,拦内网地址和 BT。
验证结果:不带密钥直接访问 https://gcp.arcueidlwl.date,看到的是诱饵页,证书有效;在 GCP 上起一个临时客户端走代理,generate_204 返回 204,出口显示 Google LLC。
外网 IP 我没转成静态的,开机状态下两者价格一样,但静态 IP 不绑机器时每月要收 7 美元多,删机器时容易忘。代价是在控制台点了「停止」再「启动」,IP 会变,到时候要改 Cloudflare 上那条记录。sudo reboot 不会换 IP。
顺带:Xray 撤版和重启
在 GCP 上装 Xray 时,指定 v26.10.29 下载报 404。查了一下,这个版本 10-31 被官方撤了:Linux 内核刚爆出监听 IPv4 MPTCP 的程序容易被远程拿 root,而 Go 1.24 以后默认开着 MPTCP。新版 v26.10.31 默认关掉了它,官方建议尽快升级,并更新内核从根上修复。
美国 VPS 跑的正好是 26.10.29。升级按以前的步骤来:下载 Xray-linux-64.zip,SHA256 和 .dgst 对上,用新版测一遍现有配置,替换二进制,重启服务,代理断了两秒左右。
检查内核时发现美国 VPS 运行的还是 2022 年的 5.15.0-30,5.15.0-202 早就装好了,只是机器一直没重启。重启约 45 秒后 SSH 恢复,但博客的 MySQL 没起来,报挂载失败。原因是这个容器还是 10-31 改 Compose 之前建的,仍挂着一个 aurora.sql 初始化文件,而那个文件已经在清理时删掉了。按现在的配置重建 MySQL 容器就好了,数据在 mysql-data/ 里没动。从重启到后端重新连上数据库,博客的接口断了两分钟左右。以后改了 Compose 里的挂载,要当场重建对应的服务,不然要等下次重启才暴露。
还没做完的
- Komari 的数据目录还没加进每日备份;
- 外网 IP 到底收不收费,要等月初看账单;
- IP 变了要记得改 Cloudflare 的
gcp记录和本机的 SSH 配置。
封面:ナツバ《新約エクシア》,pixiv 136911474。