# 科学上网为什么要分两台 VPS?CN2 GIA 线路机 + 美国住宅 IP 落地机完整搭建
**作者**: Kafka
**日期**: 2026-07-26T06:15:11.000Z
**来源**: [https://x.com/kafkasudo/status/2081262032637345866](https://x.com/kafkasudo/status/2081262032637345866)
---

很多人在搭建科学上网节点时,都想找到这样一台美国 VPS:既有 CN2 GIA 优化线路,又带美国原生住宅 IP,价格还不能太高。
这类“全能 VPS”并不常见,因为线路质量和出口身份其实是两个问题。
CN2 GIA 解决的是中国大陆到境外服务器之间的连接质量;美国住宅 IP 解决的是访问网站时,对方看到什么类型的公网地址。更合理的做法,是让两台 VPS 各自完成一件事:
```
中国客户端
│ VLESS + REALITY + Vision(TCP/443)
▼
线路机 A(CN2 GIA)
│ WireGuard(仅在美国境内传输)
▼
住宅 IP VPS B
│ NAT
▼
Internet(网站看到 B 的美国住宅出口 IP)
```
线路机 A 负责“接得稳”,住宅机 B 负责“从哪里出去”。
## 为什么不让中国客户端直接连接 WireGuard
WireGuard 加密可靠、效率高,也很适合两台服务器之间的固定隧道。但 Xray 官方文档指出,WireGuard 使用固定的 UDP 流量特征,不具备普通 HTTPS 的外观,直接用于容易受到识别和阻断的第一段线路并不理想。Xray 传输说明
因此,这套方案把两种协议放在各自更适合的位置:
- 中国客户端到线路机 A:使用 VLESS + REALITY + Vision;
- 线路机 A 到住宅机 B:使用 WireGuard。
REALITY 是一种经过修改的 TLS 传输安全方案,外部流量形态更接近普通网页访问;Vision 则用于 VLESS 的流量控制和性能优化。REALITY 官方文档
WireGuard 不再跨越中国到美国这段复杂线路,只在两台美国 VPS 之间工作,连接通常更稳定,额外延迟也比较有限。
## CN2 GIA 和住宅 IP 分别解决什么问题
中国电信将 GIA 描述为通过 CN2 提供的优质中国方向互联网接入产品。中国电信 GIA 产品说明
但 VPS 商家写着“CN2 GIA”,并不代表所有地区、所有运营商和所有时间段的表现都一样。购买线路机 A 前,至少应该检查:
- 是否提供测试 IP 或 Looking Glass;
- 中国到服务器和服务器回中国的双向路由;
- 晚高峰的延迟、抖动与丢包;
- 自己所在省份和运营商的实际表现;
- 带宽是否共享、限速或严重超售;
- TCP/443 是否可以正常使用。
住宅机 B 则不需要昂贵的中国优化线路,因为中国客户端不会直接连接它。它更重要的指标是:
- 具有 root、TUN、WireGuard 和 NAT 权限;
- 是真正的 VPS,而不只是一个 SOCKS/HTTP 代理账号;
- 出口在多家 IP 数据库中定位为美国;
- ASN、ISP 和 User Type 接近居民宽带;
- 没有明显的 Hosting、VPN、Proxy 标记;
- 最好使用独享、稳定的 IPv4;
- 与线路机 A 位于相同或相近地区。
“美国原生住宅 IP”没有统一的认证标准。MaxMind 对 Residential 的解释也只是“这个地址可能被用于住宅互联网”,判断依据还包括地址注册、使用模式和共享用户数量。MaxMind 用户类型说明
所以,住宅 ASN 不等于百分之百解锁。网站还会结合 IP 信誉、账号历史、访问频率和设备特征进行判断。
## 第一步:在线路机 A 上安装 3x-ui
以下步骤按照 2026 年 7 月 15 日的 3x-ui v3.5.0 界面编写。3x-ui 是第三方 Xray 管理面板,不属于 Xray-core 官方项目。3x-ui 项目及v3.5.0 发布页
本方案建议使用原生安装。Docker 会额外引入容器网络命名空间、宿主机转发和容器 NAT,使后面的 WireGuard 策略路由复杂不少。
```
sudo -i
curl -fLo /root/3x-ui-install.sh \
https://raw.githubusercontent.com/MHSanaei/3x-ui/master/install.sh
less /root/3x-ui-install.sh
bash /root/3x-ui-install.sh v3.5.0
```
安装后先处理面板安全:
- 面板端口不要占用代理使用的 TCP/443;
- 使用 HTTPS,或者只监听 127.0.0.1,通过 SSH 隧道访问;
- 启用 2FA、强密码和随机访问路径;
- 管理端口只允许自己的 IP;
- 保留 SSH 和服务商控制台;
- 定期备份 /etc/x-ui/x-ui.db。
在整条线路配置完成前,先不要启用 VLESS 入站,防止测试流量直接从 A 出口。
## 第二步:用 3x-ui 建立 VLESS + REALITY + Vision
进入“入站 → 添加入站”,填写:
- 备注:CN2-Reality
- 协议:VLESS
- 监听端口:443
- 传输:RAW
- Decryption/Encryption:none
- Security:REALITY
- Show:关闭
- Xver:0
- uTLS/Fingerprint:chrome
- Proxy Protocol:关闭
- HTTP 伪装:关闭
- Final Mask:关闭
当前界面显示 RAW,导出的分享链接中仍可能出现 type=tcp,这是正常的兼容表示。
REALITY 的 Target 不要直接照抄某篇教程。使用面板内置的 Target 扫描功能,选择:
- 线路机 A 可以稳定访问;
- 支持合适的 TLS;
- SNI 与证书域名一致;
- 尽量位于相近网络;
- 不是大型 CDN 的目标站点。
Xray 官方特别提醒:未通过 REALITY 验证的连接可能被转发到 Target。如果选择大型 CDN 地址,服务器被扫描后可能变成可被滥用的转发入口。
随后生成:
- X25519 密钥对;
- Short ID;
- 与 Target 证书匹配的 SNI。
服务端私钥只能保留在线路机 A,客户端拿到的是公钥。
当前 3x-ui 已经把“入站”和“客户端”分开。保存入站后,进入“客户端 → 添加客户端”:
- 关联 CN2-Reality 入站;
- UUID 使用面板生成值;
- Flow 选择 xtls-rprx-vision;
- 邮箱填写设备标识,例如 home-phone。
最后从入站菜单导出二维码或 VLESS 链接。链接至少应包含:
```
security=reality
type=tcp
pbk=<REALITY 公钥>
fp=chrome
sni=<目标域名>
sid=<Short ID>
flow=xtls-rprx-vision
```
客户端的 Mux 先保持关闭。
## 第三步:建立 A 与 B 之间的 WireGuard
在两台 VPS 上分别安装 WireGuard 并生成密钥:
```
sudo apt update
sudo apt install -y wireguard
sudo sh -c \
'umask 077; wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey'
```
查看各自公钥:
```
sudo cat /etc/wireguard/publickey
```
只交换公钥,不要把私钥发送给任何人。
考虑到部分住宅 VPS 没有稳定的公网入站端口,这里让住宅机 B 主动连接线路机 A。
线路机 A 的 /etc/wireguard/wg-out.conf:
```
[Interface]
Address = 10.77.0.1/30
ListenPort = 51820
PrivateKey = <A_PRIVATE_KEY>
Table = off
MTU = 1380
PostUp = ip -4 route replace default dev %i src 10.77.0.1 metric 10 table 166
[Peer]
PublicKey = <B_PUBLIC_KEY>
AllowedIPs = 0.0.0.0/0
```
A 不填写 Endpoint,等待 B 主动连接。
Table = off 很重要。否则 wg-quick 看到 AllowedIPs = 0.0.0.0/0 后,可能自动接管 A 的系统默认路由,影响 SSH、REALITY 回包和服务器自身联网。
住宅机 B 的 /etc/wireguard/wg-out.conf:
```
[Interface]
Address = 10.77.0.2/30
PrivateKey = <B_PRIVATE_KEY>
MTU = 1380
[Peer]
PublicKey = <A_PUBLIC_KEY>
Endpoint = <A的公网IPv4>:51820
AllowedIPs = 10.77.0.1/32
PersistentKeepalive = 25
```
PersistentKeepalive = 25 是 WireGuard 官方针对 NAT 后节点给出的常用设置。WireGuard Quick Start
A 的防火墙或安全组开放 UDP/51820。B 只要能够向外发起 UDP 连接即可。
## 第四步:在住宅机 B 上开启转发和 NAT
A 上的 Xray 会终止第一段连接,再建立新的目标连接,因此 A 不需要开启 ip_forward。
B 才是真正转发 IP 数据包的机器。
在 B 创建 /etc/sysctl.d/99-residential-exit.conf:
```
net.ipv4.ip_forward=1
```
应用:
```
sudo sysctl --system
```
查看 B 的公网网卡:
```
ip -4 route show default
```
假设公网网卡是 eth0:
```
sudo iptables -I FORWARD 1 \
-i wg-out -o eth0 \
-s 10.77.0.1/32 \
-j ACCEPT
sudo iptables -I FORWARD 1 \
-i eth0 -o wg-out \
-d 10.77.0.1/32 \
-m conntrack --ctstate ESTABLISHED,RELATED \
-j ACCEPT
sudo iptables -t nat -A POSTROUTING \
-s 10.77.0.1/32 \
-o eth0 \
-j MASQUERADE
```
将 eth0 换成实际网卡,并通过当前使用的 nftables、UFW 或 iptables 体系持久化规则。
NAT 是网站最终看到 B 的关键。数据包离开 B 的公网网卡前,源地址会从 10.77.0.1 改写为 B 的公网出口 IP。目标网站建立连接时看到的自然就是 B,而不是 A。
## 第五步:让 A 只把 Xray 流量送进 WireGuard
不能把线路机 A 的整个默认路由切到 B。正确做法是:
```
Xray Freedom 出站
│ fwmark 102
▼
Linux 路由表 166
│
▼
wg-out
```
同时还要解决一个容易被忽略的问题:如果 WireGuard 掉线,表 166 变成空表,Linux 可能继续查询主路由表,最后从 A 的机房 IP 出去。
所以,表 166 必须永久保留一条 unreachable default。
在 A 创建 /usr/local/sbin/xray-egress-guard:
```
#!/bin/sh
set -eu
ip -4 route replace unreachable default metric 42760 table 166
ip -6 route replace unreachable default metric 42760 table 166
ip -4 rule show | grep -q 'fwmark 0x66.*lookup 166' ||
ip -4 rule add pref 100 fwmark 102/0xffffffff lookup 166
ip -6 rule show | grep -q 'fwmark 0x66.*lookup 166' ||
ip -6 rule add pref 100 fwmark 102/0xffffffff lookup 166
```
添加执行权限:
```
sudo chmod 0755 /usr/local/sbin/xray-egress-guard
```
创建 /etc/systemd/system/xray-egress-guard.service:
```
[Unit]
Description=Fail-closed routing for marked Xray traffic
Before=wg-quick@wg-out.service x-ui.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/xray-egress-guard
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
```
让 3x-ui 等待策略路由和 WireGuard。执行:
```
sudo systemctl edit x-ui
```
填入:
```
[Unit]
Requires=xray-egress-guard.service wg-quick@wg-out.service
After=xray-egress-guard.service wg-quick@wg-out.service
```
启动 A:
```
sudo systemctl daemon-reload
sudo systemctl enable --now xray-egress-guard.service
sudo systemctl enable --now wg-quick@wg-out.service
sudo systemctl restart x-ui
```
启动 B:
```
sudo systemctl enable --now wg-quick@wg-out.service
```
WireGuard 正常时,表 166 中低 metric 的 wg-out 默认路由优先。WireGuard 消失后,这条路由会随接口一起消失,只剩 unreachable default,流量直接失败,不会回落到 A。
IPv6 也使用不可达路由。本方案没有配置住宅 IPv6,因此不能允许 IPv6 从 A 的公网接口旁路。
## 第六步:在 3x-ui 中建立住宅出口
进入“出站 → 添加出站”:
- Protocol:Freedom
- Tag:residential
- Domain Strategy:ForceIPv4
- Sockopt:开启
- Mark/Fwmark:102
- Interface:留空
不要同时填写 Mark = 102 和 Interface = wg-out。只绑定 Interface 并不能自动完成 Table = off 下的策略路由;使用 Mark 更容易验证,也更方便建立断线保护。Xray Sockopt 文档
然后在“路由 → 添加规则”:
- 保留 API 规则为第一条;
- Inbound Tag 从下拉框选择 VLESS 入站的真实标签;
- Network:tcp,udp
- Outbound Tag:residential
- 放在普通直连规则之前;
- 保留必要的私网地址和滥用阻断规则。
最好把 residential 放在出站列表第一位。这样即使路由标签选错,Xray 也不会静默使用未标记的 direct 出站。
如果无法调整顺序,可以把原有 direct Freedom 出站也设置为相同的 fwmark 102。
## 客户端如何从国内访问
把 3x-ui 导出的 VLESS 链接导入支持 REALITY 和 Vision 的客户端。
如果只是打开浏览器,可以使用系统代理;如果希望大部分程序都走节点,应启用:
- TUN 或 Route All;
- 远程 DNS、DNS 经代理或 FakeDNS;
- 禁止 IPv6 直连;
- xtls-rprx-vision;
- 初始阶段关闭 Mux。
A 上的 Xray DNS 不要使用 localhost、https+local:// 等 Local Mode,因为这些查询不会经过正常路由。
可以配置:
```
{
"servers": [
"https://1.1.1.1/dns-query"
],
"queryStrategy": "UseIPv4",
"tag": "dns-via-b"
}
```
然后增加:
```
Inbound Tag:dns-via-b
Outbound Tag:residential
```
Xray 官方文档说明,非 Local DNS 可以通过 dns.tag 进入正常路由系统。Xray DNS 文档
## 如何验证出口确实是 B
检查 WireGuard:
```
sudo wg show wg-out
ping -c 3 10.77.0.2
```
latest handshake 应持续更新,传输计数应双向增长。
检查线路机 A 的策略路由:
```
ip -4 rule show
ip -4 route show table 166
ip -4 route get 1.1.1.1 mark 102
ip -4 route get 1.1.1.1
```
带 mark 102 的查询应显示:
```
dev wg-out table 166 src 10.77.0.1
```
不带标记的查询仍然走 A 自己的公网网卡。
检查 IPv6:
```
ip -6 route get 2606:4700:4700::1111 mark 102
```
没有住宅 IPv6 时,这条命令应返回不可达。
然后分别执行:
```
curl -4 https://api.ipify.org
```
预期结果:
```
A 直接查询 → A 的 CN2 机房 IP
B 直接查询 → B 的住宅出口 IP
中国客户端经过节点 → 与 B 完全相同
```
最后进行断线测试:
```
sudo systemctl stop wg-quick@wg-out
```
此时客户端必须无法访问外网,但 A 的 SSH 和系统直连仍应正常。客户端绝不能继续访问并显示 A 的机房 IP。
恢复:
```
sudo systemctl start wg-quick@wg-out
```
如果 WireGuard 停止后客户端仍然能够访问,说明策略路由、出站排序或 fwmark 配置仍有遗漏。
## 这套科学上网方案的真正价值
双机方案没有创造一台“万能 VPS”,而是把问题拆开:
- CN2 GIA 线路机负责中国方向的连接质量;
- VLESS + REALITY + Vision 负责第一段传输;
- WireGuard 负责美国境内的服务器隧道;
- 住宅机 B 负责最终出口;
- NAT 让目标网站看到 B 的公网 IP;
- Fail-closed 路由避免 B 掉线后泄露 A 的机房 IP。
代价也很明确:费用更高、延迟略有增加、需要维护两台机器,任何一端故障都会影响使用。普通浏览未必需要这么复杂;只有当你既在意中国方向线路,又希望获得美国住宅出口时,这种拆分才有意义。
而且,它改变的只是网络出口。网站仍可能结合账号地区、Cookie、时区、语言、WebRTC、浏览器和设备指纹进行判断。住宅 IP 能解决出口问题,但不能替代完整、稳定且一致的使用环境。
## 相关链接
- [Kafka](https://x.com/kafkasudo)
- [@kafkasudo](https://x.com/kafkasudo)
- [31K](https://x.com/kafkasudo/status/2081262032637345866/analytics)
- [Xray 传输说明](https://xtls.github.io/en/config/transport.html)
- [REALITY 官方文档](https://xtls.github.io/en/config/transports/reality.html)
- [中国电信 GIA 产品说明](https://www.chinatelecomeurope.com/product/global-internet-access/)
- [MaxMind 用户类型说明](https://support.maxmind.com/knowledge-base/articles/maxmind-user-context-data)
- [3x-ui 项目](https://github.com/MHSanaei/3x-ui)
- [v3.5.0 发布页](https://github.com/MHSanaei/3x-ui/releases/tag/v3.5.0)
- [WireGuard Quick Start](https://www.wireguard.com/quickstart/)
- [Xray Sockopt 文档](https://xtls.github.io/en/config/transports/sockopt.html)
- [Xray DNS 文档](https://xtls.github.io/en/config/dns.html)
- [Upgrade to Premium](https://x.com/i/premium_sign_up)
- [2:15 PM · Jul 26, 2026](https://x.com/kafkasudo/status/2081262032637345866)
- [31.2K Views](https://x.com/kafkasudo/status/2081262032637345866/analytics)
- [View quotes](https://x.com/kafkasudo/status/2081262032637345866/quotes)
---
*导出时间: 2026/7/27 09:37:03*