深入 macOS 应用
Mac 上的 URnetwork 与 iPhone 和 iPad 应用出自同一个 Xcode 项目:一套代码库、一个引擎、两种窗口形态。你像用 VPN 一样用它(连接后,你的流量看起来来自别处),但它从其他成员共享的真实家庭连接出网,而不是数据中心。这篇导览完整覆盖 Mac 特有的部分,共享功能则讲到够用的深度;行为与 iOS 完全一致的地方,iOS 导览有详尽版本。安装和首次连接见 macOS 入门;成员运行的出口改变了什么,见概览。
应用的构造
两个进程,和 Apple 平台上每个正经 VPN 一样:
- 应用(bundle
network.ur)是窗口和菜单栏组件。 - 隧道扩展(
network.ur.extension)是一个由 macOS 启动和监护的NEPacketTunnelProvider网络扩展。你的流量走的是这个进程,这意味着你的保护从不取决于窗口是否开着。
应用通过本地设备 RPC(两个进程之间的私有控制通道)与隧道对话,所以它能挂接到一条已经在运行的隧道上。会话中途退出再打开应用,或者应用崩溃,它都会接管仍在运行的隧道而不是重启它。这也是 macOS 在首次连接时要你批准 VPN 配置的原因:扩展是一个由系统管理的组件,操作系统要求你的同意。
应用要求 macOS 13.5 或更新版本,一切都在 github.com/urnetwork 开源,所以"数据路径不记录任何东西"这样的说法可以对着代码核对,而不必凭信任接受。尚无独立审计覆盖协议或运营方的服务器代码,而隐私承诺正落在那里。2025 年的两项第三方评估覆盖其他层面:对 Web 应用和 API 的渗透测试,以及 Leviathan Security Group 对 Android 应用的 MASA AL2 评估,结果通过。两者都不覆盖 Mac 应用。威胁模型记录了这两项评估及其局限。
窗口:带四个区的侧边栏
主窗口是一个分栏视图。侧边栏与 iOS 的标签页相同,四个区(连接(Connect)、账户(Account)、排行榜(Leaderboard)、支持(Support)),选中的区填满窗口其余部分。
连接
大地球就是连接按钮。它下方的状态行写着已连接 N 个提供者(Connected to N providers),点那一行会打开提供者位置(Provider Locations):一个可旋转的地球,下面列出此刻真正承载你的提供者。会同时有好几个,通常三到八个。你的客户端并排运行两组(服务 HTTPS 的质量组和服务其余流量的速度组),并把每个站点固定到一个提供者上,所以画面是有意复数的,而任何单个站点看到的仍是一个稳定地址。慢掉或消失的提供者会被自动替换;有一个中途下线,代价至多是那个站点挪到你集合里另一个提供者时的短暂停顿;如果整个会话都拖沓,重连即可抽取一组新的。概览讲解每条连接走的路径、为什么止步于四段,以及沿途各方能看到什么、不能看到什么。
地球下方是详情抽屉:你选定的位置、连接选项(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及它出网的目的地 | 自行选择开启:关掉强匿名化 |
局限:没有任何机制验证分配给你的提供者彼此独立、且独立于运营方,运营方自己也可以运行提供者。威胁模型把这几行逐一对照具名的对手推演,包括恶意的运营方,并明说每一行在哪里失守。
点位置卡片,提供者列表打开。在 Mac 上它作为面板从连接视图旁滑入,而不是一张浮层,工具栏的显示提供者列表(Show Provider List)按钮也能切换它。浏览时列出的是国家,每个国家带着在线提供者的实时数量;在搜索提供者(Search providers)里输入地名,结果里会出现城市(Cities)一节。城市级定位是搜出来的,不是滚出来的。每个位置都是一台真实在场的成员设备:平台对它观察到的连接做地理定位,看起来像数据中心或 VPN 的地址会被降级而不是被信任。"最佳可用"为你附近的速度做优化;指定位置让你出现在那里。
账户
身份和套餐住在这里:
- 套餐。 免费档是一份真实的每日流量额度;UR Pro 是大额月度额度,每月 $5 或每年 $40。当前数字在 ur.io/products。
- 你的共享活动。 共享的设置所在,你的连接承载过什么逐项列出。设置里以"使用 UR 协议"(Uses the UR Protocol)链接它;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 的披露政策发往 [email protected]。
菜单栏组件
URnetwork 也住在菜单栏里,这是日常使用应用最快的方式:
- 状态一览。 已连接和共享中,各有一个对勾或叉。
- 连接/断开。 一次点击,不需要窗口。
- 显示(Show)。 把主窗口叫回来。
- 退出 URnetwork(Quit URnetwork)。 先断开再退出。
关掉窗口,应用继续在菜单栏运行;隧道无论如何都继续运行,因为它是一个独立的、由系统管理的进程。⌘Q 也故意不是退出:它隐藏窗口,把应用从 Dock 收进菜单栏。这里的退出 URnetwork才是真正的退出,它会连隧道一起带走。
与 iOS 共享:深层功能
这些功能与 iOS 应用完全一致;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 记录了这种参与的奖励如何运作。
安全是在你自己机器上做出来的。连接引擎的开源检查层在你的 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 偏好存储拒绝枚举配置,这个状态应用无法从内部修复。手动修复:
- 打开系统设置,找到 VPN 配置(系统设置 → VPN,或你的 macOS 版本上相当于通用 → VPN 与设备管理的位置)。
- 移除 URnetwork 的配置。
- 从应用重新连接,并批准全新的配置。
移除配置删掉的是管线,不是数据:你的账户、设置和分流规则原封不动,下一次连接会重建它(再次显示那个一次性的批准对话框)。
随登录启动
系统启动时启动 URnetwork(Launch URnetwork on system startup)是账户 → 设置里系统一节下的开关。它把应用注册进 macOS 自己的登录项服务,所以在应用支持的每个版本上都能工作,条目会出现在系统设置 → 通用 → 登录项里,你也可以在那里手动移除。关掉开关就再次注销它。
断网保护在这里如何工作
和 iOS 上一样:应用在账户 → 设置 → 连接里带一个断网保护(Kill switch)开关,与每个 URnetwork 应用相同的 SDK 控制项。它出厂关闭,所以打开它是一个有意的动作。打开后,客户端拒绝回落到你的本地路由,流量停住而不是泄漏。Mac 没有多给的是系统级执行。应用没有设置 includeAllNetworks,所以如果隧道进程意外死掉,macOS 会恢复正常联网而不是闭合失败:你的应用会继续在底层网络上用你的真实 IP 工作,你多半只察觉到一个小顿挫。菜单栏的对勾/叉就是一眼可见的绊线。应用监护隧道并积极恢复配置,但它目前不要求操作系统在隧道断开时硬性阻断流量。如果你需要有保证的"失败即断网",在 Mac 之外强制它(只放行隧道流量的路由器或防火墙规则),或者把浏览器里的关键工作交给 URnetwork 浏览器扩展,它的断网保护默认开启,只覆盖浏览器流量。
读取隧道的日志
隧道扩展写入统一系统日志:Console.app,不是文件。
- 打开 Console.app,选中你的 Mac。
- 在操作菜单里启用包含信息级消息(Include Info Messages)和包含调试级消息(Include Debug Messages)。有用的行都在这两级。
- 按
network.ur.extension子系统过滤,或搜索"URnetwork",然后复现连接过程。
睡眠行为
隧道的配置是 disconnectOnSleep 关闭:合上盖子不会拆掉会话,所以你从中断处继续,而不是每次唤醒都重新握手。睡着的 Mac 不移动任何流量。它不在浏览,也不在共享;这个设置只是免去你重新握手。