Chrome 能联网,Codex 还是断网:Tailscale + VPS 出口节点实操记录

这次配置里最容易误判的一步,不是安装 Tailscale,而是判断流量到底走了哪条线路。

我遇到的实际情况是:Windows 和手机已经显示 VPS 的公网 IP,Chrome 也能打开网页,但 Codex 仍然无法联网。最后查到的原因不是出口节点失效,而是 Windows 用户环境变量里还留着旧代理地址。

所以这篇除了记录搭建步骤,还会拆开三个容易混在一起的问题:

  • VPS 有没有正确成为出口节点。
  • Windows 和 Android 有没有真的选择它。
  • 浏览器正常、桌面应用异常时,该从哪里继续排查。

本文以 AlmaLinux 9 VPS、Windows 和 Android 为记录对象。官方安装脚本也支持多种主流 Linux,但没有逐一实测的系统不写成已经跑通。

安全提醒:文中的服务器 IP、账号和密码均使用通用名称。不要公开 root 密码、Tailscale 授权链接、完整 VPS 公网 IP、邮箱、订单号或发票信息。

实测环境记录:

tailscale set --advertise-exit-node

下图是本次使用的 VPS 控制面板。公网 IP 和物理位置已经在原截图中遮挡:

[VPS 控制面板,公网 IP 与位置已遮挡](./assets/tailscale-vps-exit-node-v2/01-vps-control-panel-redacted.png)

最后会得到什么

配置完成后的路径是:

echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.d/99-tailscale.conf

选择这台 VPS 作为 Exit Node 后,普通互联网流量会从 VPS 转发,对外显示的公网 IP 通常会变成 VPS 的公网 IP。目标网站是否可用、速度如何,仍受线路、服务器状态和网站策略影响。

开始前准备

1. 一个 Tailscale 账号

Windows、Android 和 VPS 需要加入同一个 Tailscale 网络,也就是同一个 Tailnet。

2. 一台 Linux VPS

本次使用 AlmaLinux 9。购买前确认:

  • 有公网 IPv4。
  • 支持 SSH。
  • 支持 TUN/TAP。
  • 月流量能够覆盖自己的使用量。
  • 服务商允许当前用途。

套餐流量的重置周期以服务商控制面板为准,不要根据付款周期推断。

3. Windows 和 Android 客户端

  • Windows:<https://tailscale.com/download/windows>
  • Android:Google Play 或 Tailscale 官方渠道

两台设备使用同一个 Tailscale 账号登录。

第一步:从 Windows 登录 VPS

在 Windows 中打开 PowerShell,运行:

| 现象 | 优先检查 | 处理方法 |
| :--- | :--- | :--- |
| SSH 提示 `Connection closed` | VPS 状态、SSH 端口、root 密码 | 在 VPS 后台确认状态和端口,必要时重置密码 |
| 后台看不到 VPS | VPS 尚未登录 Tailnet | 运行 `tailscale up` 并完成网页授权 |
| VPS 不出现在 Exit Node 列表 | 未宣告或未批准 | 运行 `tailscale set --advertise-exit-node`,再到后台批准 |
| 选了出口节点,公网 IP 没变化 | 选错机器或切换未生效 | 切到 `None` 后重选 VPS,再检查公网 IP |
| IP 已变化,但域名打不开 | DNS 配置或缓存异常 | 再进入 DNS 排错,不要一开始就强制修改 |
| Chrome 能联网,Codex 不能 | 旧代理环境变量仍在生效 | 检查 `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY` 并重启 |
| 手机选择出口后没网 | VPS 离线、DNS 异常或出口失效 | 先选 `None` 恢复网络,再逐项检查 |

第一次连接出现下面的提示时输入 yes:

[root@服务器名称 ~]#

再输入 root 密码。SSH 不会显示星号或字符,输入完整密码后按回车。

看到类似提示符,说明已经登录:

curl.exe --noproxy "*" -sS -o NUL -w "%{http_code}`n" --max-time 15 https://api.openai.com/v1/models

这里使用 root 密码只为了完成首次配置。确认出口节点可用后,建议尽快改用 SSH 密钥,不要长期依赖 root 密码登录。

如果出现 Connection closed

依次确认 VPS 为 Running、SSH 端口正确、临时密码没有失效。必要时在服务商控制面板执行 Root password reset,等待几十秒后重试。

本次使用的 KiwiVM 控制面板中,重置入口如下:

[KiwiVM 的 Root password reset 页面](./assets/tailscale-vps-exit-node-v2/02-root-password-reset.png)

