这篇文章记录一次从 Vultr 迁移到 Google Cloud Compute Engine 的过程。我用一台低配置 VM 搭建个人 Hysteria2 节点,主要是为了更换出口 IP,看看之前访问 Grok 时遇到的拦截能不能解决。

先说明一个术语:Hysteria2 本身是代理协议,不是 WireGuard 或 OpenVPN 那类传统三层 VPN。客户端启用 TUN 模式后,才会获得比较接近 VPN 的全局代理体验。具体可以参考 Hysteria 官方客户端配置文档

背景

之前我在 Vultr 上跑过一台个人节点,配置如下:

  • 1 vCPU
  • 1GB RAM
  • 25GB SSD
  • Debian 12
  • Hysteria2

它一直运行得很稳定。后来有一天访问 Grok 时,页面出现了:

Sorry, you have been blocked
You are unable to access grok.com

我先检查了节点服务、本地网络和浏览器,结果都没有发现明显问题。换浏览器也没用。

当时我把原因归到了出口 IP 的信誉问题上。数据中心 IP 可能被之前的使用者拿去爬虫、发垃圾请求或搭建代理,之后被网站的风控系统重点关注。不过,这只是根据现象做出的推测,并不是 Cloudflare 或 Grok 给出的明确诊断。

于是我决定换一家云厂商,先换一个新的出口 IP 试试。

一、为什么选择 Google Cloud?

Google Cloud 和 Vultr 都提供数据中心公网 IP。选择 Google Cloud,并不是因为它的 IP 一定更干净,而是因为我想换一个新的地址,重新测试访问效果。

项目VultrGoogle Cloud
地址类型数据中心公网 IP数据中心公网 IP
网络归属VultrGoogle
本次月成本约 6 美元约 6 美元
使用体验之前运行稳定换 IP 后 Grok 可以访问

IP 信誉最终还是取决于具体地址,换云厂商不能保证绕过所有网站的风控。

二、创建 Google Cloud VM

进入:

Google Cloud Console
  ↓
Compute Engine
  ↓
VM instances
  ↓
Create Instance

Machine configuration

选择:

E2
e2-micro

我本次创建时选择了 1GB 内存。e2-micro 属于共享核心机型,Google 当前文档列出的规格是 0.25 vCPU、1–2GB 可选内存,具体配置以控制台显示为准。Google Cloud E2 机型文档

对于个人使用、低流量代理节点,这个规格在我的场景里够用。如果同时连接很多设备,或者有较大的下载需求,就不能只看 CPU 和内存,还要观察带宽和出站流量。

Region

我优先考虑:

us-west1
us-west2

美国西海岸通常是比较自然的测试方向,但距离并不能直接决定体验。实际延迟还会受到线路和网络路由影响,最好创建后自己测试。

如果只是临时验证,也可以选择:

us-central1

操作系统

可以选择:

Debian 12/13

或者:

Ubuntu 24.04 LTS

本次使用的是:

Debian 13

具体镜像是否可选,以当前控制台为准。

磁盘

选择:

Standard persistent disk

容量:

25GB

个人节点不需要太高的磁盘性能,Standard persistent disk 已经够用。Balanced persistent disk 对这个用途没有明显必要。

数据保护

本次选择:

No backups

个人节点确实可以不做整机备份,但密码和配置文件要自己保存好。否则服务器重建后,还要重新生成配置并更新所有客户端。

三、网络配置

Network tags

给 VM 添加标签:

vpn

后面防火墙规则会通过这个标签匹配实例。

HTTP 和 HTTPS

创建 VM 时,不需要勾选:

Allow HTTP traffic
Allow HTTPS traffic

Hysteria2 使用 UDP,不需要额外开放 Web 服务端口。

不过要确认 SSH 访问规则仍然存在。如果当前网络没有允许 TCP 22 的规则,之后可能无法从控制台登录服务器。

四、开放 Hysteria2 端口

进入:

VPC Network
  ↓
Firewall
  ↓
Create Firewall Rule

创建规则:

Name:
allow-hysteria2

Direction:
Ingress

Target tags:
vpn

Source IPv4 ranges:
0.0.0.0/0

协议和端口:

UDP:443

也就是:

udp: 443

Hysteria2 使用 UDP。防火墙端口、服务器监听端口和客户端端口必须保持一致。

五、SSH 登录服务器

创建完成后,点击:

SSH

进入服务器后,可以先确认当前用户:

whoami

如果需要切换 root:

sudo -i

再次执行:

whoami

输出 root 后,后续命令可以直接执行,不必重复加 sudo

六、安装依赖

普通用户下执行:

sudo apt update
sudo apt install -y curl socat

apt update 不需要加 -y-y 只对安装或升级时的确认提示有用。

七、安装 Hysteria2

下面是我当时使用的第三方安装脚本。脚本地址和内容都可能变化,执行前应该先打开仓库检查,不要直接把陌生脚本通过管道交给 Bash 执行。

切换到 root 后,把脚本保存到固定位置:

sudo -i

curl -fL \
  https://raw.githubusercontent.com/flame1ce/hysteria2-install/main/hysteria2-install-main/hy2/hysteria.sh \
  -o /root/hysteria.sh

