# 深入 macOS 应用

Mac 上的 URnetwork 与 iPhone 和 iPad 应用出自同一个 Xcode 项目：一套代码库、一个引擎、两种窗口形态。你像用 VPN 一样用它（连接后，你的流量看起来来自别处），但它从其他成员共享的真实家庭连接出网，而不是数据中心。这篇导览完整覆盖 Mac 特有的部分，共享功能则讲到够用的深度；行为与 iOS 完全一致的地方，[iOS 导览](/docs/tour-ios)有详尽版本。安装和首次连接见 [macOS 入门](/docs/getting-started-macos)；成员运行的出口改变了什么，见[概览](/docs/overview)。

## 应用的构造

两个进程，和 Apple 平台上每个正经 VPN 一样：

- **应用**（bundle `network.ur`）是窗口和菜单栏组件。
- **隧道扩展**（`network.ur.extension`）是一个由 macOS 启动和监护的 `NEPacketTunnelProvider` 网络扩展。你的流量走的是这个进程，这意味着你的保护从不取决于窗口是否开着。

应用通过本地设备 RPC（两个进程之间的私有控制通道）与隧道对话，所以它能挂接到一条已经在运行的隧道上。会话中途退出再打开应用，或者应用崩溃，它都会接管仍在运行的隧道而不是重启它。这也是 macOS 在首次连接时要你批准 VPN 配置的原因：扩展是一个由系统管理的组件，操作系统要求你的同意。

