SECURITY ARCHITECTURE / MACOS / CLAUDE
IMPLEMENTATION GUIDE · 部署与验收技术文档

Claude 专用网络隔离
与 Fail-Closed 出站控制方案

Mac mini M6 + UTM Ubuntu ARM64 + Host Only + 固定搬瓦工 HTTP 网关 + 虚拟机 / 宿主机双层出站限制。让 Claude Desktop、Claude Code CLI、MCP 和工具子进程处于同一个受控网络边界,其他 macOS 应用继续按需国内直连。

Mac mini M6UTM · Ubuntu ARM64Host OnlyMihomo 专用 HTTP 入口BWH 美国 VPSDefault Deny
版本 1.0编制日期 2026-10-25部署类型 单机安全隔离状态 设计 / 待环境验证
受保护对象
Claude 整个工作负载
Desktop、Code/CLI、MCP、Node、Python、Git 及其子进程
允许网络路径
仅 VM → 网关 → VPS
HTTP CONNECT 经固定出口,其他直连默认拒绝
宿主机网络
保留国内直连
微信、飞书、UU 等应用不受虚拟机隔离策略直接约束
01

目标与安全边界

明确保护对象、允许路径及“不保证”的事项

验收目标:Claude 所在虚拟机不具备独立的公网出口。需要联网时,只能访问 macOS 宿主机的专用代理入口,由该入口固定转发到搬瓦工美国 VPS;若代理不可用,业务请求必须失败,不能回退到国内公网出口。

对象 / 行为预期策略结果
Claude Desktop / Claude Code CLI运行在 Ubuntu 虚拟机,通过固定 HTTP 代理联网允许代理
MCP Server / Node / Python / Git统一处于同一 VM 的网络约束下;支持 HTTP 代理的程序可联网允许代理
任何程序直接访问公网 IP / 域名Host Only 无公网出口 + VM 出站默认拒绝必须阻断
UDP STUN / QUIC / 原生 IPv6 直连不允许从 VM 直接连向公网必须阻断
macOS 微信 / 飞书 / UU留在宿主机,按原本网络配置通信可国内直连
网关 / VPS 不可用Claude 联网失败,而非 DIRECT 回退Fail-Closed
安全边界:本方案约束的是 网络直连路径,不是证明 Claude 永远无法“知道”国内公网 IP。如果将宿主机网络信息、含 IP 的日志、SSH 能力或有网络权限的宿主机自动化工具暴露给 Claude,它仍可能通过获准的代理连接传送这些信息。具有 VM root 权限或宿主机管理权限的恶意程序也不在本方案的完整威胁模型内。
02

完整网络架构

基于 UTM Host Only 的网络边界,而非按进程名称追踪

第一道:UTM 网络隔离Host Only 模式不给客户机互联网访问能力。它与 Host Only 里可访问的宿主机服务是两个独立概念。
第二道:VM 出站防火墙只放行到宿主机代理端口的 TCP,拒绝其他公网 TCP/UDP、IPv6 与对宿主机其他服务的访问。
第三道:宿主机入口限制仅在 Host Only 接口监听代理服务,可选增加认证并用 PF 规则限制 VM 来源 IP。
第四道:固定代理出口Mihomo listener 绑定到具体搬瓦工节点,而非可能包含 DIRECT 的故障转移代理组。
03

前置条件与配置参数

先完成地址识别,再使用后续配置片段

项目要求 / 建议说明
macOS 宿主机Mac mini M6;有本地管理权限具体 macOS 与 UTM 版本须实际确认
虚拟化UTM + Ubuntu Desktop ARM64选虚拟化,不要误选 x86 仿真
网络Host Only;仅一张虚拟网卡禁止额外 NAT / Shared / Bridged 网卡
内存与磁盘VM 6–8GB RAM、60GB 磁盘起属于建议预算;视宿主机总内存和实际工作负载调整
已有节点美国搬瓦工节点可被 Mihomo 连接必须确认节点具体名称及支持的代理协议
远程管理UU 保持运行在 macOS 宿主机不要在远程会话中随意修改宿主机全局 PF
部署参数填写区

修改后,下方可复制配置片段中的占位符会在本页面自动替换。默认值仅作示例,不代表你的实际 IP。

注意:本 HTML 离线运行,不会上传填写的数据。密码输入仍会明文显示在本地页面及复制的代码中;实际部署建议使用密码管理器,切勿保存含真实凭据的公开副本。对包含 @、:、/ 等字符的密码,代理 URL 需要先做百分号编码。

若使用 UTM QEMU 网络后端,Host Only 也可以通过配置页查看客户机网络、宿主机网关和 DHCP 范围。Host Only IP 不保证永远是 192.168.64.1。在 Mac 上可以用 ifconfig 查看虚拟接口,在 Ubuntu 中用 ip -br addr 和 ip route 核对地址;请勿依赖文档里的示例 IP 直接部署。

