Back to all posts
DevOps

抛弃你的 VPN:构建一条通往家庭网络的零丢包私有隧道

你正坐在地球另一端的酒店里,盯着一个卡住的终端。你在一个简单的 SSH 命令上按下 Enter,光标只是对着你闪烁。五分钟后:Operation timed out (操作超时)。你启动你的企业 VPN,再试一次,现在你的 API 调用失败了,因为地理位置封锁。

说实话:商业 VPN 不是为开发人员设计的。它们是一场维护噩梦,它们的 IP 被地球上的每个防火墙标记,并且通过标准国际路由的丢包会毁掉你的工作流。

情况是这样的。我们将构建一座坚如磐石的防封锁网桥。我们将使用一个高级 VPS 在 VIP 互联网车道上捕获您的流量,并直接在您客厅里的树莓派上打一个洞。没有卡住的终端。没有地理封锁。只有对您家庭网络纯粹的、不受限制的访问。

深入探讨:为什么标准 VPN 会失败

如果您只是在随机的云服务器上部署 WireGuard 或 OpenVPN,在受到严格审查的地区,深度包检测 (DPI) 会在数小时内标记并限制您的连接。

为了击败这一点,我们需要两件事:

  1. 高级路由 (AS9929/AS10099): 这是物理层。与其通过拥挤的公共网络节点反弹,不如购买一个位于优质、低延迟企业电缆上的 VPS。
  2. VLESS-Reality: 这是伪装。VLESS-Reality 不是看起来像代理流量,而是使您的连接看起来与访问主要网站(如 iCloud 或 Windows Update)的标准 HTTPS 流量完全相同。防火墙只看到一个正在同步他的日历的人,而不是一个穿透到专用网络的开发人员。

让我们构建它。

私有隧道系统图


第 1 阶段:获取您的精英中继 (SaltyFish VPS)

要构建零丢包网桥,您需要一个位于互联网“VIP 车道”上的 VPS。我们使用 SaltyFish (咸鱼云) 作为我们的例子,因为他们专注于高级企业路由(AS9929 和 AS10099),这对于击败国际拥堵至关重要。

1. 注册

前往 portal.saltyfish.io 注册一个帐户。使用真实的电子邮件地址,因为您将需要它来获取服务器凭据和计费。

2. 选择正确的套餐

登录并转到 Services (服务) -> Order New Services (订购新服务)。

  • Location (位置):寻找“San Jose - Premium (圣何塞 - 高级)”或“Frankfurt - Premium (法兰克福 - 高级)”。
  • Network (网络):确保描述中提到 AS9929 或 AS10099。这是秘诀。标准的“BGP”路由不会给你同样的稳定性。
  • Specs (规格):最小的 1vCPU / 1GB RAM 计划对于网络隧道来说绰绰有余。

3. 结账

选择 Debian 12 作为您的操作系统。设置一个强大的 root 密码。完成付款。一旦状态变为“Active (活动)”,复制您的 Server IP Address (服务器 IP 地址)。


第 2 阶段:部署云网桥 (VPS)

VPS 充当我们的稳定中继站。它在高级电缆上捕获我们的流量并将其转发到我们家。

打开您的终端,通过 SSH 连接到您的新 SaltyFish VPS 并运行 Docker。它极其简单:

# 登录 VPS 并输入密码
ssh root@[IP_ADDRESS]

使用官方脚本更新您的系统并安装 Docker:

# 更新软件包并安装先决条件
apt update && apt install -y ufw curl wget nano

# 拉取官方 Docker 安装脚本
curl -fsSL https://get.docker.com | sh

# 启用并启动 Docker 守护进程
systemctl enable docker && systemctl start docker

接下来,锁定防火墙。我们只需要端口 443(用于您的客户端)和 7000(用于树莓派)。

ufw allow ssh
ufw allow 7000/tcp
ufw allow 443/tcp
ufw --force enable

现在,我们部署 FRP 服务器 (frps)。这处理反向代理魔法,因此我们不必去弄乱您的家庭路由器的端口转发。

mkdir -p /root/frp && cd /root/frp

# 在运行 Docker 之前创建配置文件
nano frps.toml

专业提示: 请勿跳过在运行 Docker 命令之前创建 frps.toml 文件。如果您将不存在的文件传递给 Docker 卷挂载,Docker 将假定它是一个目录并创建一个名为 frps.toml 的文件夹。您将收到一个令人讨厌的 OCI runtime create failed 错误,并且必须对其执行 rm -rf。省去您头痛的麻烦。

