这篇文章记录一次从 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 一定更干净,而是因为我想换一个新的地址,重新测试访问效果。
| 项目 | Vultr | Google Cloud |
|---|---|---|
| 地址类型 | 数据中心公网 IP | 数据中心公网 IP |
| 网络归属 | Vultr | |
| 本次月成本 | 约 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 永远不会触发风控。它只能说明这次测试结果正常。
十一、成本
本次配置如下:
| 项目 | 配置 |
|---|---|
| CPU | e2-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. 只检查本地端口,不检查云防火墙
服务器上看到端口监听,并不代表公网一定能访问。
如果本地检查正常、客户端仍然连接失败,应按这个顺序检查:
- Hysteria2 服务是否运行;
- 服务是否监听 UDP 443;
- VM 是否带有
vpn标签; - Google Cloud 防火墙规则是否匹配该标签;
- 客户端地址、端口和密码是否正确。
链路结构
电脑 / 客户端
|
| Hysteria2 over UDP 443
|
Google Cloud VM
|
| Hysteria2 Server
|
Internet
|
Grok / ChatGPT / Google 等服务
总结
对我这次的个人、低流量使用,Google Cloud 的低配 VM 加 Hysteria2 已经够用。成本不高,节点重建也比较快,更换出口 IP 后,之前访问 Grok 的问题暂时消失了。
但这套方案解决的只是“换一个出口 IP”,并不能保证新 IP 没有历史风险,也不能保证绕过所有网站的风控。费用会随磁盘、IPv4 和流量变化,服务器、密码和配置文件也需要自己维护。
如果你的需求和我一样,只是运行一个个人节点,这个方案可以作为一个低成本选项。
发表评论