04

部署实施步骤

按阶段完成,避免一次修改多个网络层导致难以定位故障

01安装 UTM 与 Ubuntu ARM64
  1. 从 UTM 官网 安装;从 Ubuntu 官方获取 ARM64 Desktop 镜像。
  2. 创建虚拟机时选择 ARM64 Linux 的虚拟化路径;先配置 4 vCPU、6–8GB RAM、60GB 虚拟磁盘。
  3. 安装软件期间可临时用 Shared Network 完成系统更新;正式切换前记录安装状态并制作 VM 快照。
  4. 安装后关闭 VM,删除临时 NAT/Shared/Bridged 网卡,仅保留一张 Host Only 网卡。
如果你采用 UTM 的 Apple Virtualization 后端,Host Only 选项可能依赖 macOS / UTM 版本;如果使用 QEMU 后端,请确认 Host Only 而不是 Emulated VLAN 或 Shared Network。不同后端界面名称可能不同。
02验证 Host Only 的基础隔离

完成切换后,在 Ubuntu 终端运行以下命令。这一步应该在配置任何代理前完成。

Ubuntu · 只读检查
ip -br addr
ip route
ip -6 route

# 没有配置代理时,以下外网请求应失败
curl --noproxy '*' -4 --connect-timeout 5 --max-time 8 https://api.ipify.org
curl --noproxy '*' -6 --connect-timeout 5 --max-time 8 https://api64.ipify.org

Host Only 仍允许访问宿主机指定服务,这不是公网直连泄露。若 curl --noproxy '*' 在此阶段成功获取了公网 IP,则必须停下排查是否还有第二张网卡、宿主机 IP 转发、透明代理或意外路由。

03在 macOS 宿主机建立 Mihomo 专用 HTTP 入口

使用现有节点配置创建一个单独的 HTTP listener,并通过 proxy 字段绑定确定的搬瓦工节点。推荐使用独立 Mihomo 实例,避免 Clash Verge Rev 的 GUI 合并配置覆盖该入口。

Mihomo · listener 配置片段(并入已有有效配置)
listeners:
  - name: claude-vm-http
    type: http
    listen: "{{HOST_ONLY_IP}}"
    port: {{PROXY_PORT}}
    proxy: "{{BWH_NODE}}"
    users:
      - username: "{{PROXY_USER}}"
        password: "{{PROXY_PASSWORD}}"

规则要求:{{BWH_NODE}} 必须对应配置中实际存在、固定出口的节点,不应指向会选择 DIRECT 的策略组。入口只监听 Host Only IP,不监听 0.0.0.0 或物理 LAN IP;即使设置了账号密码,也不能公开暴露这个未加 TLS 的 HTTP 代理。

HTTP 代理适用于基于 TCP/HTTPS CONNECT 的应用;它本身不是透明 TUN,也不直接承载任意 UDP/STUN。对于不能走 HTTP 代理的 UDP、QUIC 或原始套接字连接,本方案设计为拒绝连接,而不是给它们分配一条直连路径。
04在 Ubuntu 配置受控代理

先验证 HTTP 网关确实可达。下例使用 curl 的 --proxy-user 避免直接将密码拼到 URL 中;交互式验证时建议临时输入密码,不要把生产凭据写入终端历史或公开文档。

Ubuntu · 通过专用代理验证
# 根据提示输入代理密码(输入过程不回显)
read -rs -p 'Proxy password: ' PWD; echo
curl -v --max-time 15 \
  --proxy "http://{{HOST_ONLY_IP}}:{{PROXY_PORT}}" \
  --proxy-user "{{PROXY_USER}}:$PWD" \
  https://api.ipify.org
unset PWD

验收是获得搬瓦工美国出口 IP;而非仅仅返回某个美国 IP。之后再配置 Ubuntu 的系统代理、Claude Desktop 所需的代理环境,以及 Claude Code 的 HTTP_PROXY / HTTPS_PROXY。GUI 应用不保证自动继承 shell 变量,需要单独测试。

Ubuntu · 代理变量参考(密码需进行 URL 编码)
# 例:在受控会话中设置,避免提交到代码仓库
export HTTP_PROXY='http://{{PROXY_USER}}:ENCODED_PASSWORD@{{HOST_ONLY_IP}}:{{PROXY_PORT}}'
export HTTPS_PROXY="$HTTP_PROXY"
export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"

# 需要联网的 git / curl / Node 工具应分别确认代理变量是否生效
# GUI Claude Desktop 必须另行验证 Linux 桌面代理或应用启动环境。

提示:如果 Claude Desktop 当前版本、登录组件或 MCP 不遵守显式 HTTP 代理,它会因网络隔离而无法联网。应修正应用代理配置;不要为了“能连上”而切回 Shared Network。