将此粘贴到 frps.toml 中:

# VPS (如 Saltyfish VPS) 配置
serverAddr = "Your_VPS_Public_IP"
# 你的树莓派将连接到的端口
bindPort = 7000
# 把这个改成你猜不到的东西
auth.token = "YOUR_SUPER_SECRET_PASSWORD" 

[[proxies]]
name = "xray-reality"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8443
remotePort = 443

启动它:

docker run -d --name frps --restart=always \
  --network host \
  -v /root/frp/frps.toml:/etc/frp/frps.toml \
  snowdreamtech/frps

第 3 阶段:锁定大本营 (树莓派 Raspberry Pi)

现在我们离开云端回家。我们需要准备您的树莓派作为我们安全隧道的终端。

3.1 验证连通性

在您尝试登录之前,请确保您的树莓派在您的本地网络上是活动的。找到它的 IP 地址(通常通过路由器的管理页面)并给它 ping 一下:

ping YOUR-PI-IP # 或直接使用 IP

如果您看到 0.0% packet loss (0.0% 丢包率),您就可以开始了。

3.2 SSH 进入树莓派

打开您的终端并跳入树莓派。如果是第一次连接,您会看到关于“主机真实性 (authenticity of host)”的警告。键入 yes 将其添加到您的 known_hosts。

ssh your_username@YOUR-PI-IP # 使用您的本地 IP 地址,或树莓派的主机名。

3.3 “找不到命令 (Command Not Found)” 陷阱

许多开发人员尝试立即运行 Docker 命令,结果被 -bash: docker: command not found 击中。不要惊慌——这只是意味着 Docker 尚未安装。

运行官方便捷脚本以使引擎运行:

curl -fsSL https://get.docker.com | sudo sh

3.4 权限管理

默认情况下,Docker 需要 root 权限。为避免每五秒键入一次 sudo,请将您的用户添加到 docker 组:

# 用您的实际用户名替换 $USER
sudo usermod -aG docker $USER
newgrp docker

3.5 部署 3X-UI 控制面板

现在我们部署操作的大脑。此面板将管理我们的 VLESS-Reality 凭据。

docker run -itd \
   -p 2053:2053 \
   -p 8443:8443 \
   --name 3x-ui \
   --restart=always \
   ghcr.io/mhsanaei/3x-ui:latest

3.6 连接 FRP 客户端

最后,我们需要将树莓派连接回云网桥 (VPS)。

关于路径的专业提示: 不要使用像 /home/pi/frp 这样的硬编码路径。根据您的设置,您的主目录可能是以您的用户命名的(例如,/home/elvisli)。始终使用 ~/ 来指代您的主文件夹。

mkdir -p ~/frp && cd ~/frp
nano frpc.toml

粘贴您的配置(匹配来自您 VPS 的 token):

serverAddr = "YOUR_VPS_PUBLIC_IP"
serverPort = 7000
auth.token = "YOUR_SUPER_SECRET_PASSWORD"

[[proxies]]
name = "xray-reality"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8443
remotePort = 443 

