开了一台 GCP 免费机,搭了第二个代理节点

· 网安 · #服务器, #折腾, #Xray

在 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,一个数字菜单:

我建的是 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。

几个值得记下来的地方:

后来又加了三网延迟,目标用北京的运营商 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 里的挂载,要当场重建对应的服务,不然要等下次重启才暴露。

还没做完的

封面:ナツバ《新約エクシア》,pixiv 136911474。

← 全部文章