应用要求 macOS 13.5 或更新版本，一切都在 [github.com/urnetwork](https://github.com/urnetwork) 开源，所以"数据路径不记录任何东西"这样的说法可以对着代码核对，而不必凭信任接受。尚无独立审计覆盖协议或运营方的服务器代码，而隐私承诺正落在那里。2025 年的两项第三方评估覆盖其他层面：对 Web 应用和 API 的渗透测试，以及 Leviathan Security Group 对 Android 应用的 MASA AL2 评估，结果通过。两者都不覆盖 Mac 应用。[威胁模型](/docs/threat-model)记录了这两项评估及其局限。

## 窗口：带四个区的侧边栏

主窗口是一个分栏视图。侧边栏与 iOS 的标签页相同，四个区（**连接**（Connect）、**账户**（Account）、**排行榜**（Leaderboard）、**支持**（Support）），选中的区填满窗口其余部分。

### 连接

大地球就是连接按钮。它下方的状态行写着**已连接 N 个提供者**（Connected to N providers），点那一行会打开**提供者位置**（Provider Locations）：一个可旋转的地球，下面列出此刻真正承载你的提供者。会同时有好几个，通常三到八个。你的客户端并排运行两组（服务 HTTPS 的质量组和服务其余流量的速度组），并把每个站点固定到一个提供者上，所以画面是有意复数的，而任何单个站点看到的仍是一个稳定地址。慢掉或消失的提供者会被自动替换；有一个中途下线，代价至多是那个站点挪到你集合里另一个提供者时的短暂停顿；如果整个会话都拖沓，重连即可抽取一组新的。[概览](/docs/overview)讲解每条连接走的路径、为什么止步于四段，以及沿途各方能看到什么、不能看到什么。

地球下方是详情抽屉：你选定的位置、**连接选项**（Connect options）（连接模式、固定 IP、强匿名化、后量子加密）、能点开客户端合同的远程/已拦截/本地（Remote / Blocked / Local）统计卡片、分流规则和 DNS 面板，以及**拦截广告与跟踪器**（Block ads and trackers）开关。共享连接不在这里。它在账户 → 设置里。

| 设置 | 默认 | 效果 | 主要代价 |
|---|---|---|---|
| 连接模式（Connection mode） | 自动（Auto） | 自动同时运行两组提供者，把每个数据包路由到合适的那组 | 网页（Web）或流媒体（Streaming）则押注单一组 |
| 固定 IP（Fixed IP） | 关 | 把窗口收窄到一个提供者，每个站点都看到同一个稳定地址 | 放弃复数出口 |
| 强匿名化（Strong Anonymization） | 开 | 禁止客户端到提供者的直连路径，提供者永远见不到你的真实 IP | 比直连路径慢 |
| 后量子加密（Post Quantum Encryption） | 开 | 把会话端到端密封到提供者，运营方承载的是密文 | 跳过无法密封的提供者 |
| 拦截广告与跟踪器（Block ads and trackers） | 关 | 从隧道承载的一切里滤掉广告和跟踪器 | 过滤是全隧道的，不能按应用 |

- 关掉强匿名化就是直连模式：更快，而那个提供者随即看到你的真实地址。
- 密封不会回退。只要后量子加密开着，客户端就不会以明文收发应用数据：无法与之建立密封会话的提供者会被跳过，而不是在未密封的状态下被使用。代价落在可用性上，不是机密性——你失去的是那个提供者，不是你的加密。当前所有提供者构建都启用响应方一侧，所以这种情况少见。把这个设置关掉，流量才又可以走标准路径。还没有应用显示逐连接的"是否密封"结论。

提供者是另一位成员的真实连接；平台是居中的运营方，为你和他们牵线。提供者看得到它承载的流量去哪里，也就是你的 ISP 今天看你的视角，但看不到里面是什么，因为几乎每个站点都用 HTTPS 密封自己的内容。默认情况下它永远不知道你的真实 IP，那留在平台手里。而平台自己几乎什么都不留：你的地址以带密钥的单向哈希形式保存（用一把保密密钥搅乱、不可逆转），哈希对象是它所在的地址块而不是地址本身；传输账本记录客户端 id 之间的字节数，从不记录你访问的站点。地理查询确实会给每次连接记下一个粗略城市，所以粗粒度的"在哪"是已知的；"在做什么"永远不是。两个默认都开着时，提供者永远不知道你是谁，运营方读不了你发送的内容，所以没有任何单独一方同时握有你的身份和你的活动。

| 模式 | 运营方看到 | 提供者看到 | 默认与可用性 |
|---|---|---|---|
| **中继密封** | 你的账户和来源连接、你在用哪些提供者，以及密文及其时序和数据量 | 它出网的目的地和一个设备/合同 id，**不含**你的真实 IP | 出厂默认：后量子加密，在连接抽屉里开启 |
| **中继标准** | 你的账户和来源连接、你在用哪些提供者，以及里面的目的地和数据包字节 | 它出网的目的地和一个设备/合同 id，**不含**你的真实 IP | 仅在**后量子加密**关掉时 |
| **直连** | 更少的中继参与 | **你的真实 IP**及它出网的目的地 | 自行选择开启：关掉**强匿名化** |

局限：没有任何机制验证分配给你的提供者彼此独立、且独立于运营方，运营方自己也可以运行提供者。[威胁模型](/docs/threat-model)把这几行逐一对照具名的对手推演，包括恶意的运营方，并明说每一行在哪里失守。

点位置卡片，提供者列表打开。在 Mac 上它作为面板从连接视图旁滑入，而不是一张浮层，工具栏的**显示提供者列表**（Show Provider List）按钮也能切换它。浏览时列出的是国家，每个国家带着在线提供者的实时数量；在**搜索提供者**（Search providers）里输入地名，结果里会出现**城市**（Cities）一节。城市级定位是搜出来的，不是滚出来的。每个位置都是一台真实在场的成员设备：平台对它观察到的连接做地理定位，看起来像数据中心或 VPN 的地址会被降级而不是被信任。"最佳可用"为你附近的速度做优化；指定位置让你出现在那里。

### 账户

身份和套餐住在这里：

- **套餐。** 免费档是一份真实的每日流量额度；UR Pro 是大额月度额度，每月 $5 或每年 $40。当前数字在 [ur.io/products](https://ur.io/products)。
- **你的共享活动。** 共享的设置所在，你的连接承载过什么逐项列出。设置里以"使用 UR 协议"（Uses the UR Protocol）链接它；[ur.xyz](https://ur.xyz) 记录了参与的奖励如何运作。
- **余额码。** 一次性流量充值：一张流量礼品卡，不带订阅。
- **屏蔽的位置（Blocked locations）。** 你永远不想从那里出网的国家。
- **提供者身份。** 你的客户端当前与之保持已验证密封会话的提供者。
- **后量子身份面板。** 见下文。
- **设置。** 共享连接、断网保护、屏蔽的位置、随登录启动、你的恢复短语和登录方式、账户删除都住在这里。

设置里的开关一览：

| 设置 | 默认 | 效果 | 主要代价 |
|---|---|---|---|
| 共享连接（Provide mode） | 永不 | 把 Mac 的闲置带宽共享给公众，或只共享给你自己的设备 | 承载的每个字节都计入 ISP 流量上限 |
| 断网保护（Kill switch） | 关 | 拒绝本地回落，没有提供者可达时流量停住而不是泄漏 | 提供者全失联时没有流量 |
| 系统启动时启动 URnetwork（Launch URnetwork on system startup） | 关 | 经 macOS 自己的登录项服务在登录时启动应用 | 在系统设置 → 登录项里多一个条目 |

不用邮箱开始在这里是一等路径。登录屏幕上的**创建即时账户**（Create Instant Account）一次点击就做出一个真实、永久的网络，由平台生成、创建后立即展示一次的恢复短语保护。保存它：它是唯一的回程票，运营方只保留它的哈希形式，保存好了账户就比这台 Mac 活得久。之后可以在账户里给同一个网络添加任何其他登录方式（Apple、Google、邮箱或手机号、Solana、Bittensor），保留余额和历史。邮箱或手机号只是你的登录和找回路径，别无其他；恢复短语和钱包路径，加上链上 USDC 支付，可以让一个账户完全不带邮箱、姓名或卡。在任何已登录设备上生成一个**授权码**（auth code），是把你的 Mac 接入现有账户最快的方式。

### 排行榜

按传输数据量排名的顶级提供者，绝不涉及任何人的浏览。用你的 Mac 共享连接就可以出现在这里，以网络名公开，或者匿名。不共享，就根本不在榜上。

### 支持

套餐、帮助、反馈和社区链接，还能给报告附上客户端日志：出问题时的正常路径。应用之外，feedback.ur.io 在任何浏览器都能用；安全发现按 ur.io/vdp 的披露政策发往 security@ur.io。

## 菜单栏组件

URnetwork 也住在菜单栏里，这是日常使用应用最快的方式：

- **状态一览。** 已连接和共享中，各有一个对勾或叉。
- **连接/断开。** 一次点击，不需要窗口。
- **显示（Show）。** 把主窗口叫回来。
- **退出 URnetwork（Quit URnetwork）。** 先断开再退出。

关掉窗口，应用继续在菜单栏运行；隧道无论如何都继续运行，因为它是一个独立的、由系统管理的进程。⌘Q 也故意不是退出：它隐藏窗口，把应用从 Dock 收进菜单栏。这里的**退出 URnetwork**才是真正的退出，它会连隧道一起带走。

## 与 iOS 共享：深层功能

这些功能与 iOS 应用完全一致；[iOS 导览](/docs/tour-ios)对每一项都有详尽讲解。

### 自定义 DNS

连接区之下是一整套 DNS 面板。DNS 是互联网的电话簿（它把 netflix.com 这样的名字变成你的 Mac 要连的地址），也是本地和区域防火墙窥探与拦截的经典场所。这个面板你可以完全不碰：默认的、经隧道解析的加密 DNS over HTTPS 已经是最安全的设置。在此基础上你可以任意组合切换 **DoH（远程/本地）**和**不加密 DNS（远程/本地）**，自己编辑解析器清单，还可以使用**本地 DNS 回退**（local DNS fallback），它在隧道启动期间并发使用一个本地解析器，握手时查询不至于卡住（关掉则 DNS 只经隧道解析）。屏幕提供按国家的推荐设置，因为一些国家的网络对查询的干扰足以弄坏最严格的配置，可一键应用、一键恢复到安全默认，另有以你所连国家颜色标出的建议服务器。

### 分流规则

在域名和 IP 层面把特定流量路由到隧道之外，或把它固定住。点实时流量让它走本地，这是办公室内网、打印机或 NAS 消失在隧道后面时的修法。或者把一个站点按在单个提供者上换一个稳定地址，能让银行这类对地址敏感的站点安静下来；那个提供者随即看得到你对那一个站点的访问，但仍然没有你的身份和内容。规则捕获整个协同关联的网络簇，所以 CDN 和子域流量一起挪动。和 iOS 一样，**这里没有按应用拆分隧道**。Android 和 Windows 有，但 Apple 平台不给 VPN 应用受支持的按应用钩子，所以 Mac 上的规则是网络级的。

### 共享连接

共享 Mac 的闲置带宽（上行良好的台式机正是网络想要的设备）在账户 → 设置 → 连接里设置，**共享连接**（Provide mode）是四选一而不是开关：

| 模式 | 它承载什么 |
|---|---|
| **永不（Never）** | 什么都不承载。默认：你纯粹是用户 |
| **自动（Auto）** | 你连接时承载公共流量；不连接时只服务你自己的设备 |
| **始终（Always）** | 公共流量，无论你连没连接 |
| **网络（Network）** | 永远只服务你自己的设备 |

公共流量在签名合同下计量（在客户端身份之间数字节的密码学协议，用量就是这样在不记录目的地的前提下结算的），提供者参与 UR protocol；[ur.xyz](https://ur.xyz) 记录了这种参与的奖励如何运作。

安全是在你自己机器上做出来的。连接引擎的开源检查层在你的 Mac 上、在出口处运行，在文件共享（BitTorrent 类）和攻击模式流量离开你的连接之前把它们拦下。命中产生什么：数据包被丢弃，文件共享特征命中还会向运营方升起一个滥用标记，只携带发送设备的 id 和一个布尔值（没有目的地、没有域名、没有内容），而运营方今天没有处理它的代码。攻击模式和不透明隧道的丢弃则什么都不升起。同一个过滤器也是 URnetwork 对用户有意不做 BT 工具的原因。局限：没有任何共享出口设计能让风险恰好为零，这正是共享对象由你选择的原因；而且你承载的每个字节都计入 ISP 流量上限，所以在计量套餐上要有选择地共享，或者干脆不共享。

### 后量子身份面板

设置本身是**后量子加密**（Post Quantum Encryption），连接选项下连接抽屉里的一个开关，出厂即**开**：密封是全新安装的初始状态，不是一个要你去做的选择。账户区随后显示你客户端的后量子会话身份，带一个分享面板用于带外比对，与在聊天应用里比对安全码是同一个思路：在另一条通道上读出指纹，就能证明密封会话终止在你以为的地方。这个设置覆盖什么：你的客户端用一条以 **X25519MLKEM768**（经典 + ML-KEM 混合）协商的 TLS 1.3 会话把流量直接密封到提供者，居中的运营方承载着自己读不了的字节，而今天录下的流量按设计连未来的量子计算机也解不开（即"先收割、后解密"威胁）。它是失败即关闭的：只要这个设置开着，客户端就不会以明文收发应用数据，所以无法与之建立密封会话的提供者会被跳过，而不是在未密封的状态下被使用——你失去的是那个提供者，不是你的加密。当前所有提供者构建都启用响应方一侧，所以这种情况少见；把这个设置关掉，流量才又可以走标准的平台路径。还没有应用显示逐连接的"是否密封"结论。身份签名仍是 Ed25519，"后量子"指的就是这次会话密钥交换，不指更多。

## 疑难解答

### VPN 配置的批准

首次连接会触发一个请求允许 VPN 配置的系统对话框。如果被拒绝了，隧道就永远起不来。在下一次尝试时批准它，或去看**系统设置 → VPN**（网络下也能看到），URnetwork 的配置应该列在那里并已启用。

### 多个 VPN 配置描述文件，以及应用如何管理它们

反复重装和升级可能让 macOS 攒下不止一份 URnetwork 的 VPN 配置描述文件。应用预料到了这一点：连接时它枚举每一份配置，某一份启动失败就重置它并重试，然后转到下一份。如果已经有隧道在运行，它通过设备 RPC 接管而不是重启。坏掉的配置会被重置或移除，移除有上限，而且每次配置操作都有时限，卡死的系统守护进程拖不垮应用。这一切都是自动的，写在这里是为了让系统设置里的条目说得通。

### "Failed to load VPN profiles"（错误 12）

如果连接失败并提示 **"Failed to load VPN profiles"**（无法加载 VPN 配置描述文件，错误代码 12），说明系统的 VPN 偏好存储拒绝枚举配置，这个状态应用无法从内部修复。手动修复：

1. 打开系统设置，找到 VPN 配置（系统设置 → VPN，或你的 macOS 版本上相当于通用 → VPN 与设备管理的位置）。
2. 移除 URnetwork 的配置。
3. 从应用重新连接，并批准全新的配置。

移除配置删掉的是管线，不是数据：你的账户、设置和分流规则原封不动，下一次连接会重建它（再次显示那个一次性的批准对话框）。

### 随登录启动

**系统启动时启动 URnetwork**（Launch URnetwork on system startup）是账户 → 设置里系统一节下的开关。它把应用注册进 macOS 自己的登录项服务，所以在应用支持的每个版本上都能工作，条目会出现在系统设置 → 通用 → 登录项里，你也可以在那里手动移除。关掉开关就再次注销它。

### 断网保护在这里如何工作

和 iOS 上一样：应用在账户 → 设置 → 连接里带一个**断网保护**（Kill switch）开关，与每个 URnetwork 应用相同的 SDK 控制项。它出厂关闭，所以打开它是一个有意的动作。打开后，客户端拒绝回落到你的本地路由，流量停住而不是泄漏。Mac 没有多给的是系统级执行。应用没有设置 `includeAllNetworks`，所以如果隧道进程意外死掉，macOS 会恢复正常联网而不是闭合失败：你的应用会继续在底层网络上用你的真实 IP 工作，你多半只察觉到一个小顿挫。菜单栏的对勾/叉就是一眼可见的绊线。应用监护隧道并积极恢复配置，但它目前不要求操作系统在隧道断开时硬性阻断流量。如果你需要有保证的"失败即断网"，在 Mac 之外强制它（只放行隧道流量的路由器或防火墙规则），或者把浏览器里的关键工作交给 URnetwork 浏览器扩展，它的断网保护默认开启，只覆盖浏览器流量。

### 读取隧道的日志

隧道扩展写入统一系统日志：Console.app，不是文件。

1. 打开 **Console.app**，选中你的 Mac。
2. 在操作菜单里启用**包含信息级消息**（Include Info Messages）和**包含调试级消息**（Include Debug Messages）。有用的行都在这两级。
3. 按 `network.ur.extension` 子系统过滤，或搜索"URnetwork"，然后复现连接过程。

### 睡眠行为

隧道的配置是 `disconnectOnSleep` 关闭：合上盖子不会拆掉会话，所以你从中断处继续，而不是每次唤醒都重新握手。睡着的 Mac 不移动任何流量。它不在浏览，也不在共享；这个设置只是免去你重新握手。

## 接下来去哪里

- 短路径看 [macOS 入门](/docs/getting-started-macos)。
- 同样的功能的详尽形态，外加 Siri 快捷指令，看 [iOS 导览](/docs/tour-ios)。
- 网络如何端到端运作看[概览](/docs/overview)，快速答案看 [FAQ](/docs/faq)。
