门店在原本租金 $200 的基础上直接加了 “Return on Damage” $400(这是店员当场在 Google 上搜到的这款车前挡风玻璃的价格),没有提供任何正式的损坏/定损文件,只说“会去调监控检查取车时的画面,如果是既有损坏会撤销”。因此门店从我信用卡中扣除了 $600。之后我再也联系不上门店
这是因为我发现,在 iPad 上使用远程桌面应用(在我的情况下,是 Jump Desktop)并且在家里有一台 Mac mini,我就不再需要 MacBook Pro 了。让我解释一下:
我的 iPad 支持蜂窝网络。使用无限的 5G 蜂窝计划(每月 $11.5-16.5)。当我在家时,我使用 Mac mini 和 Studio Display。当我离开家时,我只带 iPad。如果我需要做一些 iPad 无法处理的事情,我可以直接 “Jump” 到家里的 Mac mini。
为什么这个组合比 MacBook 更好?
蜂窝网络
iPad 支持蜂窝网络,它始终保持联网。而 Mac 可能没有这种功能,尤其当我不在家时。
当我打开邮件/信息应用时,iPad 上的邮件已经全部下载完毕。然而在 Mac 上,我需要先连接到 iPhone 的热点或 Guest Wi-Fi,然后等待邮件下载。这可能需要 30 秒到几分钟。
我可以随时随地通过蜂窝网络将 iPad 备份到 iCloud。然而在 Mac 上,除非我带着 USB 硬盘或者连上家里的 Wi-Fi,否则我无法通过 Time Machine 备份 Mac。(不过,我仍然可以通过第三方应用将 Mac 备份到云端。)
我还可以通过蜂窝网络备份 Lightroom 照片。使用 USB 3,我可以将所有照片导入 iPad,然后通过 5G 上传到 Lightroom。然后我 Jump 到 Mac mini 上,这些照片已经在 Mac mini 的 Lightroom 中了。Jump 到 Mac 后,我可以做 AI 降噪等处理。完成 AI 去噪后,我可以返回 iPad 的 Lightroom 进行更多操作。
流媒体、应用体验等。有了蜂窝网络,这些事情都变得更加方便。
娱乐应用
Netflix for iPad(或者其他许多流媒体应用)。在飞行前,我可以在 iPad 上下载一堆节目。Mac 上无法做到这一点。有些流媒体网站甚至无法在 Mac 上播放 4K HDR,但可以在 iPad 应用中做到(比如 Paramount,至少曾经是这样)。
在 iPad 的 OLED 显示屏上流媒体播放效果更好,而且更方便。它更小、更轻,我可以在观看节目时取下键盘。这比 Vision Pro 还要简单。
阅读书籍。用 iPad 读书比用 MacBook 更自然。
其他
触摸屏和 Apple Pencil。Mac 没有这些功能。而且,当我 Jump 到 macOS 时,我还可以使用触摸屏和 Pencil。
我家里的 Mac mini 连接了许多外设:两个 4TB 的 SSD 和超过 10TB 的硬盘。它还有千兆网速。当我 Jump 到我的 Mac 时,所有这些外设都可以访问。如果不使用远程桌面,我就必须带上这些外设,而这有丢失的风险,数据安全得不到保障。
它比 iPad + MacBook Pro 还好:
iPad 比 MacBook Pro 更轻便。带着 iPad 和 MacBook Pro 一起旅行太重了。
我选择的是 512GB 的版本,主要考虑是 Vision Pro 上的一些软件/游戏可能会有更多的 3D 场景,会更消耗存储空间。但大多数时候又是在 Wi-Fi 环境下使用,所以 1TB 版本又没有那么有必要。
UI 显示效果
本人之前没有使用过其他 VR/AR 类产品(排除 Google Cardboard😂),所以并没有感觉到 Vision Pro 有多么的好。相反,我的感觉是 Vision Pro 的显示效果其实完全无法代替 Studio Display。与其它类型的显示器相比,它有这些特点
清晰度:5K 显示器有着明显锐利的多的画面,并且能肉眼感觉到显示器的色彩空间也更好。目前看来 Vision Pro 的显示清晰度大约相当于 2.5K 的水平,显示效果:高端显示器 >> Vision Pro > 高端投影。仔细观察,我是可以看到 Vision Pro 中的像素的。我的视力也并非完美水平,处于轻微近视,在不配矫正镜片的时候依然能察觉到像素。
**自适应的渲染:**之前的清晰度是我将窗口调整到我平时操作显示器的大小时进行的比较。但 Vision Pro 的窗口是可以调节的,包括远近和大小。此外,眼镜在物理世界里的位移也会影响到显示:当你贴近时,可以看到更清晰的画面。如果说视网膜屏幕是 @2x-@3x,那么 Vision Pro 则是 @1x-@9x(9x是打个比方)。Vision Pro 中的所有系统UI(包括网页上的SVG/文字)都是矢量渲染的,不需要 Zoom In,只需要人走进显示区域,就会发现每一个小字/矢量图都会变的无限清晰。
一开始使用 Solo Band 的时候用久了还是挺不舒服的,但我现在换用 Dual Loop 并仔细调整后,发现比刚开始戴的时候舒服了非常多,感觉用个一两小时是没问题的。Dual Loop 有两个地方可以调整,建议多试,太紧或者太松都会导致不舒服。躺着用反而不舒服,比较压脸颊。重量肯定是能感知到的,希望有一天可以做到跟眼镜一样轻。
根据自己的使用习惯,苹果、谷歌和微软可能也没有多少选择。如果全家都是苹果全家桶用户,那么就直接苹果的 2TB 家人共享就很合适。如果是 Windows 用户,同时是 Office 使用者,那微软的方案是最合适的。如果是 Google Photos 的用户,或者经常使用 Google Workspace 来写文档,那么选择谷歌是更好的。
视频剪辑软件我使用的是 Final Cut Pro,我的相机产生的所有视频都使用 Final Cut Pro 管理。Final Cut Pro 可以配置资料库中媒体的存放位置,我将其设置为 Nextcloud 的文件夹。这也是主要占空间的文件。Final Cut Pro 的资料库我存放在本地,其备份存储在 iCloud。
为什么不用 NAS?
前年的时候,我在Mac mini 有什么用?组建家庭服务器! 里提到我使用 Mac mini 作为 NAS 使用。但当时我只是用它来进行备份,而非云存储。如果用自建 NAS 做云存储的话,出门在外访问则很成问题:最主要的就是受到 NAS 所在网络的上传速度限制,从而体验很差。在我的印象里,哪怕是成熟的 NAS 解决方案,也没有一个 NAS 能提供像 Dropbox 这样好用的全平台客户端。此外,单个的 NAS 并不可靠,因为它没有在物理上跨区域。NAS 中的硬盘也有购置成本,硬盘老化后也有更换成本,自己维护起来还有时间成本,最终未必划算。
如今,我把我的所有文件都放到了云存储,不再需要备份,因此也不再需要用 NAS 再备份一遍云存储中的东西了,只用来做 Mac 的 Time Machine。
假设需要存储 10 TB 的文件 10 年,S3 Glacier Deep Archive 的总费用为 $0.99 x 12 x 10 = $118.8;Google Archive 的总费用为 $1.20 x 12 x 10 = $144;S3 Glacier Instant Retrieval 或 Google Coldline 的总费用为 $4.00 x 12 x 10 = $480。
所以,对于不需要立即访问的文件,S3 Glacier Deep Archive有着绝对价格优势。但如果有立即访问的需求,S3 的 Glacier Deep Archive 是不支持的,Glacier Instant Retrieval 存储费用相比 Google 更贵,但取回费用相比 Google 更便宜。
由于 S3 的 Glacier Deep Archive 更加便宜,因此我最终选择了 S3。
Lightsail 与 Nextcloud 服务器配置
Lightsail 我选择了 $5/月的套餐,这个套餐是最具性价比的,包含了 2TB 的流量,同时 CPU 基线也来到了 10%。我这几天实际体验下来,Nextcloud 在不间断上传文件时 CPU 占用在 15-20% 左右,其他时候保持同步占用仅为 1%。也就是说每天可以有 12 小时的上传文件。
升级 Lightsail 的配置,或者在 Lightsail 上挂载 SSD 都是增加固定的存储容量,这并不划算。因此,推荐使用 EFS,将网络存储挂载到本机,修改 Nextcloud 的 data 目录到挂载点。参考 AWS 指南 How to Use Amazon EFS with Amazon Lightsail。EFS 是根据使用量按量计费的。只有存在尚未完成的分段上传时,Nextcloud 的 data 目录才会有大文件在,因此 EFS 按量计费十分划算。
在系统的通话页面输入 *3001#12345#*,然后点击呼叫。随后我们就可以看到下方视频所示的 Field Test Mode。选择 5G 中的 Nr ConnectionStats。若看不到 5G 相关选项,则说明当前没有 5G 信号,或机型/运营商不支持 5G。然后看 Band 中的数字。该视频中 band 数字为 78,为中频 5G。
需要注意的是,开启远程登录和远程管理前,一定要为你的 Mac 设置强密码,否则极有可能密码被暴力破解。
通过远程连接,甚至可以在 iPad 上使用 Final Cut Pro。经过本人实际体验,在同城市通过互联网连接操控时,感觉不到明显卡顿,完全可用。需要注意的是,使用 Final Cut Pro 时屏幕宽度必须大于 1280px(HiDPI 时为 2560 个像素点)。可以使用 SwitchResX 根据应用程序自动切换分辨率。下面这张截图是在 11-inch iPad Pro 上缩放显示的,因此有些许模糊。
Mac mini 作为 NAS 使用
macOS 的文件共享功能可以直接将 Mac mini 变成一个 NAS。只需要打开系统偏好设置——共享,然后启用 “文件共享”,就可以实现 NAS 了。Mac 使用的是 SMB 协议。建议使用有线网络以确保稳定性。
同样是在高级选项中,打开 “共享为时间机器备份目的位置” 即可。在需要进行备份的 Mac 上,使用访达(Finder)菜单栏中的前往——连接服务器(⌘K)连接到这台 Mac,然后就可以在系统偏好设置中的 “时间机器” 里找到通过文件共享的文件夹了。
我目前是通过 Internet 的方式连接到 Mac mini 实现异地备份的,首次备份花了大约 6 小时,之后每次备份都能在半小时内完成。我还添加了一个通过 USB 连接的 HDD,系统会使用两个磁盘轮流备份,成功实现了一个异地备份、三个存储介质和三份拷贝,符合备份 3-2-1 原则。
对 NAS 上的数据进行备份
为了更好的安全性,还可以对 NAS 上的数据进行备份。我选择使用 Mac mini 上安装的 Carbon Copy Cloner,将 NAS 上部分重要数据再次备份到本地局域网的 AirPort Time Capsule 上。我选择备份到 APFS 文件系统的 Sparse Bundle 上以实现快照和加密。
同步照片——Lightroom Classic CC
由于有了这个 10TB 的 NAS,我果断将我的 Adobe 订阅从 Lightroom (1TB) 换到了 Photography (20GB)。Photography (20GB) 相比 Lightroom (1TB) 多了 Photoshop CC 和 Lightroom Classic CC。其中 Lightroom Classic CC 使用的是本地的照片库,同时还可以与 Lightroom CC 进行同步。我在 Mac mini 上安装了 Lightroom Classic CC,并打开了同步功能,将之前所有的 Lightroom CC 图片均存储在了本地,然后在 Lightroom Classic CC 上对这些图片取消同步。很快,我的云空间就全部释放了。然后,我再将这些照片重新添加到同步文件夹中。此时,Lightroom Classic CC 只会上传这些照片的智能预览(就是相对低分辨率的 RAW 格式),这些照片不占用云端存储空间。以后,当 Lightroom CC 的空间再次不足时,我依然可以使用这个方法释放 Lightroom CC 的空间。
现在,我可以在我的任何安装了 Lightroom CC 的设备上对照片进行编辑。不过,如果需要导出原图,则仍需要在 Mac mini 上的 Lightroom Classic CC 操作。为了能够在其他桌面设备上导出原图,我需要在其他设备上拥有——1. 原图文件、2. 资料库。我选择使用 ChronoSync Express 对原图文件进行双向定时同步,使用 iCloud 云盘同步资料库(包括标准预览、1:1预览、智能预览)。经过我实际测试,发现 iCloud 是支持增量同步的,即每次修改资料库后只会同步资料库文件中改动的文件块。
刚刚收到了 Magic Keyboard (妙控键盘) for iPad Pro (11-inch)。Apple 在今年年初悄无声息的发布了配备双摄的 iPad Pro 2020 款,性能变化不大,主要是起配 128GB、价格下调。最主要的更新就是适配鼠标和触摸板的 iPadOS 13.4 以及刚刚开卖的 Magic Keyboard for iPad Pro。新的键盘同时支持 2018 和 2020 款 iPad Pro。这一代有着更好的支撑模式,改进了键盘,新增了 Type-C 充电,并增配了类似 Mac 的多点触控板。
功能概述
可以无极的调整倾斜角度
使用最新的的剪刀式结构键盘
支持键盘背光
多点触控触摸板(物理按压,非 Haptic Feedback)
为 iPad 增加一个 USB-C 充电口(不支持数据传输)
需要注意的是,该键盘使用专门的协议与 iPad 通信,不支持蓝牙。也就是说,只能给 iPad Pro 使用。
重量:论重量,该键盘重量远大于 Magic Keyboard for Mac 加上 Magic Trackpad for Mac 的重量。因此便携度还是 Mac 所配的键盘和触摸板更优。11-inch 键盘的重量为 600g 左右。作为参考,11-inch iPad Pro 重量为 471g;11-inch 智能键盘夹(Smart Keyboard Folio)为 300g 左右;Magic Keyboard for Mac 加上 Magic Trackpad for Mac 的重量为 231g + 231g = 462g,何况后者比 iPad 的触摸板还要大很多,并支持 Haptic Feedback。安装上该键盘会使设备增重一倍多,实在有点夸张。主要问题是双面保护的问题,如果能够省去背面的保护,重量应该能轻不少。
类别
型号
重量
iPad 11-inch
Magic Keyboard
593g
机身
471g
Smart Keyboard Folio
297g
机身 + Magic Keyboard
1.06kg
iPad 12.9-inch
Magic Keyboard
699g
机身
641g
Smart Keyboard Folio
407g
机身 + Magic Keyboard
1.34kg
Mac
Magic Keyboard
231g
Magic Trackpad
231g
MacBook
13-inch Air
1.29kg
13-inch Pro
1.37kg
16-inch Pro
2.0kg
* Magic Keyboard for iPad Pro 和 Smart Keyboard Folio 的重量均不是官方数据
通过使用 SSD 外设,可以在保证较高的性能的同时扩展电脑的储存。然而,你甚至可以把电脑操作系统安装在 U 盘上,这样你不用分区也能使用目标操作系统开机。如果你将操作系统安装到 HDD 移动硬盘上,其启动速度就会很慢;如果安装到普通 U盘上,其启动速度几乎是不能忍受的。因此建议将操作系统安装到 SSD 外设上。
macOS、Windows 和 Linux 都可以被安装在 U盘或者移动硬盘上。但 Windows 对各种硬件兼容的最好,如果你需要在 PC 机上使用,那么只推荐 Windows 系统。Windows 10 企业版支持 Windows To Go 功能,专门为安装在 U 盘或移动硬盘上时进行了优化。
要安装 Windows To Go(WTG) 需要有 Windows 环境,可以是安装 Windows 的 PC、使用 BootCamp 的 Mac,或者是运行有 Windows 的虚拟机。如果你恰好使用 Windows 10 企业版,那么你可以使用系统控制面板中的 WTG 工具(然而我用系统自带的工具安装失败了)。否则你只能使用第三方工具安装 WTG。这里推荐这个 WTG 辅助工具。
安装成功后,你可以在电脑启动时选择从 U 盘启动,或者在虚拟机里从 U 盘启动。这里展示一下在 Mac 上启动 WTG 以及 macOS 上的 VMware Fusion 中启动 WTG。
MacBook Pro 开机启动到 Windows To Go。
以上视频是在 Mac 上开机直接进入 WTG。如果你的 Mac 配备了 T2 安全芯片,那么你需要关闭启动安全性检查(无安全性、允许从外部介质启动)才能够从外部设备启动 Windows。你可以考虑开启固件密码以继续保证安全性(没有 T2 芯片的 Mac 也可以开启固件密码)。提示:请牢记固件密码,固件密码一旦忘记只能返厂修。
刚安装完的 Windows 可能没有 Mac 的鼠标和触摸板的驱动。你需要通过 USB 鼠标和触摸板来完成安装工作(Magic Keyboard 2 和 Magic Trackpad 2 连线后也可作为 USB 外设)。
你需要为 Windows 安装 Mac 的驱动。在 Mac 的 “启动转换”(Boot Camp)软件中的 “操作” 菜单里可以手动 “下载 Windows 支持软件”(驱动)。注意,不同型号的 Mac 的驱动不同,建议使用系统的软件下载。如果你需要在多个 Mac 上使用一个 WTG,你需要安装多个驱动。启动转换助理是帮助用户在 Mac 本地硬盘上安装 Windows 双系统的,不能用来安装 Windows To Go,这里只是用它安装驱动。
建议将驱动保存在另一个 Windows 可以识别的 U盘上(见本文的 “磁盘格式的选择”)。然后再次开机进入 WTG 后就能安装了。
macOS 使用 VMware Fusion 进入 WTG。
如果你有虚拟机,你也可以在虚拟机里从 U 盘启动。
BitLocker
如果不启用 BitLocker,那么 U盘上所有用户文档都是明文存储的,也就是说只要有了你的 U盘,就能读取所有的用户数据。若启用了 BitLocker,那么磁盘数据安全性就能得到保证。然而 Mac 没有 BitLocker 的相关硬件支持,默认无法启动 WTG 中的 BitLocker,需要修改 Windows 下的配置文件。
启用 BitLocker 后会些许增加系统的 CPU 占用,略微降低磁盘性能。此外,启动了 BitLocker 的磁盘 macOS 无法识别,意味着在 macOS 系统上无法读取开启了 BitLocker 的 Windows 分区。建议谨慎开启。
使用体验
将 Windows 安装到 U盘不但节省了电脑内的磁盘空间,还有了一个可以随身携带的操作系统,可以在 Mac 和 PC 机上使用。我没有开启 BitLocker。我在 macOS 上开启了 NTFS 读写,所以其 Windows 分区还可以被当作 U盘共享数据使用。
我在 WTG 上安装了一些常用软件,在其他 PC 机上未必需要进入 WTG 系统以使用这些软件,而直接进入 WTG 根目录下 Program Files 文件夹里访问这些软件就行了。
我将 Windows 安装到了 CHIPFANCIER 出的 SSD U盘上,其特色是使用了 USB3.1 Gen2 Type-C 接口,这样不需要转接就能够在新 Mac 上使用。然后我又购买了绿联的 Type-C 转 Type-A 的转接头(USB 3.0),可以将此 U 盘转接到 Type-A 设备上。
使用两家服务商会增加配置难度,但可以提高 DNS 服务的稳定性。如最近的 DNSPod 宕机以及 2016 年的 Dyn 宕机所导致的众多网站无法访问,均是因为众多网站仅使用了一家 DNS 提供商。如果使用了多家 DNS 提供商,则网站仅会在所使用的所有服务商均发生宕机事故时才会无法访问,而这显然发生概率很小。
正如 Apple 在 10 月发布会时所说,在中国有 76% 的购买者是新接触 Mac 的(来源: October Event 2018 - YouTube)。想必有不少 Mac 使用者不知道有什么好的软件,也不清楚需要安装什么软件。Mac 上所需要使用的工具链与 Windows 有所差别。本文将介绍一些(我经常使用的)精致实用的软件,着重说说 Mac 上专有的软件,希望能够对新老用户都有所帮助。
对于新用户而言,要清楚获得 Mac 软件的两种正确方式:从 App Store 下载/通过互联网下载。从 App Store 下载软件最为安全,因为所有上架 App Store 的软件均通过了苹果的审核;从互联网下载的软件要小心一些,因为它可能是恶意软件,详情请看本文的 “Mac 系统安全” 一节。
付费软件,$39.99 买断 Carbon Copy Cloner(CCC)是一个功能齐全的备份管理软件。相比 Mac 自带的 Time Machine(时间机器),它可以备份外部磁盘、选择目录备份,还可以备份系统到 APFS 格式的硬盘,并创建可启动的外部磁盘。这个软件全面支持了 APFS 下的快照(Snapshot)功能,并有可视化界面去管理这些快照(支持挂载、恢复、删除等操作)。 个人建议:对于 Time Machine 能够适用的场景,优先使用 Time Machine,否则使用 CCC。
续之前的域名解析系统详解——基础篇,DNSSEC 是一组使域名解析系统(DNS)更加安全的解决方案。1993 年,IETF 展开了一个关于如何使 DNS 更加可信的公开讨论,最终决定了一个 DNS 的扩展——DNSSEC,并于 2005 年正式发布。然而,实际推行 DNSSEC 是一件非常难的事情,本文将讨论一下现有 DNS 系统所存在的一些不安全性,以及 DNSSEC 是如何解决这些问题的。
基础
传统 DNS 的问题
从上一篇文章中已经知道,在你访问一个网站,比如 www.example.com 时,浏览器发送一个 DNS 消息到一个 DNS 缓存服务器上去查询,由于 DNS 系统的庞大,这中间还需要经过好几层 DNS 缓存服务器。想要正确访问到这个网站,就需要这所有的缓存服务器都要正确的响应。
DNS 的中间人攻击
DNS 查询是明文传输的,也就是说中间人可以在传输的过程中对其更改,甚至是去自动判断不同的域名然后去做特殊处理。即使是使用其他的 DNS 缓存服务器,如 Google 的 8.8.8.8,中间人也可以直接截获 IP 包去伪造响应内容。由于我所在的国家就面临着这个问题,所以我可以轻松的给大家演示一下被中间人攻击之后是什么个情况:
1 2
$ dig +short @4.0.0.0 facebook.com 243.185.187.39
向一个没有指向任何服务器的 IP 地址:4.0.0.0 发送一个 DNS 请求,应该得不到任何响应。可是实际上在我所处的国家却返回了一个结果,很明显数据包在传输过程中“被做了手脚”。所以如果没有中间人攻击,效果是这样的:
1 2
$ dig +short @4.0.0.0 facebook.com ;; connection timed out; no servers could be reached
DNS 系统就是这么脆弱,和其他任何互联网服务一样,网络服务提供商、路由器管理员等均可以充当“中间人”的角色,来对客户端与服务器之间传送的数据包进行收集,甚至替换修改,从而导致客户端得到了不正确的信息。然而,通过一定的加密手段,可以防止中间人看到在互联网上传输的数据内容,或者可以知道原始的数据数据是否被中间人修改。
假如服务器要向客户端发送一段消息,服务器有私钥,客户端有公钥。服务器使用私钥对文本进行加密,然后传送给客户端,客户端使用公钥对其解密。由于只有服务器有私钥,所以只有服务器可以加密文本,因此加密后的文本可以认证是谁发的,并且能保证数据完整性,这样加密就相当于给记录增加了**数字签名**。但是需要注意的是,由于公钥是公开的,所以数据只是不能被篡改,但可以被监听。 此处的服务器如果是充当 DNS 服务器,那么就能给 DNS 服务带来这个特性,然而一个问题就出现了,如何传输公钥?如果公钥是使用明文传输,那么攻击者可以直接将公钥换成自己的,然后对数据篡改。
DNSSEC 这一个扩展可以为 DNS 记录添加验证信息,于是缓存服务器和客户端上的软件能够验证所获得的数据,可以得到 DNS 结果是真是假的结论。上一篇文章讲到过 DNS 解析是从根域名服务器开始,再一级一级向下解析,这与 DNSSEC 的信任链完全相同。所以部署 DNSSEC 也必须从根域名服务器开始。本文也就从根域名服务器讲起。
你发往 DNS 服务器的请求是明文的,DNS 服务器返回的请求是带签名的明文。这样 DNSSEC 只是保证了 DNS 不可被篡改,但是可以被监听,所以 DNS 不适合传输敏感信息,然而实际上的 DNS 记录几乎都不是敏感信息。HTTPS 的话会同时签名和双向加密,这样就能够传输敏感信息。 DNSSEC 的只签名,不加密主要是因为 DNSSEC 是 DNS 的一个子集,使用的是同一个端口,所以是为了兼容 DNS 而作出的东西,而 DNS 是不需要客户端与服务器建立连接的,只是客户端向服务器发一个请求,服务器再向客户端返回结果这么简单,所以 DNS 都可以使用 UDP 来传输,不需要 TCP 的握手,速度非常快。HTTPS 不是 HTTP 的子集,所以它使用的是另一个端口,为了做到加密,需要先与浏览器协商密钥,这之间进行了好几次的握手,延迟也上去了。
在哪里验证?
刚才所讲述的所有情况,都是在没有 DNS 缓存服务器的情况下。如果有 DNS 缓存服务器呢? 实际上,一些 DNS 缓存服务器就已经完成了 DNSSEC 验证,即使客户端不支持。在缓存服务器上验证失败,就直接不返回解析结果。在缓存服务器进行 DNSSEC 验证,几乎不会增加多少延迟。 但这也存在问题,如果缓存服务器到客户端之间的线路不安全呢?所以最安全的方法是在客户端上也进行一次验证,但这就会增加延迟了。
DNSSEC 的时效性和缓存
DNSSEC 相比 HTTPS 的一个特性就是 DNSSEC 是可以被缓存的,而且即使是缓存了也能验证信息的真实性,任何中间人也无法篡改。然而,既然能够缓存,就应该规定一个缓存的时长,并且这个时长也是无法篡改的。 签名是有时效性的,这样客户端才能够知道自己获得到的是最新的记录,而不是以前的记录。假如没有时效性,你的域名解析到的 IP 从 A 换到了 B,在更换之前任何人都可以轻易拿到 A 的签名。攻击者可以将 A 的签名保存下来,当你更换了 IP 后,攻击者可以继续篡改响应的 IP 为 A,并继续使用原本 A 的签名,客户端也不会察觉,这并不是所期望的。 然而在实际的 RRSIG 签名中,会包含一个时间戳(并非 UNIX 时间戳,而是一个便于阅读的时间戳),比如 20170215044626,就代表着 UTC 2017-02-15 04:46:26,这个时间戳是指这个记录的失效时间,这意味着在这个时间之后,这个签名就是无效的了。时间戳会被加进加密内容中去参与签名的计算,这样攻击者就无法更改这个时间戳。由于时间戳的存在,就限制了一个 DNS 响应可以被缓存的时长(时长就是失效时间戳减去当前时间戳)。然而,在有 DNSSEC 之前,控制缓存时长是由 TTL 决定的,所以为了确保兼容性,这两个时长应该是完全一样的。 通过这样做,即能够兼容现有的 DNS 协议,有能够保证安全,还能够利用缓存资源加快客户端的请求速度,是一个比较完美的解决方案。
会给浏览器带来一个额外的 DNS 查询时间,为了最高的安全性,浏览器应该在开始加载 HTTPS 页面(建立握手后)之前就先查询 TLSA 记录,这样才能够匹配证书是否该被信任,这样无疑增加了所有 HTTPS 页面的加载时长。
现有的 DNS 是一个不是足够稳定的东西,何况 DNSSEC 的记录类型不被一些 DNS 递归服务器所支持等,经常会由于因为种种原因遇到查询失败的问题,按照规则,TLSA 记录查询失败的话客户端也应该不加载页面。这样无疑增加了 HTTPS 页面加载的出错率,这样无疑会导致很多原本没有被中间人的网站也无法加载。
DNS 污染,在一些情况下,客户端所处的是被 DNS 污染的环境,特点就是将服务器解析到了错误的 IP 地址。然而此时中间人为了仍能够让用户访问到 HTTPS 网站,会进行类似 SNI Proxy 的操作,此时的客户端访问网站仍是比较安全的。然而显然,DANE 在 DNS 被污染后,会直接拒绝加载页面,这样被 DNS 污染的环境会有大量站点无法加载。
然而我认为这些都不是什么问题。为了解决 DNS 的问题,可以使用 Google DNS-over-HTTPS,这样的话就能避免很多 DNS 污染的问题,而且由于 DNSSEC 本身包含签名,Google 是无法对返回内容篡改的。那么直至现在,TLSA 就只存在最后一个问题:为了获取 TLSA 记录而增加的加载延迟。而这也可以完美解决,OCSP 就是一个例子,现在传统的 CA 为了实现吊销机制,也都有 OCSP:
OCSP(Online Certificate Status Protocol,在线证书状态协议)是用来检验证书合法性的在线查询服务,一般由证书所属 CA 提供。为了真正的安全,客户端会在 TLS 握手阶段进一步协商时,实时查询 OCSP 接口,并在获得结果前阻塞后续流程。OCSP 查询本质是一次完整的 HTTP 请求,导致最终建立 TLS 连接时间变得更长。
这样,在开始正式开始加载页面,客户端也需要进行一次 HTTP 请求去查询 OCSP。OCSP 也会十分影响页面加载速度,也同样会增加加载页面出错的可能。而 OCSP 有了 OCSP Stapling,这样的话 Web 服务器会预先从 CA 获取好 OCSP 的内容,在与 Web 服务器进行 HTTPS 连接时,这个内容直接返回给客户端。由于 OCSP 内容包含了签名,Web 服务器是无法造假的,所以这一整个过程是安全的。同理,TLSA 记录也可以被预存储在 Web 服务器中,在 TLS 握手阶段直接发送给客户端。这就是 DNSSEC/DANE Chain Stapling,这个想法已经被很多人提出,然而直至现在还未被列入规范。也许浏览器未来会支持 TLSA,但至少还需要很长一段时间。
传统 CA 机制所特有的优势
传统的证书配合了现在的 Certificate Transparency,即使不需要 TLSA 记录,也能一定程度上保证了证书签发的可靠性。此外,传统证书也可以使用 TLSA,其本身的安全性不比 DANE 自签名差。 此外,传统 CA 签发的证书还有自签名证书做不到的地方:
OV 以及 EV 证书:DANE 自签名的证书其实就相当于 CA 签发的 DV 证书,只要是域名所有者,就能够拥有这种证书。然而很多 CA 同时还签发 OV 和 EV 证书,OV 证书可以在证书内看到证书颁发给的组织名称,EV 则是更突出的显示在浏览器上:在 Chrome 的地址栏左侧和 HTTPS 绿锁的右侧显示组织名称;Safari 则甚至直接不显示域名而直接显示组织名称。OV 和 EV 的特点就是,你甚至都不用去思考这个域名到底是不是某个组织的,而直接看证书就能保证域名的所有者。而 DV 证书可能需要通过可靠的途径验证一下这个域名到底是不是某个组织的。比如在你找一家企业官网的时候,有可能会碰到冒牌域名的网站,而你不能通过网站是否使用了 HTTPS 而判断网站是否是冒牌的——因为冒牌的网站也可以拿到 DV 证书。而当你发现这个企业使用了 OV 或 EV 证书后,你就不用再去考虑域名是否正确,因为冒牌的网站拿不到 OV 或 EV 证书。在申请 OV 或 EV 证书时,需要向 CA 提交来自组织的申请来验证组织名称,而由于 DANE 证书是自签发的,自然也不能有 OV 或 EV 的效果。
IP 证书:CA 可以给 IP 颁发证书(尽管这很罕见),这样就可以直接访问 HTTPS 的 IP。而 DANE 基于域名系统,所以不能实现这一点
$ ssh guozeyu.com The authenticity of host 'guozeyu.com (104.199.138.99)' can't be established. ECDSA key fingerprint is SHA256:TDDVGvTLUIYr6NTZQbXITcr7mjI5eGCpqWFpXjJLUkA. Are you sure you want to continue connecting (yes/no)?
国外请求测试地址,其中的 via 字段就是 Cloudflare 与本站建立的连接的 IP 地址。通过 GeoIP 服务查询,发现是香港的 IP。Cloudflare 将自己的节点之间都建立了长连接,并在离源站最近的服务器上与源站也提前建立了连接。这样,就能大大降低首次连接所需要的时间。如果回源是 HTTPS 的,那么效果更明显。我的另一个测试地址是没有开启这个功能的,用来对比,它的回源与本站建立的 IP 就不是香港的。
域名相关:不管你是选择使用虚拟主机、VPS 或是独立服务器,通常你还需要自己买一个域名,配置 DNS 解析等等,推荐免费的 DNS 解析有 CloudFlare、Rage4,国内还有 CloudXNS,一些虚拟主机商以及域名注册商也提供免费的解析,但不如前面介绍的那几个(详细关于 DNS 的介绍请见此)。如果选择使用 CloudFlare,那么你还可以在 DNS 后台选择开启 Proxy(CDN),这样能为你的网站缓存并加速(但实际上对于国内来说有可能反而减速),并获得一些基础的 DDOS 防护,并隐藏你的源站 IP 地址。
整个 DNS 具有复杂的层次,这对刚开始购买域名的人有很大的疑惑。本文将详尽的介绍 DNS 的工作原理,有助于更深刻的理解。本文将介绍:
在客户端上是如何解析一个域名的
在 DNS 缓存服务器上是如何逐级解析一个域名的
同时还包含:
域名的分类
什么是 Glue 记录
为什么 CNAME 不能设置在主域名上
先从本地的 DNS 开始讲起。
本地 DNS
本地的 DNS 相对于全球 DNS 要简单的多。所以先从本地 DNS 开始讲起。 127.0.0.1 常被用作环回 IP,也就可以作为本机用来访问自身的 IP 地址。通常,这个 IP 地址都对应着一个域名,叫 localhost。这是一个一级域名(也是顶级域名),所以和 com 同级。系统是如何实现将 localhost 对应到 127.0.0.1 的呢?其实就是通过 DNS。在操作系统中,通常存在一个 hosts 文件,这个文件定义了一组域名到 IP 的映射。常见的 hosts 文件内容如下:
1 2
127.0.0.1 localhost ::1 localhost
它就定义了 localhost 域名对应 127.0.0.1 这个 IP(第二行是 IPv6 地址)。这样,当你从浏览器里访问这个域名,或者是在终端中执行 Ping 的时候,会自动的查询这个 hosts 文件,就从文件中得到了这个 IP 地址。此外,hosts 文件还可以控制其他域名所对应的 IP 地址,并可以 override 其在全球 DNS 或本地网络 DNS 中的值。但是,hosts 文件只能控制本地的域名解析。hosts 文件出现的时候,还没有 DNS,但它可以说是 DNS 的前身。 如果需要在一个网络中,公用同一个 DNS,那么就需要使用 IP 数据包向某个服务器去获取 DNS 记录。 在一个网络里(此处主要指本地的网络,比如家庭里一个路由器下连接的所有设备和这个路由器组成的网络),会有很多主机。在与这些主机通信的时候,使用域名会更加的方便。通常,连接到同一个路由器的设备会被设置到路由器自己的一个 DNS 服务器上。这样,解析域名就不仅可以从 hosts 去获取,还可以从这个服务器上去获取。从另一个 IP 上去获取 DNS 记录通过 DNS 查询,DNS 查询通常基于 UDP 或者 TCP 这种 IP 数据包,来实现远程的查询。我的个人电脑的网络配置如下,这是在我的电脑连接了路由器之后自动就设置上的:
重点是在路由器和搜索域上。 我的电脑的主机名(也是电脑名)设置的是 ze3kr,这个内容在连接路由器时也被路由器知道了,于是路由器就给我的主机分配了一个域名 ze3kr.local,local 这个一级域名专门供本地使用。在这个网络内所有主机通过访问 ze3kr.local 这个域名时,路由器(10.0.1.1)就会告知这个域名对应的 IP 地址,于是这些主机够获得到我的电脑的 IP 地址。至于搜索域的作用,其实是可以省去输入完整的域名,比如:
1 2 3 4 5 6
$ ping ze3kr PING ze3kr.local (10.0.1.201): 56 data bytes 64 bytes from 10.0.1.201: icmp_seq=0 ttl=64 time=0.053 ms --- ze3kr.local ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.053/0.053/0.053/0.000 ms
当设置了搜索域时,当你去解析 ze3kr 这个一级域名时,便会先尝试去解析 ze3kr.local,当发现 ze3kr.local 存在对应的解析时,便停止进一步解析,直接使用 ze3kr.local 的地址。 现在你已经了解了本地 DNS 的工作方式。DNS 的基本工作方式就是:获取域名对应 IP,然后与这个 IP 进行通信。 当在本地去获取一个完整域名(FQDN)时(执行 getaddrbyhost),通常也是通过路由器自己提供的 DNS 进行解析的。当路由器收到一个完整域名请求且没有缓存时,会继续向下一级缓存 DNS 服务器(例如运营商提供的,或者是组织提供的,如 8.8.8.8)查询,下一级缓存 DNS 服务器也没有缓存时,就会通过全球 DNS 进行查询。具体的查询方式,在 “全球 DNS” 中有所介绍。
总结
在本地,先读取本地缓存查找记录,再读取 Hosts 文件,然后在搜索域中查找域名,最后再向路由器请求 DNS 记录。
全球 DNS
在全球 DNS 中,一个完整域名通常包含多级,比如 example.com. 就是个二级域名, www.example.com. 就是个三级域名。通常我们常见到的域名都是完整的域名。
先从根域名开始,未命名根也可以作为 . 。你在接下来的部分所看到的很多域名都以 .结尾,以 .结尾的域名是特指的是根域名下的完整域名,然而不以 . 结尾的域名大都也是完整域名,实际使用时域名末尾的 .也常常省略。在本文中,我使用 dig 这一个常用的 DNS 软件来进行查询,我的电脑也已经连接到了互联网。 假设目前这个计算机能与互联网上的 IP 通信,但是完全没有 DNS 服务器。此时你需要知道根 DNS 服务器,以便自己获取某个域名的 IP 地址。根 DNS 服务器列表可以在这里下载到。文件内容如下:
其中,可以看到 TTL 与刚才文件中的内容不一样,此外还多了一个 SOA 记录,所以实际上是以这里的结果为准。这里还有一个 SOA 记录,SOA 记录是普遍存在的,具体请参考文档,在这里不做过多说明。
SOA 记录:指定有关 _DNS 区域_的权威性信息,包含主要名称服务器、域名管理员的电邮地址、域名的流水式编号、和几个有关刷新区域的定时器。(RFC 1035)
DNS 区域:对于根域名来说,DNS 区域就是空的,也就是说它负责这互联网下所有的域名。而对于我的网站,DNS 区域就是 guozeyu.com.,管理着 guozeyu.com. 本身及其子域名的记录。
此处的 ADDITIONAL SECTION 其实就包含了 Glue 记录。
一级域名
根域名自身的 DNS 服务器服务器除了被用于解析根自身之外,还用于解析所有在互联网上的一级域名。你会发现,几乎所有的 DNS 服务器,无论是否是根 DNS 服务器,都会解析其自身以及其下级域名。 从之前的解析结果中可以看出,根域名没有指定到任何 IP 地址,但是却给出了 NS 记录,于是我们就需要用这些 NS 记录来解析其下级的一级域名。下面,用所得到的根 NS 记录中的服务器其中之一来解析一个一级域名 com.。
可以看到,使用 host 命令获得 IP 地址的域名与使用 dig 获取的相同,均为 99.138.199.104.bc.googleusercontent.com. 。可以看出,这个 IP 是属于 Google 的。此外,需要注意的是 in-addr.arpa. 下的字域名正好与原 IPv4 地址排列相反。 这个记录通常可以由 IP 的所有者进行设置。然而,IP 的所有者可以将这项记录设置为任何域名,包括别人的域名。所以通过这种方法所判断其属于 Google 并不准确,所以,我们还需要对其验证:
1 2
$ dig 99.138.199.104.bc.googleusercontent.com a +short 104.199.138.99
此外,Cloudflare 还自带了 Health Check 功能,可以当服务器宕机后能够自动更改回源。虽然通过 DNS 的方式也可以实现宕机后切换,但是 DNS 方式毕竟会收到缓存时长影响,若使用 CDN 切换,则可以实现秒级切换。 我的一个 WordPress 站点 tlo.xyz 就使用了这个功能,默认是美国东部和亚洲东部跨区域负载均衡,两者有一者宕机自动切换。如果全部宕机,则 fallback 到 Google Cloud Storage 上的静态页面。你可以观察 https://tlo.xyz 上的 TLO-Hostname 的 Header 来判断是哪一个服务器做的响应。
通过 DNS 实现(GeoDNS + 权重)
使用此功能不需要开启它的 CDN 功能,故访客是直接连接源站的。同上一种方式也是配置一个 Group,只是不开启 CDN 功能,然后 Cloudflare 会只作为 DNS 服务器的功能。它会自动进行 GeoDNS,给访客返回最近的服务器的 IP 地址,同样也支持 Health Check 功能,当服务器宕机后会自动切换解析。 不同于其他的 DNS 解析商,Cloudflare 真正做到了智能,只需要配置一个 Group 即可,剩下的 Cloudflare 会自动搞定,而不是去手动地选择哪一个地区解析到哪一个服务器。 此功能已经被我测试,目前的测试期间,GeoDNS 的定位功能是根据请求最终抵达的 CloudFlare 的服务器来决定的,也就是说是依靠 Anycast 系统来决定的。然而中国用户绝大多数会被运营商定向到 CloudFlare 的美国西部服务器,于是就会被 GeoDNS 系统解析道美国西部位置所对应的结果。所以此功能还是十分有限,不适合国内使用。
Rate Limiting
Cloudflare 终于可以限制 IP 的请求速率,此功能能够相当有效的过滤 CC 攻击,而且对于普通访客几乎没有影响(以前只能通过 I’m under attack 功能实现,然而这个功能会让所有用户等 5 秒才能载入)。它可以根据不同的路径配置不同的请求速率,能够实现防止暴力破解密码、防止 API 接口滥用等功能。