第二步:在 VPS 安装 Tailscale

登录 VPS 后运行官方安装脚本:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

安装完成后运行:

echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/99-tailscale.conf

终端会显示一次性授权链接。

  1. 复制链接。
  2. 在自己的浏览器中打开。
  3. 使用与 Windows、Android 相同的 Tailscale 账号登录。
  4. 完成连接授权。

这条链接相当于临时凭证,不要发给其他人。

授权后运行:

tailscale set --advertise-exit-node

能够看到其他设备,说明 VPS 已加入 Tailnet。

下图表示 Tailscale 软件包已经安装完成,终端提示下一步运行 tailscale up:

![AlmaLinux 中完成 Tailscale 安装](./assets/tailscale-vps-exit-node-v2/03-tailscale-installed.png)

第三步:开启 IP 转发并宣告出口节点

Linux 设备要转发其他设备的流量,需要先开启 IP forwarding。

在 VPS 中依次执行:

sysdm.cpl
curl -fsSL https://tailscale.com/install.sh | sh
sysctl -p /etc/sysctl.d/99-tailscale.conf

正常会看到:

systemctl status tailscaled

本次实际执行成功后的终端如下,两项转发值都为 1:

[IPv4 和 IPv6 转发已经启用](./assets/tailscale-vps-exit-node-v2/04-ip-forwarding-enabled.png)

然后宣告出口节点:

tailscale up

命令没有输出也可能正常,最终以管理后台的机器状态为准。

第四步:在管理后台批准

打开:

<https://login.tailscale.com/admin/machines>

然后:

  1. 找到刚加入的 Linux VPS。
  2. 点击最右侧的 …。
  3. 打开 Edit route settings,中文界面通常显示为“编辑路线设置”。
  4. 勾选 Use as exit node。
  5. 保存。

先从机器右侧的菜单进入“编辑路线设置”:

[Tailscale 机器菜单中的编辑路线设置](./assets/tailscale-vps-exit-node-v2/05-edit-route-settings-menu.png)

再勾选“用作出口节点”并保存。部分中文界面可能把 Save 翻译成“节省”,这里实际表示保存:

[批准 Linux VPS 用作出口节点](./assets/tailscale-vps-exit-node-v2/06-exit-node-approved.png)

如果没有这个选项,回到 VPS 再运行一次:

Windows / Android
        ↓
    Tailscale
        ↓
AlmaLinux 9 VPS(出口节点)
        ↓
      互联网

然后刷新管理后台。

第五步:让 Windows 和 Android 使用 VPS

Android

打开 Tailscale:

  1. 确认状态为 Connected。
  2. 打开 Exit Node。
  3. 选择 Linux VPS 的机器名称。
  4. 返回主页确认当前出口。

如果需要访问当前 Wi-Fi 下的打印机、NAS 或路由器后台,可以开启 Allow LAN access。只在信任当前局域网时使用;在公共 Wi-Fi 下不建议随手开启。

Windows

在系统托盘找到 Tailscale:

  1. 右键 Tailscale 图标。
  2. 打开 Use exit node 或 Exit nodes。
  3. 选择 Linux VPS。

如果列表里出现相似名称,不要只看 Recommended,选择后用公网 IP 验证。Windows 只需要使用 VPS 出口;若之前开启过 Run exit node,可以取消。

第六步:验证是否真的生效

1. 检查 Tailscale 状态

VPS 中运行:

HTTP_PROXY
HTTPS_PROXY
ALL_PROXY

确认目标设备在线。

2. 检查公网 IP

打开一个公网 IP 查询网站。结果应显示:

  • 当前公网 IP 是 VPS 的公网 IP。
  • 地区与 VPS 所在地区一致。

手机和 Windows 分别检查一次,不要只根据 Connected 判断。

下图是出口节点生效后,Windows 浏览器能够正常打开 Google 的结果:

[出口节点生效后 Google 可以正常打开](./assets/tailscale-vps-exit-node-v2/07-google-access-success.png)

公网 IP 查询截图包含真实服务器 IP,因此没有放入公开教程。实际验收时只需要确认查询结果与 VPS 控制面板中的公网 IP 和地区一致。

3. 检查 OpenAI API 的网络可达性

Windows PowerShell 可以运行:

tailscale status

401 表示请求抵达 API,但没有有效 API 密钥;超时或无法解析域名则仍有网络、DNS、防火墙或代理问题。它只能证明这个端点可达,不能证明 ChatGPT、Codex 或账号状态一定正常。