确认脚本内容后执行:

bash /root/hysteria.sh

这里没有继续使用原来的 --no-check-certificate。跳过 TLS 证书校验会降低下载过程的安全性,除非是在明确知道风险的临时环境中,否则不建议这样做。

安装完成后,配置文件通常位于:

/etc/hysteria/config.yaml

八、修改监听端口

打开配置文件:

nano /etc/hysteria/config.yaml

如果看到:

listen: :58707

就改成:

listen: :443

保存并退出:

Ctrl + O
Enter
Ctrl + X

然后重启服务:

systemctl restart hysteria-server

检查服务状态:

systemctl status hysteria-server --no-pager

本次安装脚本创建的服务名是 hysteria-server。如果你使用的脚本创建了其他名称,以实际的 systemd 服务名为准。

检查 UDP 443 是否监听:

ss -lunp | grep ':443'

正常情况下会看到类似:

UNCONN 0 0 0.0.0.0:443 0.0.0.0:*

这只能说明服务器进程已经监听端口。客户端能否连通,还要同时满足 Google Cloud 防火墙、服务器配置和客户端参数都正确。

九、配置客户端

把客户端的服务器地址改成新 VM 的公网 IP:

Server:
34.xxx.xxx.xxx

Port:
443

Password:
安装脚本生成的密码

如果客户端使用 YAML 配置,通常类似这样:

server: 34.xxx.xxx.xxx:443
auth: 安装脚本生成的密码

不同客户端的字段名称可能略有差异。

如果只是更换服务器地址,旧配置中的其他参数可以先保持不变。但 TLS 的 SNI、证书校验、认证方式等内容必须和新服务器的配置对应,不能机械地全部照搬。

十、验证

连接客户端后,访问:

https://grok.com

如果页面可以正常打开,至少说明这台客户端通过新节点访问 Grok 的链路已经工作。

这不代表所有网站都会使用同样的判断标准,也不代表新 IP 永远不会触发风控。它只能说明这次测试结果正常。

十一、成本

本次配置如下:

项目配置
CPUe2-micro,共享核心
内存1GB
磁盘25GB Standard persistent disk
公网地址IPv4
操作系统Debian 13
节点协议Hysteria2

我这次的月账单大约是:

$6/月

按当时的汇率,大约是:

40–45 元/月

这个数字只是本次使用情况,不是固定报价。Google Cloud 会分别计算 VM、磁盘、外部 IPv4 和网络流量,免费额度也有适用条件。创建实例时,最好直接查看控制台的价格估算和 Compute Engine 官方价格页。网络和外部 IP 的费用可以参考 Google Cloud 网络价格文档

如果出站流量增加,实际账单也会随之上涨。

十二、遇到的问题

1. apt 权限错误

错误信息:

Permission denied
Could not open lock file

原因是普通用户没有权限修改系统软件包。

普通用户应执行:

sudo apt update

如果已经进入 root,则可以直接执行:

apt update

2. root 用户的工作目录不同

普通用户的目录通常是:

/home/user

切换到 root 后,当前目录一般会变成:

/root

如果脚本下载在:

/home/user/hysteria.sh

切换 root 后直接执行:

bash hysteria.sh

就可能提示找不到文件。

可以使用绝对路径:

bash /home/user/hysteria.sh

我后来直接把脚本保存到 /root/hysteria.sh,少处理一个路径问题。

3. Hysteria2 监听端口和防火墙端口不一致

这是这次最容易忽略的地方。

服务器配置是:

listen: :58707

Google Cloud 防火墙开放的却是:

UDP 443

客户端自然无法连接。

要么把防火墙改成 UDP 58707,要么把服务改成监听 UDP 443。为了和常见客户端配置保持一致,我最后采用了:

服务器监听:443
防火墙:UDP 443
客户端:443

4. 只检查本地端口,不检查云防火墙

服务器上看到端口监听,并不代表公网一定能访问。

如果本地检查正常、客户端仍然连接失败,应按这个顺序检查:

  1. Hysteria2 服务是否运行;
  2. 服务是否监听 UDP 443;
  3. VM 是否带有 vpn 标签;
  4. Google Cloud 防火墙规则是否匹配该标签;
  5. 客户端地址、端口和密码是否正确。

链路结构

电脑 / 客户端
      |
      | Hysteria2 over UDP 443
      |
Google Cloud VM
      |
      | Hysteria2 Server
      |
    Internet
      |
Grok / ChatGPT / Google 等服务

总结

对我这次的个人、低流量使用,Google Cloud 的低配 VM 加 Hysteria2 已经够用。成本不高,节点重建也比较快,更换出口 IP 后,之前访问 Grok 的问题暂时消失了。

但这套方案解决的只是“换一个出口 IP”,并不能保证新 IP 没有历史风险,也不能保证绕过所有网站的风控。费用会随磁盘、IPv4 和流量变化,服务器、密码和配置文件也需要自己维护。

如果你的需求和我一样,只是运行一个个人节点,这个方案可以作为一个低成本选项。