提防“粘贴垃圾 (Paste Garbage)”: 如果您在终端中看到 ^[[200~ 出现,那是“括号粘贴模式”出错的迹象。它经常发生在从浏览器复制到终端时。只需退格并在运行命令之前删除这些多余的字符即可。

启动隧道客户端:

docker run -d --name frpc --restart=always \
  --network host \
  -v ~/frp/frpc.toml:/etc/frp/frpc.toml \
  snowdreamtech/frpc

物理隧道现已建立。您的家用树莓派现在对您的云 VPS 是“可见”的。

第 4 阶段:配置 VLESS-Reality 斗篷

在您的本地网络上打开浏览器并转到 http://YOUR_PI_LOCAL_IP:2053。使用 admin / admin 登录。

  1. 转到 Inbounds (入站) -> Add Inbound (添加入站)。
  2. 将 Protocol (协议) 设置为 vless,Port (端口) 设置为 8443。
  3. 将 Flow (流控) 设置为 xtls-rprx-vision。
  4. 将 Security (安全) 设置为 reality。
  5. 将 uTLS 设置为 chrome,将 Dest/Server Names 设置为 www.icloud.com:443。(这使我们的隧道看起来与 Apple 云同步流量完全相同)。
  6. 单击 Get New Keys (获取新密钥) 和 Generate (生成)(用于 ShortIds)。
  7. 保存它。

点击新规则旁边的二维码图标,然后点击 Copy Link (复制链接)。您将获得一个以 vless://... 开头的混乱字符串。

第 5 阶段:客户端设置 (iPhone 和 Mac 的 Shadowrocket)

现在隧道正在从您的树莓派运行到 VPS,我们需要连接您的手机。

5.1 导出节点

  1. 访问您的 3X-UI 面板。
  2. 单击 VLESS 入站上的三个点(菜单)。
  3. 选择 "Export All URLs" (导出所有 URL)。这会将 vless:// 链接复制到剪贴板。

5.2 导入到 Shadowrocket (小火箭)

  1. 在您的 iPhone 上打开 Shadowrocket。
  2. 它应该会自动检测剪贴板中的链接并询问是否添加它。单击 Add (添加)。
  3. 如果未出现弹出窗口,请单击 + 图标,将 Type (类型) 设置为 URI,然后粘贴链接。

5.3 网桥配置

这是最关键的一步。默认情况下,节点指向您的树莓派的本地 IP。我们需要将其重定向到我们的云网桥。

  1. 点击新节点旁边的 (i) 图标。
  2. Address (地址):删除本地 IP 并输入您的 SaltyFish VPS Public IP (公网 IP)。
  3. Port (端口):将其更改为 443。
  4. Type (类型):确保它显示为 VLESS。
  5. 点击 Save (保存)。

5.4 点火测试

为了从外部世界证明架构有效:

  1. 关闭 Wi-Fi。确保您使用的是蜂窝数据 (5G/LTE)。
  2. 在 Shadowrocket 中,选择您的节点(将出现一个小橙色圆点)。
  3. 将主开关切换为 Connected (已连接)。
  4. 访问 google.com。如果加载,您已成功从公共互联网建立到家庭网络的隧道。

第 6 阶段:macOS 开发者设置

对于开发人员来说,仅仅拥有浏览器代理是不够的。我们需要整个工作站都遵守隧道规则。

6.1 安装

如果您有 Apple Silicon Mac (M1/M2/M3),您可以直接从 Mac App Store 安装 macOS 版本的 Shadowrocket。它比使用第三方包装器有效得多。

6.2 终端代理

macOS 终端应用(Git、npm、curl)通常会忽略系统 VPN 设置。我们需要手动“连线”它们。

  1. 检查本地端口:在 Shadowrocket Mac 中,转到 Settings (设置) -> Proxy (代理)。注意 HTTP/SOCKS5 端口(通常是 1082)。

  2. 立即代理:在您的终端中运行此命令以代理当前会话:

export http_proxy=http://127.0.0.1:1082
export https_proxy=http://127.0.0.1:1082

测试它:curl -I https://www.google.com。如果您看到 HTTP/2 200,它就工作正常。

  • 持久别名:将这些添加到您的 ~/.zshrc 以获得优雅的工作流:

  • # 开启代理
    alias proxy="export http_proxy=http://127.0.0.1:1082; export https_proxy=http://127.0.0.1:1082; echo 'Terminal Proxy ON'"
    # 关闭代理
    alias unproxy="unset http_proxy https_proxy; echo 'Terminal Proxy OFF'"
    

    运行 source ~/.zshrc。现在你只需输入 proxy 即可隐身。


    第 7 阶段:Git SSH 代理

    这是大多数开发人员陷入的“陷阱”。如果您对 GitHub 使用 SSH 密钥(git clone git@github.com...),它会完全忽略 http_proxy,因为它使用 SSH 协议。

    要解决此问题,我们必须将 SSH 客户端本身配置为使用我们的本地隧道。

    1. 编辑您的 SSH 配置:nano ~/.ssh/config。
    2. 在顶部添加此块:
    Host github.com
        HostName github.com
        User git
        # 强制将 GitHub SSH 流量通过 Shadowrocket 的 SOCKS5 端口传输
        ProxyCommand nc -X 5 -x 127.0.0.1:1082 %h %p
    
  • 保存并退出。现在,无论您身在何处,您的 git push 命令都将在您的私人隧道中飞驰。
  • 结论

    您不再任由公共 Wi-Fi 或商业 VPN 拦截摆布。您拥有一条企业级私有路由通道,将您的远程工作站直接连接到您的大本营。

    保持安全。保持快速。编码愉快。