浏览器能联网,但 Codex 仍然断网

这是本次配置里真正卡住我的地方。

Chrome 已经走 Tailscale 出口,Codex 却仍然尝试连接一个已经关闭的旧本地代理。原因是 Windows 用户环境变量中还保存着旧代理地址。

检查旧代理环境变量

  1. 按 Win + R。
  2. 输入:
| 项目 | 当前材料能够确认的内容 |
| :--- | :--- |
| VPS 系统 | AlmaLinux 9 |
| 客户端 | Windows、Android |
| 具体系统版本 | Windows 11 25H2、Android 16 |
| Tailscale 客户端版本 | Windows / Linux 1.98.9、Android 1.98.2 |
| 实际测试日期 | 2026-07-26 |
  1. 打开“高级”。
  2. 点击“环境变量”。
  3. 在“用户变量”中检查:
tailscale status

如果这些变量仍指向已经停用的地址,例如 127.0.0.1:端口,并且确定不再使用对应代理软件,只删除这几个旧代理变量。

不要修改无关的系统变量。

删除后重启 Windows,保持旧代理关闭,重新选择 VPS,再启动 Codex。桌面应用可能一直保留启动时读取的环境变量,只刷新浏览器不够。

只有域名打不开时,再处理 DNS

如果公网 IP 已经变成 VPS 的 IP,但域名仍无法解析,再检查 DNS。出口节点正常时,不需要为了“配置完整”强制改成 Cloudflare DNS。

打开:

<https://login.tailscale.com/admin/dns>

可尝试:

  1. 在 Nameservers 中添加 Cloudflare Public DNS。
  2. 根据自己的 Tailnet 需求决定是否开启 Override DNS servers。
  3. 保留正常的 MagicDNS 配置。

Windows 中运行:

ssh root@服务器IP

然后把 Exit Node 切到 None 再重选 VPS,并重开目标应用。

100.100.100.100 是 Tailscale 客户端用于 DNS 处理的虚拟地址,看到它不等于 DNS 出错。

常见问题速查

ipconfig /flushdns

日常开关、流量和维护

使用时确认 VPS 在线,开启 Tailscale,选择 Linux VPS,并保持其他全局代理关闭;不用时选择 Exit Node → None。

出口流量会消耗 VPS 套餐。高清视频、下载、同步和系统更新消耗较多,应定期查看后台。

首次配置后改用 SSH 密钥登录,定期更新系统与 Tailscale,不开放无关端口;设备丢失后立即从 Tailnet 移除。

常用命令:

tailscale status
Are you sure you want to continue connecting (yes/no/[fingerprint])?

最终验收清单

  • [ ] Windows、Android 和 VPS 加入同一个 Tailnet
  • [ ] VPS 在管理后台显示 Connected
  • [ ] VPS 已开启 IPv4/IPv6 转发
  • [ ] VPS 已宣告并获准成为 Exit Node
  • [ ] Windows 和 Android 选择的是 Linux VPS
  • [ ] 公网 IP 查询结果与 VPS 地区一致
  • [ ] 旧全局代理已关闭
  • [ ] Windows 没有继续使用失效的旧代理环境变量
  • [ ] 浏览器和目标桌面应用分别完成联网验证
  • [ ] 只有出现 DNS 问题时,才修改 Tailnet DNS
  • [x] 已保存脱敏后的配置与验证截图

官方参考

  • Tailscale Linux 安装:<https://tailscale.com/docs/install/linux>
  • Tailscale 出口节点:<https://tailscale.com/docs/features/exit-nodes/how-to/setup>
  • Tailscale CLI:<https://tailscale.com/docs/reference/tailscale-cli>
  • Tailscale DNS:<https://tailscale.com/docs/features/magicdns>
  • OpenAI 网络建议:<https://help.openai.com/en/articles/9247338-network-recommendations-for-chatgpt-errors-on-web-and-apps>

当前证据边界

本文根据一次已经成功运行的 AlmaLinux 9、Windows 和 Android 配置整理。命令与操作路径已按本次记录和官方资料核对,但不同 Linux 发行版、Tailscale 客户端版本、管理后台语言及 VPS 服务商界面可能不同。

本文已补入本次操作过程中的七张截图,包括 VPS 控制面板、root 密码重置、Tailscale 安装、IP 转发、出口节点批准和网页验证。含邮箱、完整公网 IP、Tailscale 地址或账号信息的原始截图未纳入教程,因此截图数量与实际操作记录并不一一对应。