Get ready for iCloud Private Relay
Privacy & Security 进阶 18m

为 iCloud Private Relay 做好准备

Get ready for iCloud Private Relay

2021年6月9日

在 Apple 官方观看视频

一句话判断

如果你的服务端依赖 IP 地址做地理围栏、欺诈检测或个性化内容,Private Relay 会直接打乱你的数据 —— 这集 Session 就是告诉你哪些东西会坏、该怎么修。

这场 Session 讲了什么

iCloud Private Relay 是 iOS 15 中 iCloud+ 订阅用户的隐私功能。当用户在 Safari 中浏览网页时,流量通过两跳代理加密传输:第一跳(苹果服务器)知道用户身份但不知道访问目标,第二跳(第三方 CDN 合作伙伴)知道访问目标但不知道用户身份。结果是:网站看不到用户的真实 IP 地址。

Session 详细讲解了这个架构对 Web 开发者和后端服务的影响。受影响的功能包括:IP 地理定位(不再准确)、DNS 过滤(DNS 查询被加密)、邮件追踪像素(被 Mail Privacy Protection 拦截)、以及基于 IP 的欺诈检测(需要新方案)。

还提供了具体的迁移建议:使用 Apple 提供的地理位置提示(Client Hints)、转向 SKAdNetwork 做归因、以及如何检测 Private Relay 用户。

值得深挖的点

IP 地理定位的替代方案。Private Relay 会把用户 IP 替换为同一大区域(通常是国家+时区级别)的代理 IP。如果你的服务需要城市级别的定位(如本地商店查找),IP 定位不再可靠。苹果建议使用浏览器原生的 Geolocation API(需要用户授权)或 Sec-CH-IP-Geo Client Hints header(Private Relay 会在请求中添加这个 header,提供国家/城市级别的地理信息,但精度不如真实 IP)。

对欺诈检测系统的冲击。很多反欺诈系统依赖 IP 地址做设备指纹、代理检测、速率限制。Private Relay 流量来自共享的代理 IP 池,这意味着:同一个 IP 可能有成千上万的正常用户,传统的 IP 封禁策略会误杀大量 iCloud+ 用户。苹果建议转向基于行为的欺诈检测(登录模式、交易频率、设备信任度)。

代码片段

服务端检测 Private Relay 流量

// 服务端 Swift(Vapor 框架示例)
func handleRequest(_ request: Request) -> Response {
    // 检查 Client Hints 中的地理信息
    if let geoHint = request.headers.first(name: "Sec-CH-IP-Geo") {
        // Private Relay 用户,使用 geo hint 替代 IP 定位
        print("用户大致位置: \(geoHint)")
        // geoHint 格式示例: "US, CA"(国家, 州/省)
    }

    // 检查 IP 是否属于 Private Relay 的代理池
    let clientIP = request.remoteAddress?.ipAddress ?? ""
    if isPrivateRelayIP(clientIP) {
        // 不要对 Private Relay IP 做速率限制或封禁
        return serveContent()
    }

    return serveContent()
}

前端使用 Geolocation API 替代 IP 定位

// Web 前端:请求用户授权获取精确位置
function getUserLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(
            (position) => {
                // 获取到精确的经纬度(需要用户授权)
                const { latitude, longitude } = position.coords;
                fetchNearbyStores(latitude, longitude);
            },
            (error) => {
                // 用户拒绝授权,回退到粗略定位
                console.log("位置获取失败,使用默认区域");
                fetchDefaultStores();
            }
        );
    }
}

配置 DNS 记录支持 Private Relay 排除

# 如果你的域名需要排除在 Private Relay 之外
# (例如企业内网、需要 IP 认证的服务)
# 在 DNS 中添加排除记录:

# 方法 1:设置 DNS 不参与代理
example.com. IN TXT "apple-domain-verification=your-verification-token"

# 方法 2:使用 _pfr 配置排除
_pfr._tcp.example.com. IN SRV 0 0 443 exclude.example.com.

最佳实践

  1. 不要封禁 Private Relay 的 IP 段。这些 IP 被 iCloud+ 用户共享,封禁一个 IP 等于封禁几千个正常用户。转向基于用户账号的速率限制。
  2. 本地化内容优先使用 Geolocation API 或用户手动选择,不要依赖 IP 地理定位。Private Relay 下 IP 定位最多精确到国家级别。
  3. 邮件营销系统要适配 Mail Privacy Protection。追踪像素不再返回真实的打开数据,转向 SKAdNetwork 或直接在邮件中放置带 UTM 参数的链接来衡量转化。

还有什么值得关注

  • Private Relay 是 iCloud+ 付费功能,免费 iCloud 用户不会触发。
  • 不支持 HTTP,只代理 HTTPS 流量。纯 HTTP 站点不受影响(但也建议全部迁移到 HTTPS)。
  • Private Relay 在中国、沙特阿拉伯等地区因法规原因不可用。
WWDC 2021