05安装 Claude Desktop、Claude Code 与 MCP

Claude Desktop 已有官方 Linux beta(支持 Ubuntu/Debian ARM64);可使用 Anthropic 官方 apt 仓库安装。Linux 版本暂不支持 Computer Use;相关功能需要以官方当前说明为准。

Ubuntu · Claude Desktop 官方 apt 安装命令
sudo curl -fsSLo \
  /usr/share/keyrings/claude-desktop-archive-keyring.asc \
  https://downloads.claude.ai/claude-desktop/key.asc

echo "deb [signed-by=/usr/share/keyrings/claude-desktop-archive-keyring.asc] https://downloads.claude.ai/claude-desktop/apt/stable stable main" | \
  sudo tee /etc/apt/sources.list.d/claude-desktop.list

sudo apt update
sudo apt install claude-desktop

这些命令需要预先为 apt 配置代理,或在安装阶段临时联网。Claude Code 使用 Anthropic 当前官方安装方式;MCP Server、Node、Python 等也必须全部安装并运行在 Ubuntu VM 内。不要把宿主机的 Claude.app 或其 MCP 可执行路径挂进 VM,当作“已被隔离”的进程使用。

05

双层出站限制与最小权限

由网络边界强制约束,而不是假设每个应用都愿意遵守代理设置

AUbuntu VM:UFW 默认拒绝出站

以下命令属于策略模板,仅适用于已经确认 Host Only 地址、网络稳定和代理可用的 VM。启用之后 DNS、apt、时间同步等直连服务会被阻断,需通过代理或最小例外处理。若 VM 使用动态地址,续租 DHCP 的规则必须另行核实;生产环境可考虑固定客户机地址。

Ubuntu · UFW 出站收紧示例(请先核对 IP)
# 在 Ubuntu VM 内执行,先确保能从 UTM 控制台直接登录
sudo ufw default deny incoming
sudo ufw default deny outgoing

# 只允许连接宿主机 Host Only 的专用 HTTP 代理端口
sudo ufw allow out to {{HOST_ONLY_IP}} port {{PROXY_PORT}} proto tcp

# 验证 IPv6 也纳入规则管理:查看 /etc/default/ufw 中 IPV6=yes
sudo ufw status verbose

# 检查无误后再启用;如依赖 DHCP,请先处理租约问题
sudo ufw enable
sudo ufw status numbered
请勿把 sudo ufw allow out 53 当成必选设置。为直接 DNS 放行公网 53 端口会削弱隔离边界。对于 HTTP CONNECT,目标域名通常由代理端处理;若某个组件必须本地解析,应单独评估是否确有必要。

VM 防火墙只保护运行时普通进程。应当用普通用户运行 Claude,避免授予无条件 sudo、root 密钥或修改网络设置的工具权限。具有 VM root 权限的程序可能修改自己的防火墙,但即便如此,Host Only 的“无原生公网出口”仍应继续成立,除非宿主机另行提供网关/隧道。

BmacOS 宿主机:只暴露指定网关服务

将专用 Mihomo listener 绑定到真实的 Host Only 接口地址,而非 0.0.0.0。宿主机 PF / Network Extension 防火墙可再限制来源仅为 VM IP、目标仅为代理端口,并拒绝该 VM 对宿主机其他服务的访问。因 UTM 后端与系统规则顺序不同,PF 规则需现场核对后编写,本文不提供可盲目执行的全局 PF 配置。

macOS · 只读检查
# 检查 UTM 虚拟网卡及宿主机地址
ifconfig

# 检查专用代理端口监听位置(默认 18888 可替换)
lsof -nP -iTCP:18888 -sTCP:LISTEN

# 查看当前 PF 状态与规则,不会修改系统
sudo pfctl -s info
sudo pfctl -sr
sudo pfctl -a '*' -sr

必须明确禁止:在宿主机为 Host Only 网络开启 IP forwarding/NAT,或者另行配置透明代理、共享互联网、SSH 动态转发等让 VM 获得未受控网络出口。不要向 Claude VM 暴露宿主机 shell、Docker socket、宿主机网络管理服务,避免被当作代理跳板。

C代理网关:失败不能回退 DIRECT

专用 listener 的 proxy 绑定具体搬瓦工节点;不要绑定包含 DIRECT 的代理组。代理服务停止、认证失败、远端节点不可用时,该请求应该连接失败。宿主机可以继续供 UU 和其他应用国内直连,因为 Claude VM 不拥有通往物理网络的独立路径。

06

测试与验收矩阵

同时验证正常链路、直接绕过、IPv6、UDP 与故障状态

