为 iCloud Private Relay 做好准备
Get ready for iCloud Private Relay
2021年6月9日
一句话判断
如果你的服务端依赖 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.
最佳实践
- 不要封禁 Private Relay 的 IP 段。这些 IP 被 iCloud+ 用户共享,封禁一个 IP 等于封禁几千个正常用户。转向基于用户账号的速率限制。
- 本地化内容优先使用 Geolocation API 或用户手动选择,不要依赖 IP 地理定位。Private Relay 下 IP 定位最多精确到国家级别。
- 邮件营销系统要适配 Mail Privacy Protection。追踪像素不再返回真实的打开数据,转向 SKAdNetwork 或直接在邮件中放置带 UTM 参数的链接来衡量转化。
还有什么值得关注
- Private Relay 是 iCloud+ 付费功能,免费 iCloud 用户不会触发。
- 不支持 HTTP,只代理 HTTPS 流量。纯 HTTP 站点不受影响(但也建议全部迁移到 HTTPS)。
- Private Relay 在中国、沙特阿拉伯等地区因法规原因不可用。