编号 / 测试操作合格判定
T01 — 出口 IPcurl 通过 HTTP 代理访问 ipify与搬瓦工出口 IP 一致
T02 — 强制无代理 TCPcurl --noproxy '*' 直连外网失败 / 超时,不能返回任何公网出口
T03 — 原生 IPv6强制 IPv6 无代理测试无 IPv6 公网直连路径
T04 — UDP STUN向公用 STUN 服务器发送 UDP Binding Request无法直连,不返回运营商公网 IP
T05 — 直接访问宿主机访问宿主机的非白名单 TCP/UDP 端口被 VM 或宿主机防火墙阻断
T06 — 代理中止关闭专用 listener,保留 VM 运行Claude 网络请求失败,无其他出口
T07 — VPS 故障使固定搬瓦工节点不可用连接失败,不能回退 DIRECT
T08 — 进程覆盖从 Claude Code 执行 curl / Python / Node 请求代理可用则经 VPS;直接请求失败
T09 — 其他 macOS 应用测试 UU / 飞书 / 国内网站按宿主机原有网络正常工作
T10 — 配置持久化重启 VM、代理及宿主机后复测规则仍生效,无新公网直连路径
Ubuntu · 核心可重复测试
# 直连 IPv4:应失败
curl --noproxy '*' -4 --connect-timeout 4 --max-time 7 https://api.ipify.org

# 直连 IPv6:应失败
curl --noproxy '*' -6 --connect-timeout 4 --max-time 7 https://api64.ipify.org

# 代理访问:应返回搬瓦工出口 IP(使用交互方式填写密码)
read -rs -p 'Proxy password: ' PWD; echo
curl --max-time 15 --proxy 'http://{{HOST_ONLY_IP}}:{{PROXY_PORT}}' \
 --proxy-user '{{PROXY_USER}}:'"$PWD" https://api.ipify.org
unset PWD

# 审核 VM 防火墙、路由、监听
sudo ufw status verbose
ip route
ip -6 route
ss -tunap

进阶验证:在 macOS 物理网卡执行 sudo tcpdump -ni <物理网卡> 'ip or ip6',仅用于观察实际对外通信是否为代理节点连接。还应在 VM 内抓包验证目标 UDP/STUN 请求是否离开虚拟机。物理网卡本身会有 UU 和其他 Mac 应用的直连流量,因此看到国内直连不代表它来自 Claude,要结合测试时间、目的地址、VM 出站和代理日志判断。

判断 Fail-Closed 的最有力证据,是“有意绕过 HTTP 代理后无法联网”与“代理服务不可用后仍无法通过其他路径联网”同时成立,而不是浏览器 WebRTC 页面只显示某个美国 IP。
07

风险、限制及回滚

避免为了修复访问问题重新打开旁路网络

风险触发条件正确处理
Linux Desktop 功能差异需要 macOS Computer Use、原生桌面功能评估是否改用 macOS VM;不要把宿主机 Claude 当成已隔离
GUI 不继承代理变量Desktop 登录失败、部分组件离线明确配置 GUI 代理 / 启动环境并验证;仍需禁止直连
apt 更新失败默认拒绝 DNS / 出站配置 apt 走专用 HTTP 代理,不要临时全放行
UDP 服务无法使用应用依赖 QUIC / STUN / UDP需要时单独设计受控 UDP 隧道;不能用 DIRECT 兜底
Host Only 地址变更升级 UTM、重建网络、换后端更新 listener、UFW 与测试脚本地址
宿主机代理被其他应用访问绑定全网卡或未设入站访问限制绑定 Host Only、认证、加宿主机入口防火墙
宿主机侧命令执行共享宿主机 shell / SSH / Docker socket取消不必要宿主机执行权限;仅共享必要文件
IP 信息可被读取用户提供日志 / 文件,或开放宿主机管理权限额外做数据权限控制;网络隔离本身不能消除这类信息
不要把“Mac 宿主机上有国内直连”与“Claude 可以国内直连”混淆。方案允许前者、要阻断后者。相反,如果你把宿主机网络管理、SSH 或高权限执行工具开放给 Claude,防直连主张将需要重新评估。

安全回滚顺序:(1)在宿主机停止专用 listener;(2)在 VM 中关闭 Claude 与 MCP;(3)通过 UTM 虚拟机控制台检查/回滚 UFW,必要时恢复之前的 VM 快照;(4)仅由管理员在本地验证需要的依赖服务。正式运行期间不要为了恢复联网而临时切换到 Shared Network。宿主机 UU 远程不应依赖 Ubuntu VM。

长期维护:每次 UTM / macOS / Mihomo / Claude Desktop 升级、虚拟网络重建、代理节点切换或系统恢复后,至少重新执行 T01、T02、T03、T04、T06 和 T10。

08

交付检查清单

勾选状态仅保存在当前浏览器本地,不代表已自动检测你的设备

实施 / 验收记录0 / 12 完成
09

官方参考资料

优先参考软件项目及厂商文档,具体设置随版本变化