Blanboom https://blanboom.org Wed, 22 Jul 2020 14:30:48 +0000 zh-CN hourly 1 https://blanboom.org/wp-content/uploads/2018/03/cropped-favicon.001-32x32.png Blanboom https://blanboom.org 32 32 53782978 Titan Security Key 使用体验 https://blanboom.org/2020/titan/ https://blanboom.org/2020/titan/#respond Tue, 21 Jul 2020 16:59:13 +0000 https://blanboom.org/?p=1939

前段时间,我在 TuTu 生活志视频中,看到了 Titan Security Key,并对这款来自 Google 的硬件安全密钥产生了兴趣。

在购买和使用了一个多月后,通过本文,我来简单谈一谈我的使用感受。

关于硬件安全密钥

什么是硬件安全密钥

硬件安全密钥将认证信息存储在独立硬件上,用于代替密码,或者提供一种双因素验证机制。

如果用户开启了基于硬件安全密钥的双因素验证,输入密码后,必须连接密钥再次确认,才能正常登录。这种机制为账号提供了额外的一层保护。

硬件安全密钥一般基于 FIDO 协议,网站可使用 WebAuthn API 访问密钥。FIDO 和 WebAuthn 均为开放的标准:

本文介绍的 Titan Security Key,并不是唯一一个硬件安全密钥。在它出现之前,YubiKey 已经受到了不少人的欢迎。另外,我们常用的银行 U 盾,也属于硬件安全密钥的一种(只不过使用了私有协议)。

越来越多的厂商和组织已经开始支持硬件安全密钥,包括 Google、Apple、阿里巴巴、华为等。

为什么需要硬件安全密钥?

目前已经有不少网站支持了双因素验证,在输入密码之后,还需要输入一个六位动态验证码。

验证码一般可以通过两种方式获取:通过短信接收,或者通过 Google 身份验证器等 App 获取(基于 RFC 6238 TOTP)。这两种方式在安全性上,都有一定的欠缺。

对于短信,手机上的 GSM 协议是一个「古老」的协议,通信内容比较容易被监听。此外,手机或 SIM 卡丢失,也会让其他人随意获取验证码:

对于基于 TOTP 的双因素验证,安全性相比短信有较大提升。但与硬件安全密钥相比,仍存在一些安全弱点:

另外,攻击者还可以通过网络钓鱼社会工程学等方式,获取临时验证码。而硬件安全密钥较难被其他人物理接触,一定程度上减轻了这些问题。

密钥忘带、丢失怎么办?

对于密钥忘带、丢失等情况,可通过准备两个或多个安全密钥的形式解决:

  • 一个挂在钥匙扣上,和钥匙一起随身携带
  • 另一个做为备份密钥,放在家中或异地保存

大多数网站都支持添加多个硬件安全密钥。下文中介绍的 Google 高级保护计划,还会强制要求用户添加至少两个硬件密钥。

关于 Titan Security Key

Titan Security Key 是来自 Google 的硬件安全密钥,由飞天诚信Yubico 代工。

根据接口和协议的不同,这款安全密钥分为三个版本:

  • 蓝牙/NFC/USB 版本
  • USB-A/NFC 版本
  • USB-C 版本

此外,Google 还提供了蓝牙/NFC/USBUSB-A/NFC 打包的版本,一次购买即可同时拥有主备两个密钥。我购买的就是这个版本:

Titan Security Key 开箱,以及包装内所有内容(两个打包的版本,包含两个安全密钥、Micro-USB 数据线、USB-A 转 USB-C 转接头)
Titan Security Key 包装及其内容(两个打包的版本)

Google 高级保护计划

Google 高级保护计划为用户账号提供了更强大的安全保护措施:

为 Google 账号开启高级保护计划后,能够获得如下方面的安全性增强:

  1. 登录 Google 账号时,必须使用硬件安全密钥进行双因素验证,原有的双因素验证(手机验证码、TOTP 动态验证码等)全部失效,无法继续使用
  2. 禁止第三方应用访问 Gmail 或 Google Drive(Apple Mail、Thunderbird 等常用邮件客户端除外)
  3. 在 Android 设备上,禁止安装 Google Play 之外的应用
  4. 如果密钥丢失或忘记密码,恢复账号需要额外的验证步骤

当然,这些安全性的提升,也会带来便利性和灵活性的降低。是否要打开 Google 高级保护计划,就要看个人取舍了。

为了避免密钥丢失导致账号无法访问,Google 要求用户至少准备两个硬件安全密钥。所以,两个打包的 Titan Security Key 套装,就成了最适合 Google 高级保护计划的硬件。

设置 Google 高级保护计划,需要添加两个安全密钥
设置 Google 高级保护计划,需要添加两个安全密钥

另外,作为 Google 的「亲儿子」,Titan Security Key 在 Google 账号中,能显示专属的图标,方便区分不同的密钥:

Google 账号页面,能够根据型号,显示 Titan Security Key 的专属图标
Google 账号页面,能够根据型号,显示 Titan Security Key 的专属图标

对于 G Suite 企业版账号,管理员还可以设置更加灵活的安全策略,例如允许或禁止特定的第三方应用(例如 Spark 邮件客户端)访问 Gmail。(当然,这样做也会一定程度上削弱 Google 账号的安全性。)

在 G Suite 管理后台中,设置允许 Spark 邮件客户端访问 Gmail
在 G Suite 管理后台中,设置允许 Spark 邮件客户端访问 Gmail

移动设备兼容性

对于不少人来说,手机、平板等移动设备,已经成为生活中必不可少的一部分。所以,是否能够方便地在移动设备上使用,也是选择硬件安全密钥的一个重要考虑因素。

Google 自家的 Android,对 Titan Security Key 的支持也是最为全面的。对于 USB、蓝牙、NFC 三种协议,Android 都能提供完整的支持。

在 Android 上使用 Titan Security Key,支持蓝牙、USB、NFC 三种模式
在 Android 上使用 Titan Security Key,支持蓝牙、USB、NFC 三种模式

从 2019 年开始,Apple 也开始在 macOS、iOS、iPadOS 上逐步支持硬件安全密钥:

对于 iPhone,除了使用闪电转 USB 相机转换器等配件,也可以直接使用 NFC 无线连接。当然,对于 iPad Pro,使用 USB-C 接口连接也是比较方便的。

用户也可以在 iPhone 和 iPad 上,通过蓝牙方式连接 Titan Security Key,但必须通过 Google Smart Lock App 连接,且只能登录 Google 账号,不支持第三方网站。

在 iPhone 上使用 Titan Security Key,支持 USB 和 NFC
在 iPhone 上使用 Titan Security Key,支持 USB 和 NFC

顺便提一下,在刚刚结束的 WWDC20 上,Apple 还为 Safari 带来了基于 WebAuthn API 的 Face ID/Touch ID 认证功能。对于没有硬件安全密钥的用户,今后也可以通过指纹或人脸识别,实现更方便的双因素验证了。

在第三方服务中使用:1Password、Dropbox 等

由于 FIDO 和 WebAuthn 是一套开放的标准,目前已经有不少的互联网服务,支持通过硬件安全密钥进行双因素验证。

通过如下链接,可以了解到各个互联网服务对双因素验证的支持情况:

经过测试,大部分网站都能完美兼容 Titan Security Key,包括 WordPress.com、Dropbox、Twitter 等:

使用 Titan Security Key 登录 Dropbox
使用 Titan Security Key 登录 Dropbox

常用密码管理器的网页版,例如 1PasswordBitwarden,也能通过 Titan Security Key 进行双因素验证:

使用 Titan Security Key 登录网页版 1Password
使用 Titan Security Key 登录网页版 1Password

在我的测试中,只有 Microsoft 账号(OneDrive、Office 365、Outlook 等)不兼容 Titan Security Key。

Microsoft 账号利用硬件安全密钥的方式,与其他网站不太一样:直接利用硬件安全密钥进行免密码登录,而不是双因素验证。与此同时,Microsoft 也对硬件安全密钥提出了更多的要求,例如需要支持 FIDO2 标准等:

而 Titan Security Key 不支持 FIDO2,所以也就无法用于登录 Microsoft 账号了:

使用 Titan Security Key 无法登录 Microsoft 账号
使用 Titan Security Key 无法登录 Microsoft 账号

同时,大部分客户端软件,例如 macOS 版本的 1Password,以及 Dropbox 的 iOS App,都不支持硬件安全密钥。开源的 KeePass 密码管理器,也没有支持 Titan Security Key 的插件:

在 Dropbox iOS App 上,无法使用 Titan Security Key 进行登录
在 Dropbox iOS App 上,无法使用 Titan Security Key 进行登录

高级玩法

SSH

OpenSSH 8.2 带来了 FIDO/U2F 支持,可选择 ecdsa-sked25519-sk 两种密钥类型,实现双因素验证。Titan Security Key 只支持 ecdsa-sk

对于 macOS,可通过 Homebrew 安装最新版的 OpenSSH(brew install openssh)。

安装新版 OpenSSH 后,使用 ssh-keygen -t ecdsa-sk 生成密钥对,并上传到服务器上,即可实现双因素验证。后续登录服务器时,必须连接硬件安全密钥,才能正常登录。

# 生成密钥对
$ ssh-keygen -t ecdsa-sk -f ./id_ecdsa_sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./id_ecdsa_sk
Your public key has been saved in ./id_ecdsa_sk.pub

# 登录服务器,必须连接硬件安全密钥,才能正常登录
$ ssh -i ./id_ecdsa_sk  blanboom@172.16.15.12
Confirm user presence for key ECDSA-SK SHA256:XXX
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-33-generic x86_64)
blanboom@blanboom-ubuntuvm:~$

Windows Hello

在 2019 年,Windows Hello 也开始支持硬件安全密钥。但实测不兼容 Titan Security Key:

Windows Hello 不支持 Titan Security Key
Windows Hello 不支持 Titan Security Key

这是因为 Windows Hello 和 Microsoft 账户一样,也必须使用符合要求的 FIDO2 密钥,才能正常登录。具体请参考前文中关于 Microsoft 账户的内容。

Linux 与 macOS 登录

在 Linux 上设置 Titan Security Key,步骤会稍微麻烦一点:需要安装 libpam-u2f,并修改配置文件。具体配置方法请参考如下文章:

经测试,Titan Security Key 能够完美地在 Ubuntu 20.04 LTS 上运行。无论是首次登录,还是使用 sudo 命令,都能正常兼容。

在 Ubuntu 上成功设置 Titan Security Key
在 Ubuntu 上成功设置 Titan Security Key

macOS 也可以通过 Titan Security Key 进行双因素验证,设置步骤和 Linux 大同小异:

但是,对于启用了 FileVault 全盘加密的 Mac,开机首次登录时并没有真正进入 macOS,所以不方便使用 Titan Security Key。(一种变通的解决方法,是先对硬盘进行加密,设置一个独立的加密密码,再安装 macOS。但开机时需要多输入一次硬盘加密密码。)

购买建议

目前,YubiKey 是市面上最流行的硬件安全密钥。那么,在 YubiKey 和 Titan Security Key 之间,我们应该如何挑选最适合自己的硬件安全密钥?

先来看下 Titan Security Key 的优点:

  1. 来自 Google,内置由 Google 设计的固件(不过闭源固件对一部分人来说并不是优点)
  2. 部分型号支持蓝牙,可通过蓝牙连接移动设备(但在 iOS 上仅能通过 Google Smart Lock App 登录 Google 服务,不支持登录第三方服务)
  3. 提供两个密钥打包的套装,只需要购买一份套装,就可以方便地开启 Google 高级保护计划
  4. 在 Google 账号中添加 Titan Security Key,能够为不同型号的密钥显示不同的图标

YubiKey 5 系列 的特色如下:

  1. 具有更丰富的型号。其中,YubiKey 5Ci 拥有 USB-C 和 Lightning 双接口,同时兼容 iPhone、iPad,以及新款的电脑和 Android 设备,无需转接
  2. 支持最新的 FIDO2 标准
  3. 能够模拟键盘,自动输入密码或 TOTP 动态验证码。即使网站不支持硬件安全密钥,也能通过 YubiKey 登录
  4. 支持 PGP Smartcard,配合 GPG 能实现更多功能
  5. 拥有更丰富的生态。例如 KeePass 密码管理器有 KeeChallenge 插件,安装后即可支持 Yubikey

所以,在选购硬件安全密钥时,如果仅仅是为了使用 Google 高级保护计划,来自 Google 的 Titan Security Key 是最合适的选择;但如果想将密钥用在更多不同的场景中,功能丰富的 YubiKey 5 更值得购买。

推荐阅读 The Verge 的这篇文章。作者通过对比市面上常见的硬件安全密钥,给出了详细的购买建议:


本文同时发布于少数派,欢迎关注:

]]>
https://blanboom.org/2020/titan/feed/ 0 1939
《信息素养通识教程》学习笔记 https://blanboom.org/2020/information-literacy-mooc/ https://blanboom.org/2020/information-literacy-mooc/#respond Sat, 20 Jun 2020 09:27:11 +0000 https://blanboom.org/?p=1904

前段时间,我学习了中国大学 MOOC 上的信息素养通识教程:数字化生存的必修课。在经过老师的同意后,我将自己的课程作业、讨论区发布的帖子整理到个人博客上,便于后续进行回顾。

第一周作业:请谈谈你对本慕课学习内容的看法和建议

我们的身边充斥着各种各样的信息,希望能通过本课程,学习如何高效地检索信息、辨别信息、利用信息,从而更好地服务于自己的工作和生活。

第二周作业:请列举3个你在日常生活中需要进行信息检索的情景

  1. 购买商品时,获取不同商品的规格、性能、用户评价等,选择出合适的商品
  2. 写作时通过引用其他人的观点,来进一步证实自己的观点
  3. 进行产品设计时,通过检索文献、专利等,参考其他人的设计方案

第三周作业:请谈谈你对信息检索的选择、评价和维权3个原则的看法,除了这3个原则,你认为信息检索时还需要遵循哪些原则呢?

遵循这三个原则,能够保证在符合道德和法律的情况下,高效、准确地检索信息。

对于很多人来说,这三条原则都是有用的,例如选择原则,通过选择合理的工具和方法,能够检索到更多信息、或者更加精准地检索到信息;评价原则,能够让人做到不轻易接受错误,有害信息;维权原则,有利于使人合法地获取信息。

在新闻里面,经常会看到网络诈骗的案例,或者是一些人通过非法爬虫、非法交易等方式获取信息导致犯罪,其实都是不遵循上述原则而造成的。

个人认为信息检索还需要考虑时间成本和经济成本,在满足需求的同时,尽可能减少上述成本。

第四周作业:你认为哪种网络信息检索工具最给力?请举例说明

在不同的场景下,最给力的网络信息检索工具不一定相同。

就像我之前在这个讨论区中评论的一样,我会根据不同的需求,选择不同的检索工具:

  1. 日常生活中通过通用的搜索引擎进行信息检索,例如 Google、百度等
  2. 对于专利、文献等,使用 Google Scholar、Google Patents 等专用搜索工具,或在各个文献数据库中进行检索
  3. 对于企业相关信息,使用国家企业信用信息公示系统、天眼查等工具查询
  4. 对于通用的商品信息,会在商品官网、淘宝京东等电商平台、以及什么值得买等相关社区查询
  5. 对于带有无线功能的电子产品,想要了解其参数、拆机图、说明书、国内上市情况等,会在国家无线电检测中心、fccid.io 等网站上,查找其在不同国家相关部门中登记的资料
  6. 对于电子元器件、芯片等资料,会在官网、datasheet 检索网站、PCB封装库共享汪中,搜索对应元器件使用方面的知识
  7. 对于系统性的知识,需要查阅书籍获取的,会先在图书馆网站、豆瓣等平台查询,然后去图书馆借阅或在网上购买
  8. 对于时效性较高的信息,例如正在发生的事件,会在新闻搜索引擎、微博等平台搜索

第六周作业:有否利用图书馆,如有请分享你的利用心得,如否请说明原因

有利用图书馆,我在利用图书馆时,用到了如下几项图书馆提供的服务:

  1. 使用图书馆提供的检索系统检索自己想读的书籍
  2. 进入图书馆,按照图书馆的中图法分类,找到指定学科书籍存放的位置,并浏览相关书籍,发现值得阅读的书籍
  3. 使用图书馆的文献传递功能找到自己需要的文章。例如之前有一次我想阅读《无线电》杂志比较旧的一期上的一篇文章,但是图书馆没有馆藏,就用了图书馆的文献传递功能,将这篇文章的全文电子版发送到自己的邮箱。
  4. 使用图书馆的荐购服务,推荐图书馆购买自己关注的学科中,比较重要但没有馆藏的几本书

第七周作业:你对哪些百科知识感兴趣?你是怎么获取这些百科知识的?

对科技、历史、计算机科学、电子技术等知识感兴趣。

  1. 百科全书中的相关词条
  2. 百度百科、维基百科中的相关词条(除了词条本身的内容,词条后面的参考文献也比较重要,能从参考文献中,找到更权威、更全面的论文和书籍)
  3. 在图书馆、文献数据库中查找相关学科的文献和书籍
  4. 使用通用搜索引擎、视频网站的搜索功能,查找相关资源。虽然获取到的内容不一定权威,但根据我的经验,只要对正确辨别信息的真伪、信息来源等,获取到的知识还是很有帮助的。

第八周作业:获取考研信息的工具与途径有哪些?你认为哪一种最给力?为什么?

1. 官方机构:

  • 教育部
  • 中国学位与研究生教育信息网
  • 中国研究生招生信息网
  • 报考机构官方网站

2. 网络资源:

  • 中国考研网
  • 考研帮
  • 知乎、豆瓣、果壳等论坛

3. 专业辅导机构

4. 导师、学长

每种工具都有自己的特色,例如官方机构能获取到更权威的信息;通过论坛、导师、学长,可以了解到更加细节的一些信息,例如在学校的生活学习体验;而通过专业辅导机构,能给获得一些个性化的指导与建议。

对于我个人而言,首选通过官方机构获取相关信息。但也会结合其他途径来获取,但会对获取到的信息进行鉴别和判断。

第九周作业:小麦在招聘网站上找到一份心仪的工作,工作环境好,待遇也高,这么好的条件反而让他心里有点不安,怎么核实这是真实的招聘信息呢?

  1. 核实招聘网站是否为官方网站(通过工信部网站备案系统、公安备案系统等合适,同时通过国家企业信用信息公示系统查询招聘网站对应公司的信息)
  2. 核实发布招聘信息的公司是否为合法注册的公司(通过国家企业信用信息公示系统等系统查找,也可以通过第三方网站,例如天眼查来查找)
  3. 核实发布的招聘信息中,公司地址、联系方式等内容,是否与该公司相符(通过公司官网、国家企业信用信息公示系统等核实)

第十周作业:在日常的生活、学习和工作中,你一般需要哪些统计信息?如何获取?

选择在哪个城市上学、工作和生活时,我会了解一个城市的天气和气候信息,来获取这个城市是否适合自己生活。

中国气象数据网是中国气象局官方成立的气象数据共享平台,通过此平台可以获得丰富的基础气象数据:https://data.cma.cn

第十一周作业:小李在路上见到一辆汽车的商标是一只站立的狮子,想了解它是什么品牌?是哪家汽车公司生产的?

由于该商标是图像,不方便用关键字检索。

但是国内的商标是由类别的。一种检索方法,是通过中国商标网,或者其他商业机构、政府机构、服务机构、专业组织的商标检索网站,按照汽车的类别,依次浏览所有的图形商标。

当然也可以结合其他工具,例如搜索引擎的以图搜图功能,先进行初步的查找。然后再利用商标检索网站检索进行进一步的核实。

第十二周作业:你有哪些个人信息安全与保护方面的心得体会?请与大家分享

  1. 不轻易、透露手机号、身份证号的个人信息
  2. 快递单丢弃前,覆盖上面的姓名、快递单号、地址、条形码等信息
  3. 分享照片前,清除可能包含地理位置的 EXIF 信息
  4. 不安装来历不明的软件
  5. 通过操作系统自带的权限管理功能,或者第三方权限管理工具,仅给软件运行所需的必要权限
  6. 通过 Bitwarden 密码管理工具管理密码,并为每个网站单独生成一个强密码
  7. 必要时使用 GPG 等工具对文件和邮件进行加密
  8. 为移动设备设置强度较高的锁屏密码(个人习惯设置 22 位字母数字混合的密码,即使是在手机上),打开操作系统自带的全盘加密功能(Windows 下的 BitLocker,macOS 下的 FileVault,Linux 下的 dm-crypt,以及 Android 自带的加密功能),并打开远程擦除数据、以及连续输错多次密码后自动清空数据的功能,避免设备被盗或丢失造成个人信息泄漏
  9. 谨慎使用网盘、云笔记等云服务,如有必要,需要先仔细阅读相关工具的隐私政策,对相关服务设置更强的密码,并对数据进行本地加密(例如使用网盘时,通过 VeraCrypt 先对数据进行一次本地加密;使用云笔记软件时,可考虑使用 DEVONthink,能在笔记上传服务器之前,先对笔记进行一次本地加密;必要时将数据存放在自己的 NAS 中;非常敏感的数据保存在不能联网的环境中)
  10. 尽量访问 HTTPS 网站(例如使用 HTTPS Everywhere 浏览器扩展),并检查证书状态

第十三周作业:请举例说明你认为数字时代人们应具备哪些信息能力

以找工作为例,来说明这些信息能力的作用:

  1. 信息发现能力:能给发现更多工作机会
  2. 信息检索能力:能给从大量的工作机会中,查找到适合自己(能力匹配、薪资合适、福利待遇工作强度等符合个人预期)的工作
  3. 信息组织能力:分类整理查找的工作机会信息,例如哪些工作需要现在就投简历;哪些工作需要再准备一段时间后投简历;哪些工作最适合自己,需要优先考虑;哪些工作做为备选方案等
  4. 信息分析能力:分析职位中对能力、个人条件相关的要求,有针对性地学习和准备面试
  5. 信息评价能力:鉴别职位信息是否为虚假信息,避免上当受骗

第十四周作业:请运用所学的数字素养、计算机素养、网络素养与数据素养等相关知识,谈谈互联网的利与弊

互联网的出现,使人们能给更加方便地接触信息,这是利。

互联网也让每个人身边充斥的大量的信息,一部分信息是无用信息,接触这些信息只会消耗大量时间和精力;一部分信息是有用的,但是由于量非常大,难以整理和检索,最终无法合理利用;还有一些信息完全是谣言、欺诈类信息等有害信息。甚至互联网的出现,也使得个人信息的泄漏变得更加容易。

但是,通过提升自己的数字素养、计算机素养、网络素养、数据素养等,完全可以更加合理的利用互联网,让这些「弊」转变为「利」。例如更好地发现适合自己的信息,而不是盲目随意地接受社交网站、新闻网站主动推送的信息;合理的辨别和理解信息,避免被虚假有害信息危害;合理地整理和利用信息,例如使用笔记软件、思维导图等将这些信息进行整理,形成个人的知识体系;以及合理的输出信息,例如参与知识社区的回答、参数互联网百科的编辑、多通过博客等形式输出自己的知识、经验、见解等,既能打造个人品牌,提升个人知名度,也能为互联网作做出自己的贡献。

第十五周作业:请结合实际,与大家分享一下你适应信息社会的方式方法

1. 对于社交网站、新闻网站等,会主动有大量信息主动推送给用户,很容易造成信息过载,我的做法有:

  • 对于微博、抖音、QQ 空间、朋友圈等社交网站,我只选择一种社交网站来使用
  • 不使用根据算法智能推荐的新闻客户端,也不使用各大门户网站的新闻客户端,而是选择通过 RSS 主动订阅自己感兴趣的内容
  • 对于微博,不使用官方客户端(官方客户端时间线乱序,同时有大量的相关推荐,很容易让用户反复想着刷微博),使用微博国际版等时间线正常的客户端。同时不看微博热搜等内容

如下两篇文章值得我们参考:

2. 学会整理信息,形成个人的知识体系。

3. 对于整理好的信息,定期回顾和重新整理。

4. 学会整理和分享,为互联网做出自己的贡献。

5. 提高信息安全意识,例如不轻易泄漏个人信息,使用密码管理工具并定期修改密码等

讨论区:关于「中文元搜索引擎」的内容有点过时

在《4.7 扩展学习——搜索引擎的前世今生》中,提到了中文元搜索引擎「万纬搜索」。

对这个元搜索引擎比较感兴趣,就搜索了一下相关信息,发现这篇论文里面有介绍:

不过这是一篇 2003 年的论文,文章中提到了万纬搜索的域名和公司名称,但发现这个域名对应的已经是一个垃圾站。在 archive.org 上查找网站历史存档,发现网站已经于早已停止服务。

另外目前比较流行的一个元搜索引擎是 searx,能同时在 70 多个搜索引擎中进行搜索,并将搜索结果整合显示。

searx 是一个开源软件,可以在自己电脑或服务器上搭建,也可以使用网上其他人搭建的实例:

讨论区:装手机APP的时候会要求访问手机通讯录,遇到这种情况该怎么办?

目前国内 Android 应用的审核机制不严,但是相关政策法规正在进一步完善。现阶段我们可以采用如下手段:

  • 使用部分工具,给相关 APP 空的信息授权,或授权随机数据
  • 新版 MIUI 等国内 Android 定制版操作系统,已经能实现空信息授权,可考虑升级并使用
  • 如果有条件,可先使用 iOS,iOS App Store 的审核条件,要求不给权限时,APP 基本功能仍然可用
  • 目前相关部门已开通关于 App 过度收集个人信息的专项举报通道,可在微信公众号「App个人信息举报」中进行举报(参考链接:https://www.xinhuanet.com/politics/2019-09/20/c_1125020624.htm)

讨论区:微信朋友圈的各种测试会软件会盗走用户个人信息吗?

会盗走个人信息。参考链接:

而且最关键的,这些测试大多没有心理学依据,通过这些测试获取到的信息,也大多数据无用信息,要学会进行辨别。参考链接:

讨论区:在线学习有哪些免费学习的网站

本站就是一个。还有各种 MOOC 网站,例如 Coursera 等。

另外推荐一个我新发现的网站,叫 MasterClass,里面涉及写作、园艺、钢琴等内容,由相关领域有经验的人士制作,课程质量较高。

讨论区:你认为“XX百科”类网站提供的百科信息靠谱吗?

互联网百科人人可编辑,所以在一方面,可能会被恶意编辑,或者被添加上不可靠的信息;但另一方面,百科内容中的错误又能被及时修改,这是纸质百科全书无法做到的。

2005 年来自《自然》的一份研究认为,维基百科和大英百科全书科学类条目的水准已经十分接近,严重错误率也基本相同。

参考链接:

所以,无论是纸质百科全书,还是互联网百科,都有内容出错的可能性,都不属于严肃的学术著作。但是互联网百科一般在末尾会附上参考文献,包括图书、论文、新闻链接等。对于我们来说,最好还是把百科里面的内容当做一份知识提纲,如果想要进一步了解相关领域的内容,建议从百科后面附带的参考文献入手。

另外,互联网百科里,各个词条相互链接,很容易造成本来想阅读一个词条,结果最后不停地阅读各种相关词条,占用了大量时间。所以在阅读互联网百科时,也要做到「信息节食」。

讨论区:请教关于使用公共手机充电桩-如关机状态下充电是否可避免风险?

因手机而异。在关机状态充电,部分手机 USB 协议还在工作,如果有安全漏洞,还是有数据被窃取的风险。所以还是尽量避免使用公共充电器。

一般 USB 数据电缆里有两根电源线,和两根或者若干根用于传输数据的线。可考虑使用或自制只有两根电源线的 USB 充电线,来阻止数据传输;或者购买专门的转接头来屏蔽数据传输。

讨论区:想求医问药的就不能上百度找,就全是莆田系医院广告

对于非医疗专业人士,想要获取比较靠谱的医疗类信息,推荐这两个网站:


备注:

]]>
https://blanboom.org/2020/information-literacy-mooc/feed/ 0 1904
命令行、Vim、版本控制…… 这个课程教你使用强大的工具 https://blanboom.org/2020/missing-semester/ https://blanboom.org/2020/missing-semester/#respond Sat, 20 Jun 2020 08:50:18 +0000 https://blanboom.org/?p=1898

命令行、Shell 脚本、纯文本编辑器(Vim 等)、版本控制(Git)…… 无论是否为计算机行业从业者,合理使用这些工具,都能够大幅度提高使用电脑的效率。

但是,不少人应该和之前的我一样,对这些工具有过一定的了解,也会简单使用其中的一部分功能。但是,想要系统、全面地学习这些工具,却又觉得无从下手。

而来自 MIT 的 The Missing Semester of Your CS Education 课程(下文中简称 missing-semester),能够帮助我们更好地了解和使用这些工具。

本文首发于少数派,欢迎关注:

关于 missing-semester 课程

对于传统的计算机科学课程,通常会介绍操作系统、编程语言等基础课程,但对于工具的使用,却很少有课程进行介绍。相关课程的缺失,可能会导致学生们浪费大量的时间在无用的重复劳动上,甚至会造成数据丢失等后果。

所以,MIT 的 AnishJonJose,在 2019 年推出了名为 Hacker Tools 的一系列讲座,介绍了命令行、Shell 脚本、数据处理、文本编辑器、版本控制、软件包管理器等常用工具的使用,并介绍了备份、自动化、安全、系统的个性化设置等方面的基础知识。

该讲座推出后,受到了同学们的欢迎,并获得了许多有用的意见和建议。所以,在 2020 年,基于 Hacker Tools 课程进行优化,Anish、Jose 和 Jon 推出了全新的 The Missing Semester of Your CS Education 课程。

虽然该课程面向。但我认为,只要对电脑软件感兴趣、想要通过工具自动化自己的工作与生活、提升使用电脑的效率,都可以尝试学习一下课程中的内容。

课程内容、如何学习

课程提供英文版,和国内社区翻译的中文版。可根据自己的喜好来选择合适的版本:

课程目录如下:

The Missing Semester of Your CS Education 课程目录
The Missing Semester of Your CS Education 课程目录

如果自己是计算机科学、电子、通信专业学生,或者从事计算机相关工作,建议学习全部内容。

而如果自己不需要从事或学习软件开发、编程相关内容,则可以忽略「1/23: 调试及性能分析」、「1/27: 元编程」两部分内容。

]]>
https://blanboom.org/2020/missing-semester/feed/ 0 1898
从 Evernote 到 Notion…… 我的笔记软件使用经历 https://blanboom.org/2020/evernote-to-notion/ https://blanboom.org/2020/evernote-to-notion/#respond Sat, 20 Jun 2020 08:41:21 +0000 https://blanboom.org/?p=1889 我的 Notion 首页

最近,我刚刚把个人笔记迁移到 Notion。希望能通过这篇文章,分享一下我的笔记软件使用经历。

Evernote:我使用的第一个笔记软件

在我上高中时(2010 年左右),喜欢安装和折腾各种软件,刚开始使用 Google Reader,最常阅读的几个网站是 cnBeta小众软件善用佳软電腦玩物

有一段时间,我在 cnBeta 等多个网站上看到了「为知笔记」的发布:

同时,在 Google Reader 上,我发现月光博客的这篇文章,也受到了不少人的喜爱(怀念当时 Google Reader 的社交功能,帮我发现了不少订阅源):

通过这些文章,我第一次听说了「个人知识管理」这个新鲜事物,并迅速对其产生了兴趣。

接下来,我阅读了不少关于笔记软件的文章,体验了 OneNote、Wiz、Evernote 等工具。由于 Evernote 跨平台支持良好,最终选择了 Evernote。(除了 Windows,那时候我还在用 Kubuntu,只有 Evernote 在 Linux 下有兼容的第三方客户端)

随后,我就一直使用 Evernote,直到大学一年级结束……

开始使用 Mac OS X 和 DEVONthink

上大学二年级时,我开始使用 Mac OS X(也就是现在的 macOS),并开始关注 Mac 上有哪些优秀的工具。在这个过程中,我发现了功能强大的 DEVONthink

DEVONthink 是一个大而全的笔记/文档整理软件,最大特色在于能够提取文档和笔记中的关键词,并建立笔记之间的关联。同时,DEVONthink 在安全和隐私方面做得不错,支持文档在本地加密后,再与云服务同步。在体验 DEVONthink 后,我就开始将其做为自己的笔记软件、文档整理软件、Markdown 编辑器,一直用到了现在。

尤其是在拥有了自己的 NAS 之后,我开始使用 NAS 搭建 WebDAV 服务,来进行 DEVONthink 笔记的同步。从而摆脱了其他云服务在容量、流量、同步速度、安全性等方面的限制。

Notion: 从拒绝到接受

在我第一次接触 Notion 时,我觉得 Notion 已经是最接近我理想中的笔记软件了。尤其是这些功能吸引了我:

  • 漂亮的 UI,能够设置封面图片和图标
  • 具有较为强大的协作与分享能力
  • 支持 Toggle List
    一定程度上取代 OmniOutliner,用于完成复杂的、有层级关系的笔记
  • 强大的数据库功能,支持多种视图
    例如管理待办事项,可以使用看板视图;整理图片素材,可以用 Gallery 视图。
    无论是什么类型的笔记,都能通过合适的视图呈现

不过,Notion 的这几个缺陷,是我一直拒绝 Notion 的原因:

  • 原生 App:
    Notion 的 App 大量使用 Web 技术,不支持 Safari ExtensionShare Extension、跟随系统的 Dark ModeAppleScript 自动化、Spotlight 整合、QuickLook 等 macOS 特有功能
  • 安全与隐私:
    数据全部保存在云端,在安全性和隐私方面没有 DEVONthink 出色
  • 笔记同步:
    笔记无法与本地同步,没有本地副本,也不方便通过 Time Machine 进行本地备份
  • 格式兼容性:
    暂时没有其他笔记软件兼容 Notion 的导出格式;如果不想用 Notion 了,难以迁移到其他工具

但是,Notion 的漂亮的界面,和 Database 等独特的功能,又一直吸引着我……. 终于,在 2020 年,我决定将不涉及个人隐私的笔记,迁移到 Notion 上。其余笔记继续保存在 DEVONthink 中。同时,做好对 Notion 笔记内容的定期导出备份。

目前,我在 Notion 中的笔记按照如下方式分类:

我的 Notion 首页
我的 Notion 分类目录
  • Inbox
    收件箱,临时存放待整理的笔记
  • Home
    个人 Dashboard。具有待办事项性质的笔记存放于此处
  • Projects
    个人项目等
  • Knowledge Base
    知识库,整理知识类内容

关于分享

从大学到现在,自己在空闲时间阅读了不少内容,并整理到自己的笔记本中。有时候我会想,如果这些笔记能公开分享出去,或许能够帮到更多人,应该是一件更有意义的事情。

于是,我就在博客上通过「每月收藏与分享」的一系列文章,整理和分享自己每个月阅读的内容:

后来,我还写了一个 AppleScript 脚本,用半自动的方式整理和发布阅读的文章。

但是,以月为单位的分享,还是过于零散。我想以一种更加系统的方式来整理和分享。曾经考虑过搭建个人 Wiki、使用 GitBook 制作电子书等方式,最终决定使用 Awesome List。

Awesome List 通过列表和链接的形式,整理特定领域的知识,一般托管在 GitHub 上。目前,我已经整理了科技类 DIY、家庭网络两个 Awesome List:

今后,我还会将个人笔记中更多的内容,在确认没有版权问题后,通过 Awesome List 整理到 GitHub 上。

小结

从 Evernote,到 DEVONthink,再到现在的 Notion + DEVONthink + GitHub (Awesome List),我的笔记工具经历了多次变化。

听到过不少人说,不要随便更换自己的笔记软件,否则大量的精力浪费在折腾软件上…… 但是,对我来说,这几次更换工具,迁移和整理笔记的过程,恰好又督促我更加完整地重温和回顾自己的笔记,并让我对如何整理笔记、分享笔记有了更多的思考。

]]>
https://blanboom.org/2020/evernote-to-notion/feed/ 0 1889
将个人收藏的科技 DIY 资料整理到了 GitHub 上 https://blanboom.org/2020/awesome-technical-diy/ https://blanboom.org/2020/awesome-technical-diy/#comments Sun, 22 Mar 2020 13:49:18 +0000 https://blanboom.org/?p=1852

由于自己对科技类 DIY 感兴趣,最近几年,我的笔记软件中收藏了不少关于科技 DIY、嵌入式开发等资料。最近在整理笔记的时候,我觉得将这些内容公开分享出去,或许能给更多人带来帮助。

所以我在 GitHub 中创建了一个 Awesome List,用于整理科技类 DIY 的资源,包括工具、项目、网站与论坛等。今后与科技类 DIY、嵌入式开发相关的内容,也会整理到这个 repo 中:

]]>
https://blanboom.org/2020/awesome-technical-diy/feed/ 1 1852
如何更好地清理 Time Machine 备份 https://blanboom.org/2020/timemachine-cleanup/ https://blanboom.org/2020/timemachine-cleanup/#respond Sat, 07 Mar 2020 13:41:47 +0000 https://blanboom.org/?p=1838

Time Machine 是 macOS 自带的一个备份工具,能够自动备份系统中的文件,并保留各个文件的历史版本。

在备份磁盘空间不足时,Time Machine 能够自动清理旧备份。但是部分场景下,仍有手动清理备份的需求,例如:

  1. 一个硬盘被多台 Mac 使用,清理一台电脑的旧备份,为另一台电脑腾出备份空间
  2. 释放硬盘空间,用于保存其他文件
  3. 换用小容量硬盘,例如从 HDD 更换为 SSD
  4. 删除备份中不重要的大文件(例如 Stram 游戏库、虚拟机、iOS 模拟器等),为个人文档等重要文件留出更多备份空间,从而保留重要文件的更多历史版本

在我的 NAS 上,由于之前没有设置空间配额,Time Machine 备份占用了大量空间,影响其他文件的存放。于是,我开始了解如何进行 Time Machine 的清理。

tmutil 命令行工具

macOS 自带 tmutil 工具,能够实现查看备份、创建备份、删除备份、比较备份等功能。

其中,tmutil listbackups 命令可以显示 Time Machine 中的所有备份:

$ tmutil listbackups
/Volumes/时间机器备份/Backups.backupdb/blanboom-studio/2019-12-21-200941
/Volumes/时间机器备份/Backups.backupdb/blanboom-studio/2020-01-05-221538
/Volumes/时间机器备份/Backups.backupdb/blanboom-studio/2020-01-19-203155

tmutil delete 命令则可以删除 Time Machine 中的指定备份:

$ sudo tmutil delete /Volumes/时间机器备份/Backups.backupdb/blanboom-studio/2019-02-01-211852 
Deleting: /Volumes/时间机器备份/Backups.backupdb/blanboom-studio/2019-02-01-211852
Deleted (427.2M): /Volumes/时间机器备份/Backups.backupdb/blanboom-studio/2019-02-01-211852

有了这两条命令,我们可以方便地在 shell 脚本中使用,进行批量删除备份的操作。

使用脚本批量删除旧备份

在上网搜索的过程中,我发现已经有人完成了批量删除 Time Machine 备份的脚本,下载该脚本,修改文件中的相关参数,即可实现对 Time Machine 的批量清理:

我对这个脚本进行了简单的修改,方便在使用时直接指定参数。脚本可在如下两个链接中下载:

使用时,只需要运行 tmcleanup.sh,后面依次跟上 Time Machine 磁盘挂载路径、计算机名称、要保留的备份的天数即可。例如下面的命令,能够实现清理 /Volumes/时间机器备份/Backups.backupdb 路径下,计算机 blanboom-studio30 天前的所有备份:

$ sudo ./tmcleanup.sh /Volumes/时间机器备份/Backups.backupdb blanboom-studio 30

使用脚本删除 50% 的旧备份

Time Machine 的一大特色功能,是智能保留备份的历史版本。对于近期的备份,保留尽可能多的版本,而对于早期备份,只保留每月版本:

Time Machine 的备份版本保留策略
Time Machine 的备份版本保留策略

但是,Time Machine 只能做到保留旧备份的每周备份。如果想要实现保留一年前的每两周备份、或者保留一年前的每月备份,Time Machine 就无能为力了。

上文的脚本经过简单的修改,就可以在删除旧备份时,每两条备份中只删除一条,而不是全部删除。这样就实现了保留 50% 的旧备份。

当然,也可以根据自己的需求修改脚本或组合使用,实现保留 25%,或者保留 75% 的旧备份。

修改后的脚本也已经上传到我的 GitHub 仓库,使用上文链接中的 tmcleanup_50percent.sh,即可实现清除 50% 的旧备份:

# 删除三个月前 50% 的备份(保留三个月前每两周备份)
$ sudo ./tmcleanup.sh /Volumes/时间机器备份/Backups.backupdb blanboom-studio 90

# 连续两次运行脚本,实现删除一年前 75% 的备份(保留一年前的每月备份)
$ sudo ./tmcleanup.sh /Volumes/时间机器备份/Backups.backupdb blanboom-studio 365
$ sudo ./tmcleanup.sh /Volumes/时间机器备份/Backups.backupdb blanboom-studio 365

使用 BackupLoupe 深入分析 Time Machine 空间占用情况

上述脚本能够做到方便地删除旧备份。但是,想要更加深入地分析 Time Machine 的空间占用情况,进行针对性的清理,就要用到 BackupLoupe 了:

BackupLoupe 可以实现如下两点功能:

  1. 分析哪些备份占用空间较大,从而做到删除占用空间大的备份
  2. 分析备份中,哪些文件和目录占用空间大,从而做到删除备份中占用空间大的文件(例如 Steam 游戏库、大型 App、虚拟机、iOS 模拟器、视频文件等)

通过针对性地删除占用备份中不重要的大文件,可以腾出空间让 Time Machine 保存重要文件(例如个人文档、照片等)的更多历史版本,从而更充分地利用 Time Machine 存储空间。

BackupLoupe 的使用也很简单,打开 BackupLoupe,建立索引后,就可以看到每一个备份、以及备份中的每个目录的空间占用情况:

BackupLoupe 中,能够显示所有历史备份的占用空间
BackupLoupe 中,能够显示所有历史备份的占用空间

不过 BackupLoupe 本身只提供分析功能,并没有自带清理功能。关于如何清理备份中指定的文件或目录,可参考这篇文章:


备注:

]]>
https://blanboom.org/2020/timemachine-cleanup/feed/ 0 1838
这个假期,我创建了一个关于家庭网络的 Awesome List https://blanboom.org/2020/awesome-home-networking-cn/ https://blanboom.org/2020/awesome-home-networking-cn/#respond Tue, 03 Mar 2020 13:14:50 +0000 https://blanboom.org/?p=1827

这个假期,由于疫情的原因,在家的时间有点长。到了 2 月 29 日才返回工作地。在家的这段时间,我完成了一个关于家庭网络的 Awesome List,用于整理与家庭网络相关的知识:

在本文中,我将对这份 Awesome List 进行一个简要的介绍,并谈一谈我的网络设备折腾经历。

Awesome List 是什么

Awesome List 通过列表的形式,来整理特定领域的知识。大部分 Awesome List 托管在 GitHub 等平台上,参与者们可以通过创建 Pull Request 等形式,共同完善 Awesome List。

目前 GitHub 上的 Awesome List 以及涉及到了各个领域,从 macOS AppsPython 编程语言,到精灵宝可梦游戏,再到食物与烹饪……

我的网络设备折腾经历

在介绍我为什么要创建这份 Awesome List 之前,先来简单谈一谈我的网络设备折腾经历。

初次接触 OpenWrt: 华为 HG255D

在大学期间,为了能在学校宿舍用上 Wi-Fi,我购买了华为 HG255D。

华为 HG255D 本身是运营商提供的家庭网关,因为支持 OpenWrt,且价格低廉,所以在当时收到了不少人的喜爱。

购买 HG255D,使我对 OpenWrt 有了初次的接触,并熟悉了 OpenWrt 的基本操作,和软件包管理系统。我还尝试了修改了学长的一个 802.1x 认证程序,增加指定网卡的参数,并编译使其运行 HG255D 上,从而使这台路由器能够接入校园网:

进一步熟悉 OpenWrt: WrtNode 开发板

同样是在大学期间,我制作了一个鱼菜共生系统,并为其增接入物联网公众平台,实现数据的收集与统计,水泵、气泵、补光灯的远程控制,自动发微博等功能。

我使用了一块 WrtNode 开发板实现网络连接、数据收发等功能,同时使用了一块 Arduino 开发板实现传感器的连接、继电器等器件的控制。

其中 WrtNode 运行有 OpenWrt 操作系统,为了实现 WrtNode 与 Arduino 之间的通信,我尝试让 Arduino Yún 上的 cpu-mcu-bridge 在 WrtNode 上运行。在这个过程中,我学会了如何编译定制 OpenWrt。

体验带有 NAS 功能的路由器:RT1900ac

毕业后,有了自己的房间和宽带,我也用上了 Synology RT1900ac

选择这个路由器,是因为我对 Synology 的 NAS 感兴趣,但又觉得自己租房没必要使用 NAS,而 RT1900ac 刚好有着 Synology NAS 的一部分网络存储功能。

但购买之后,却发现其网络存储功能与 NAS 相比还差了不少,为了充分发挥其功能,我又开始了对 RT1900ac 的折腾:

尝试软路由

在有了 NAS 之后,我又开始了对软路由的折腾。尝试在 NAS 上通过虚拟机运行 RouterOS、OpenWrt、pfSense 等操作系统:

不过,由于网络和存储共用一台设备,在 NAS 重启、或者进行 CPU 密集型任务时,会一定程度上影响网络。所以最终我又换回了 RT1900ac。

随着对网络设备的折腾,我对家用无线路由器的看法也在逐渐变化。之前我想让无线路由器的功能越多越好、越「智能」越好。而现在,我觉得家用无线路由器本身,发挥好基础的网络功能就好,集成太多功能会有很大概率影响其稳定性。

购买 UniFi Dream Machine

在了解到 UniFi 之后,我一直想玩一玩 UniFi 系列的无线设备。但由于需要多个设备得到组网,折腾起来不太方便,所以一直没有购买和体验。

而 2019 年发布 UniFi Dream Machine 将 UniFi 系列的原先的多种设备,整合在一台机器上,大大降低了 UniFi 的部署成本,所以我也在第一时间购买了 UniFi Dream Machine:

目前我对 UniFi Dream Machine 基本满意,我将长期使用 UniFi Dream Machine,直到 Wi-Fi 6、万兆以太网等技术大规模普及。

关于这个 Awesome List

在折腾网络设备的过程中,我也查阅了不少资料,阅读了很多关于网络设备的文章。所以,我想通过 Awesome List 的形式,系统地整理相关知识,方便自己查阅,并希望给更多人带来帮助。

目前这个 List 只是初步完成,我还会继续持续补充资料、并对其进行优化和调整。也欢迎大家多多提交 Issue 和 Pull Request,共同完善这份家庭网络知识库。


备注:

]]>
https://blanboom.org/2020/awesome-home-networking-cn/feed/ 0 1827
UniFi Dream Machine 使用体验(4):问题与不足 https://blanboom.org/2020/udm-4/ https://blanboom.org/2020/udm-4/#comments Sun, 12 Jan 2020 16:51:59 +0000 https://blanboom.org/?p=1781

由于 UniFi Dream Machine 还是一个刚刚上市的产品,在操作系统等方面,与之前的 UniFi 产品相比有了较大的改动。在本文中,我将谈一谈 UniFi Dream Machine 的问题和不足之处,并对这四篇文章做一个总结。

性能问题

在 Ubiquiti 国内和国外官方论坛中,都有人反馈过 TCP 延迟过高的问题。这个问题我自己没有遇到过,但是不同人的网络环境可能不一样,如果特别在意,最好购买后先进行一下测试。

Wi-Fi 6 等新技术的应用

最近这段时间 Wi-Fi 领域出现了不少新技术,例如 Wi-Fi 6。2019 年的 iPhone 已经支持 Wi-Fi 6,而且从 2019 年下半年开始,已经有不少厂商推出了支持 Wi-Fi 6 的无线路由器

虽然 UniFi Dream Machine 的 Wi-Fi 性能已经足够好(支持 802.11ac Wave2 和 4×4 MIMO,与 UniFi nanoHD 一致 ),但作为一款 2019 年底上市的产品,不支持 Wi-Fi 6 显得稍微有点遗憾。

另外,对于 WPA3DNS over HTTPS 等近期比较热门的功能,UDM 也没有来得及支持。而万兆以太网等,则可能只在后续更高端的 UDM 型号中提供。

Wi-Fi 不兼容部分设备

UDM 设置完成话,默认打开了「自动优化」选项,能够自动设置细节参数,使网络达到最佳性能。其中「自动优化」会让自动让高性能设备优先连接 5GHz 信道。

设置高性能设备优先连接 5GHz 网络
设置高性能设备优先连接 5GHz 网络

我有一个日版的 Nintendo Switch,不支持 149 等信道。当我将 5GHz Wi-Fi 设置为 149 信道,想让 Nintendo Switch 使用 2.4G Wi-Fi 时,UDM 认为 Switch 是高性能设备,强制让 Switch 优先连接 5GHz Wi-Fi,最终导致 Switch 无法连接网络。

IPv6 支持不完善

PPPoE 接入,无法获取 IPv6 地址

对于不少需要公网 IP,或者需要减少一层 NAT 的用户,会选择将光猫更改为桥接模式,并在路由器上进行 PPPoE 接入。

但 UDM 目前在 PPPoE 接入的情况下,不支持获取 IPv6 地址,导致 IPv6 不可用。

相关链接:

防火墙对动态 IPv6 前缀不友好

国内有不少 ISP,是动态分配 IPv6 前缀的。也就是说,每次重新拨号获取的 IPv6 地址不一定相同。

由于 IPv6 一般不使用 NAT,网络中每一台设备都有自己的全球单播地址。每次重新拨号,如果获取到的前缀发生变化,网络中所有设备的 IPv6 地址都会发生变化。

对于这种情况,可以通过配置 iptables,匹配 IPv6 地址后缀来解决:

但在 UniFi 的设置页面上,防火墙规则的目的地址只能匹配完整的 IPv6 地址,无法配置为不匹配前缀。而通过命令行界面,使用 iptables 命令配置的规则没有办法持久保存,所以想要通过 IPv6 地址访问家中设备时,可能会有一些不方便的地方。

延伸阅读:

缺失部分高级功能

在之前的 UniFi Security Gateway 上,可以通过 EdgeOS 的命令行实现高级配置,并在 config.gateway.json 配置文件中持久保存。而在 UDM 上,由于使用了新的 UbiOS 操作系统,不在支持这些命令行,以及 config.gateway.json 配置文件。

对于大部分用户,缺少这些高级功能并没有太大影响。当仍有一部分场景需要用到,例如:

  1. PPPoE 接入的情况下,访问光猫页面
  2. 设置高级防火墙规则,包括上文中提到的 IPv6 防火墙规则
  3. 上海电信千兆宽带,光猫桥接模式下跑满千兆带宽

在 Ubiquiti 官方论坛中看到了一些讨论:根据 UniFi 的产品定位,后续可能也不会恢复对这些命令行的支持,而是会继续完善图形化界面,将相关功能逐步添加到 Web 界面上。

另外,安装 Debian 软件包的功能,应该也不会在 UDM 中支持,不过应该可以通过 Docker 和 entware 等方式在部分程度上弥补。

缺少部分面向家庭用户的功能,例如家长控制

之前在使用群晖 RT1900ac 时,体验过我认为是家用路由器上最强大易用的家长控制功能。即使是家中没有小孩,也可以通过该功能来可视化和分析自己的上网行为。

UniFi 系列产品并不是面向家庭用户的,家长控制功能就没那么强大了。只能通过设置多个网络/SSID、设置 DNS 过滤器、Wi-Fi 计划等方式进行简单的控制。

远程访问

UniFi 支持通过 Cloud Access,在没有公网 IP 的环境,或者设置防火墙阻止外网访问的情况下,远程登录管理页面。

和群晖的 QuickConnect 不同,UniFi Cloud Access 是通过 WebRTC 实现远程访问的。猜测这样做能够通过 UDP 打洞等技术,实现 NAT 穿透,使外部设备能够无需经过服务器中转,直接访问 UniFi。从而一定程度上提高访问速度和安全性。(不过没有实际抓包确认过)

但这样做带来了一部分兼容性问题,由于不同浏览器对 WebRTC 的支持情况不同,UniFi 的 Cloud Access,只支持 Chrome 和 Firefox 浏览器,而不支持我常用的 Safari。如果将 iPad 作为自己的主力计算设备的话,虽然 iPadOS 上的 Safari 已经对桌面网站做了大量优化,但还是不能满足 UniFi 的要求。

另外,在我使用的 UDM 的三个月里,还遇到过一次通过 WebRTC 无法连接 UDM 的问题,重启 UDM 之后解决,不确定是运营商的问题,还是 UDM 本身稳定性的问题。

Web 界面的兼容性

除了上文中说的 WebRTC 带来的浏览器兼容性问题,UniFi Controller 本身的 Web 界面,由于实现较为复杂,只能完美支持桌面版 Chrome,在其他浏览器上也有少量兼容性问题。

例如在桌面版 Safari 上,部分图表等内容无法正常显示、设置页面在部分操作下会错位。在 iPhone 的 Safari 上,虽然大部分页面都做了响应式设计,能够正常显示,但新版设置页面由于界面错位,几乎不可用。

另外,为了方便地为 UniFi Controller 提供 HTTP 支持,我使用了群晖 DSM 中的反向代理服务器。由于 UniFi 用到了 WebSocket,需要进行如下设置才能正常工作:

不支持 LED 计划

UniFi Dream Machine 上有一圈漂亮的 LED,但是无法设置计划,只能一直打开或者一直关闭。如果能设置为白天打开,夜间关闭,应该对家庭用户更加友好。

目前有人通过编写脚本,结合 cron job 实现了定时打开关闭 LED,只不过如果后续 UniFi 有大的软件更新时,脚本也要随之进行修改:

蓝牙用途比较单一

UniFi Dream Machine 的蓝牙似乎只能在初始化的时候使用。我本来希望能够在断网或配置错误,无法访问设置页面的情况下,通过蓝牙连接 UDM 进行紧急设置,来恢复网络连接。但经过实际测试,发现并不能这样操作。

统计信息相关问题

部分统计信息无法显示

我在 UDM 上设置了 L2TP 服务器,用于在外面访问自己的 NAS 等设备。但是,UDM 的统计信息页面中,在 L2TP 已经连接的情况下,统计信息页面中看不到具体的用户信息:

L2TP 服务器有用户连接的情况下,显示不出统计信息
L2TP 服务器有用户连接的情况下,显示不出统计信息

另外,我也在 UDM 上设置了端口转发,但无法统计到端口转发的流量统计信息,一直显示为 0:

无法显示端口转发的流量统计信息
无法显示端口转发的流量统计信息

这两个问题应该是 UDM 的 bug,希望以后能尽快解决。

不方便对比历史流量统计数据

UDM 拥有直观的 DPI 功能,能够统计各个应用的流量数据。但我希望能够增强历史数据的统计与展示,通过直观的图表展示和对比历史流量的变化。

DPI 不支持自定义规则

UDM 中已经内置了大量 DPI 规则,并支持用户自定义分类。对于我自己搭建的 Web 服务,想将域名指定到合适的分类,在 UDM 上就无能为力了。

DNS Filter 的问题

UDM 中的 DNS Filter,能够通过内置的 DNS 服务器过滤有害网站。但是打开后,发现经常出现网页打不开的问题,可能是正常 DNS 请求也被过滤了。

另外,我希望 UDM 的 DNS Filter 能够像 Pi-hole 或者 AdGuard Home 一样,支持自定义规则或者订阅规则,方便实现更强大的功能。

交换机缺少链路聚合、端口镜像等功能

根据 Ubiquiti 的文案,UDM 整合了 USGUSWUCKUAP 四种设备,但其内置的交换机,功能并没有独立的 USW 丰富。

例如我的 NAS 上有两个以太网口,为了提高多个设备同时访问 NAS 的性能,可以同时连接两根网线到交换机,设置链路聚合。而 UDM 默认是不支持的。

或者有时候,我可能会抓包来观察一些网络流量,而缺少端口镜像功能,抓包不太方便。

另外,还有一些其他功能,在 UniFi 上不支持,比如通过 Wake on LAN 唤醒家中的电脑、NAS 等设备。

默认防火墙规则允许公网访问 Web 管理页面

UniFi Dream Machine 的默认防火墙规则,经过测试默认允许 Web 管理页面。这样可能会带来一定的安全风险(例如设置了弱密码或者重复密码,导致设备被攻击;或者设备存在漏洞,由于没有及时更新而被利用)。另外,国内大部分家庭宽带是不允许对外提供 Web 服务的,如果 Web 服务暴露在公网,可能会违反相关的使用协议或政策

官网宣传文案中的歧义

另外还有一点,在官网中介绍 UDM 的以太网口时,用了「5GbE Ports」的字样,本来是说这台设备有 5 个千兆网口的,但是很有可能让人误以为这台设备支持 5GBASE-T 的以太网。

UDM 官网文案中的 5GbE Ports
UDM 官网文案中的 5GbE Ports

根据 V2EX 上的讨论,确实已经有人误以为 UDM 的网口 5GE 速率的:

延伸阅读、总结

对于普通的家庭用户来说,一个普通的无线路由器,或者一套 Wi-Fi mesh 系统,已经完全满足大部分需求了。但是,如果有多 AP 组网获得最佳体验的需求,或者仅仅是一个网络爱好者,想要用最快的方式体验一下 UniFi 设备,UDM 都是一个不错的选择:

当然,如果有在 PPPoE 接入的情况下使用 IPv6、或者本文中描述的其他特殊需求,可以再等一段时间,看系统更新之后这些问题是否能够解决。

关于 UDM 的其他缺陷,可以参考这个帖子:

关于 UniFi 的其他文章:

> 本文首发于少数派,同时发布于我的博客,欢迎关注:https://sspai.com/post/58392

]]>
https://blanboom.org/2020/udm-4/feed/ 10 1781
UniFi Dream Machine 使用体验(3):系统探索 https://blanboom.org/2020/udm-3/ https://blanboom.org/2020/udm-3/#respond Sun, 12 Jan 2020 16:47:17 +0000 https://blanboom.org/?p=1776

在本文中,我将进入通过 SSH 进入 UniFi Dream Machine 的命令行界面,看一下是否有新的发现。

操作系统

UniFi Dream Machine 默认打开了 SSH 功能,使用 root 用户和管理员密码就能登录:

$ ssh root@192.168.3.1                                               [13:32:35]
Welcome to UbiOS

By logging in, accessing, or using the Ubiquiti product, you
acknowledge that you have read and understood the Ubiquiti
License Agreement and agree to be bound by its terms.

root@192.168.3.1's password:
  ___ ___      .__________.__
 |   |   |____ |__\_  ____/__|
 |   |   /    \|  ||  __) |  |   (c) 2010-2019
 |   |  |   |  \  ||  \   |  |   Ubiquiti Networks, Inc.
 |______|___|  /__||__/   |__|
            |_/                  http://www.ui.com

      Welcome to UniFi Dream Machine!
#

在登录后的界面中,可以看到 Welcome to UbiOS 这一行欢迎信息。而 UbiOS 这一操作系统名称,之前并没有在 Ubiquiti 的其他网络设备上出现过。这说明 UniFi Dream Machine 采用了一个全新的操作系统。

而上一代产品 UniFi Security Gateway 是基于 EdgeOS 的,EdgeOS 基于 Vyatta,Vyatta 又是基于 Debian。也就是说,在 UniFi Security Gateway 上,可以使用 EdgeOS 特有的命令,也可以添加 Debian 软件源之后,安装 Debian 软件包。

在 UniFi Dream Machine 上,我尝试了 EdgeOS 的命令,以及通过 apt-get 等命令安装软件包,都不能成功。这进一步证明了 UniOS 是一个全新打造的操作系统:

# show interface
-sh: show: not found
# apt
-sh: apt: not found
# apt-get
-sh: apt-get: not found
# dpkg
-sh: dpkg: not found

通过 uname -a 命令和 dmesg 中的日志信息,可以看到 UbiOS 基于 aarch64 架构的 GNU/Linux:

# uname -a
Linux UDM 4.1.37-v1.5.0.1974-51146f0 #1 SMP Tue Oct 29 15:11:07 MDT 2019 aarch64 GNU/Linux

# dmesg
...
[    0.000000] Linux version 4.1.37-v1.5.0.1974-51146f0 (builder@link-xenial-builder) (gcc version 6.4.0 (Buildroot 0.9.0.0) ) #1 SMP Tue Oct 29 15:11:07 MDT 2019
...

更多信息可参考 Ubiquiti 官方论坛中的讨论:

Docker

虽然 UniFi Dream Machine 没有基于 Debian,失去了能够安装 .deb 软件包的优势(具体请参考下一篇文章),但是,UDM 中内置了 Docker 命令,从而可以通过 Docker 来运行第三方容器,例如 Pi-hole 这样的广告过滤工具。

默认情况下,Docker 服务没有启动,无法运行 Docker 命令:

# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

/etc/init.d/ 中,能够找到 Docker 服务的启动脚本 S60dockerd,在脚本中发现了这样一行注释:

# UBNT: We don't want to run any Docker services in UDM base at the moment
BOARD_NAME=$(cut -d' ' -f2 /sys/firmware/devicetree/base/soc/board-cfg/id | sed 's/-/_/')
[ "${BOARD_NAME}" = "udm" ] && exit 0

可以看出,UniFi Dream Machine Pro 由于需要支持 UniFi Protect,所以默认运行 Docker 服务。而标准版本的 UDM 目前是屏蔽 Docker 服务的。

/etc/init.d/S60dockerd 复制到 /mnt/data 中,并注释掉上面几行代码,即可正常启动 Docker。

# /mnt/data/S60dockerd start
Starting dockerd: OK

# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
256ab8fe8778: Pull complete
Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

相关链接:

iptables

iptables 是 Linux 上一个工具,用于控制网络报文的处理和转发,通过 iptables -L 列出所有的 iptables 规则

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ALIEN      all  --  anywhere             anywhere
TOR        all  --  anywhere             anywhere
UBIOS_INPUT_JUMP  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
ALIEN      all  --  anywhere             anywhere
TOR        all  --  anywhere             anywhere
IPS        all  --  anywhere             anywhere
UBIOS_FORWARD_JUMP  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
UBIOS_OUTPUT_JUMP  all  --  anywhere             anywhere

Chain ALIEN (2 references)
target     prot opt source               destination
ALIENLOGNDROP  all  --  anywhere             anywhere             match-set ALIEN src

Chain ALIENLOGNDROP (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain IPS (1 references)
target     prot opt source               destination
IPSLOGNDROP  all  --  anywhere             anywhere             match-set ips dst,dst,src
IPSLOGNDROP  all  --  anywhere             anywhere             match-set ips src,src,dst

Chain IPSLOGNDROP (2 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain MINIUPNPD (1 references)
target     prot opt source               destination
# 此处省略通过 UPnP 自动创建的端口转发规则

Chain TOR (2 references)
target     prot opt source               destination
TORLOGNDROP  all  --  anywhere             anywhere             match-set TOR src

Chain TORLOGNDROP (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain UBIOS_FORWARD_IN_USER (1 references)
target     prot opt source               destination
UBIOS_WAN_IN_USER  all  --  anywhere             anywhere
UBIOS_LAN_IN_USER  all  --  anywhere             anywhere

Chain UBIOS_FORWARD_JUMP (1 references)
target     prot opt source               destination
MINIUPNPD  all  --  anywhere             anywhere
UBIOS_FORWARD_USER_HOOK  all  --  anywhere             anywhere

Chain UBIOS_FORWARD_OUT_USER (1 references)
target     prot opt source               destination
UBIOS_WAN_OUT_USER  all  --  anywhere             anywhere
UBIOS_LAN_OUT_USER  all  --  anywhere             anywhere

Chain UBIOS_FORWARD_USER_HOOK (1 references)
target     prot opt source               destination
UBIOS_FORWARD_IN_USER  all  --  anywhere             anywhere
UBIOS_FORWARD_OUT_USER  all  --  anywhere             anywhere

Chain UBIOS_INPUT_JUMP (1 references)
target     prot opt source               destination
UBIOS_INPUT_USER_HOOK  all  --  anywhere             anywhere

Chain UBIOS_INPUT_USER_HOOK (1 references)
target     prot opt source               destination
UBIOS_WAN_LOCAL_USER  all  --  anywhere             anywhere
UBIOS_LAN_LOCAL_USER  all  --  anywhere             anywhere

Chain UBIOS_LAN_IN_USER (1 references)
target     prot opt source               destination
RETURN     all  --  192.168.3.0/24       anywhere
RETURN     all  --  anywhere             anywhere

Chain UBIOS_LAN_LOCAL_USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain UBIOS_LAN_OUT_USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             192.168.3.0/24
RETURN     all  --  anywhere             anywhere

Chain UBIOS_OUTPUT_JUMP (1 references)
target     prot opt source               destination

Chain UBIOS_OUTPUT_USER_HOOK (0 references)
target     prot opt source               destination

Chain UBIOS_WAN_IN_USER (1 references)
target     prot opt source               destination
# 此处省略用户自定义的端口转发规则
RETURN     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             ctstate INVALID
DROP       all  --  anywhere             anywhere

Chain UBIOS_WAN_LOCAL_USER (1 references)
target     prot opt source               destination
DROP       tcp  --  anywhere             anywhere             match-set UBIOS_5df3bff9973f4a052bf959ea dst
DROP       udp  --  anywhere             anywhere             match-set UBIOS_5df3bff9973f4a052bf959ea dst
RETURN     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             ctstate INVALID
RETURN     udp  --  anywhere             anywhere             match-set UBIOS_vpn_ports dst
RETURN     esp  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere

Chain UBIOS_WAN_OUT_USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
DROP       all  --  192.168.3.6          anywhere

如果 UniFi Controller 的 Web 界面中的防火墙规则无法满足要求,则可以使用 iptables 配置更复杂的规则,但是无法持久保存,重启后失效。(具体请参考下一篇文章)

tcpdump

UniFi Dream Machine 内置的交换机不支持端口镜像,所以不方便通过镜像的形式抓包。但是 UDM 中自带 tcpdump 命令,可以通过 tcpdump 工具抓包,一定程度上弥补了不能进行端口镜像的不足:

# tcpdump -npi eth4 -w /mnt/data/eth4.pcapng
tcpdump: listening on eth4, link-type EN10MB (Ethernet), capture size 262144 bytes
^C41183 packets captured
41269 packets received by filter
0 packets dropped by kernel

通过 Wireshark 打开,能正常看到抓包结果:

在 UniFi Dream Machine 中抓包,并使用 Wireshark 打开
在 UniFi Dream Machine 中抓包,并使用 Wireshark 打开

进程信息

通过 ps 命令列出 UDM 运行的所有进程,可以看到 UniFi 基于不少开源软件来实现其功能。例如通过 syslogd 实现日志记录;使用 nodenginx 实现 web 服务;使用 https://www.avahi.org 实现 mDNS/Bonjour 协议;使用 Suricata 实现 IPS/IDS;通过 FreeRADIUS 实现 RADIUS 服务器;通过 Dnsmasq 实现 DNS/DHCP 等功能;通过 MiniUPnP 实现 UPnP 服务…… 希望后续能通过配置文件等方式,使用户对这些软件进行更高级的设置。

另外看到了 ubnt-ble-http-transport,应该是通过蓝牙 BLE 来传输数据用的,以及 ubnt-fan-speed 用来控制风扇速度。

# ps
PID   USER     COMMAND
    1 root     init
  (此处省略前面的基础进程)
  270 root     /sbin/syslogd -n -s 5120 -b 3 -O /mnt/data/log/messages
  273 root     /sbin/klogd -n
  295 root     {S04ubnt-fan-spe} /bin/sh /etc/init.d/S04ubnt-fan-speed start
  296 root     /usr/sbin/ubnt-fan-speed
  300 root     watchdog -t 5 /dev/watchdog
  308 root     /usr/sbin/haveged -w 1024 -r 0
  340 dbus     dbus-daemon --system
  368 root     [kworker/2:2]
  544 root     [kworker/u9:0]
  545 root     [hci0]
  546 root     [hci0]
  547 root     hciattach -s 115200 /dev/ttyS1 bcsp 115200
  548 root     [kworker/u9:1]
  671 root     ubnt-systemhub
  672 root     logger -t ubnt-systemhub
 1501 root     /usr/bin/node /usr/share/unifi-management-portal/app/be/ump.js
 1502 root     logger -t UMP
 1560 root     /usr/bin/ubios-udapi-server -c /config/ubios-udapi-server/ubios-udapi-server.state
 1561 root     {S45ubios-udapi-} /bin/sh /etc/init.d/S45ubios-udapi-server start
 1566 root     nginx: master process /usr/sbin/nginx
 1567 www-data nginx: worker process
 1568 www-data nginx: worker process
 1569 www-data nginx: worker process
 1570 www-data nginx: worker process
 1578 root     /usr/bin/udapi-bridge --watchdog --rest-api-port 1080 --rest-api-interface lo
 1648 root     {exe} /usr/bin/udapi-bridge --watchdog --rest-api-port 1080 --rest-api-interface lo
 1689 root     {S95unifi} /bin/sh /etc/init.d/S95unifi start
 1794 root     sudo -u unifi /usr/lib/jvm/java-8-openjdk-arm64/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xmx768M -Xss256K -XX:
 1797 unifi    /usr/lib/jvm/java-8-openjdk-arm64/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xmx768M -Xss256K -XX:MinHeapFreeRat
 1951 root     /usr/sbin/pppd call ppp0 nodetach
 2195 root     [dns_thread]
 2248 root     /usr/sbin/dpi-flow-stats
 2374 root     /usr/sbin/crond -f -c /etc/crontabs
 2381 avahi    avahi-daemon: running [UDM.localdomain]
 2382 root     /usr/sbin/ntpd -n -p 0.ubnt.pool.ntp.org -p 1.ubnt.pool.ntp.org -p 2.ubnt.pool.ntp.org -p 3.ubnt.pool.ntp.org
 2383 root     /usr/sbin/radiusd -f
 2384 root     /usr/sbin/dropbear -R -F -b /etc/issue -p 22 -P
 2487 root     /usr/sbin/minissdpd -s /run/minissdpd.sock -p /run/minissdpd.pid -F -i br0
 2488 root     /usr/sbin/miniupnpd -f /run/miniupnpd.conf -F
 2489 root     /sbin/utmdaemon -C 1 -s 1 -o 1
 2565 root     /usr/sbin/odhcp6c -e -v -s /usr/share/ubios-udapi-server/ubios-odhcp6c-script -P 60 ppp0
 2567 nobody   /usr/sbin/dnsmasq --conf-dir=/run/dnsmasq.conf.d/
 2568 root     /usr/libexec/ipsec/starter --daemon charon --nofork
 2570 root     /usr/sbin/dnsmasq --conf-dir=/run/dnsmasq.conf.d/
 2587 root     /usr/libexec/ipsec/charon --debug-ike 2 --debug-knl 2 --debug-cfg 2 --debug-net 2
 2752 root     /usr/sbin/xl2tpd -D -l -c  /run/xl2tpd/xl2tpd.conf
 2801 root     {Suricata-Main} /sbin/suricata --pcap --pidfile /run/suricata.pid -c /usr/share/ubios-udapi-server/ips/config/suricata_ubios_h
 2829 unifi    bin/mongod --dbpath /usr/lib/unifi/data/db --port 27117 --unixSocketPrefix /usr/lib/unifi/run --logappend --logpath /usr/lib/u
 2972 root     {S95unifi} /bin/sh /etc/init.d/S95unifi start
 2990 root     /sbin/getty -L console 0 vt100
 2991 root     /usr/bin/reset-handler
 3006 root     /usr/bin/mcad
 3007 root     /usr/bin/mca-monitor
 3012 root     /bin/stamgr -i 1 -c 30 -K
 3014 root     /usr/bin/mesh-monitor -i ra1
 3016 root     /usr/bin/mesh-monitor -i rai1
 3018 root     /sbin/wevent
 3025 root     /sbin/stahtd
 3032 root     /usr/sbin/hostapd /etc/aaa1.cfg
 3037 root     /usr/sbin/hostapd /etc/aaa2.cfg
 3038 root     /usr/sbin/hostapd /etc/aaa3.cfg
 3039 root     /usr/sbin/hostapd /etc/aaa4.cfg
 3071 root     [RtmpCmdQTask]
 3072 root     [RtmpWscTask]
 3073 root     [HwCtrlTask]
 3074 root     [ser_task]
 3078 root     [RtmpMlmeTask]
 3081 root     [RtmpCmdQTask]
 3082 root     [RtmpWscTask]
 3083 root     [RtmpMlmeTask]
 3406 root     /usr/bin/ubnt-ble-http-transport --adapter hci0 --service-uuid xxxxx --advertise-name UDM --adv
 4703 root     /usr/sbin/dropbear -R -F -b /etc/issue -p 22 -P
 4795 root     -sh
10278 root     /usr/bin/linkcheck
12003 root     /usr/bin/ble-scanner
15449 root     [kworker/u8:1]
16906 root     [kworker/u8:2]
18754 root     [kworker/0:2]
18966 root     [kworker/u8:0]
19893 root     sleep 10
19895 root     sleep 5
19904 root     ps

# /usr/sbin/ubnt-fan-speed --help
^C

智能队列

前文中提到,UDM 支持智能队列,能够提升网络使用体验。通过 tc 命令,可以看到 UDM 的智能队列是基于 fq_codel 实现的,而不是更新的 Cake。也可以在该命令中看到 fq_codel 的具体参数。

# tc qdisc show dev eth4
qdisc htb 1: root refcnt 5 r2q 10 default 10 direct_packets_stat 0 direct_qlen 1000
qdisc fq_codel 10: parent 1:10 limit 1000p flows 1024 quantum 1514 target 5.0ms interval 100.0ms

硬件信息

查看 /proc/cpuinfo 中的 CPU 信息:

# cat /proc/cpuinfo
processor	: 0
BogoMIPS	: 100.00
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 3

processor	: 1
BogoMIPS	: 100.00
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 3

processor	: 2
BogoMIPS	: 100.00
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 3

processor	: 3
BogoMIPS	: 100.00
Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x1
CPU part	: 0xd07
CPU revision	: 3

内存为 2GB:

# free -m
             total       used       free     shared    buffers     cached
Mem:          1874       1183        690         41        114        336
-/+ buffers/cache:        732       1141
Swap:         3280         53       3227

文件系统相关信息:

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               290.0M    290.0M         0 100% /overlay/root_ro
devtmpfs                937.1M         0    937.1M   0% /dev
tmpfs                   937.3M     15.2M    922.1M   2% /overlay/rw
ram-overlay             937.3M     15.2M    922.1M   2% /
tmpfs                   937.3M         0    937.3M   0% /dev/shm
tmpfs                   937.3M    128.0K    937.2M   0% /tmp
tmpfs                   937.3M     26.1M    911.1M   3% /run
/dev/sda6                12.2G    826.0M     10.8G   7% /mnt/data
/dev/sda4               120.0M      1.5M    109.5M   1% /mnt/persistent
cgroup                  937.3M         0    937.3M   0% /sys/fs/cgroup
/dev/sda6                12.2G    826.0M     10.8G   7% /mnt/data/docker

更多

本文主要通过命令行界面,来探索了 UniFi Dream Machine 系统的一些内部信息。如果有其他感兴趣的信息需要查看,欢迎在评论区留言,我会查看后补充在这篇文章中。

如果想要对 UDM 的系统有更多了解,例如 rootfs 目录结构、内部配置文件等,推荐观看如下视频:

如果对 UDM 的硬件感兴趣,可以参考 fccid.io 上的拆机图:

> 本文首发于少数派,同时发布于我的博客,欢迎关注:https://sspai.com/post/58391

]]>
https://blanboom.org/2020/udm-3/feed/ 0 1776
UniFi Dream Machine 使用体验(2):特色功能 https://blanboom.org/2020/udm-2/ https://blanboom.org/2020/udm-2/#respond Mon, 06 Jan 2020 16:43:06 +0000 https://blanboom.org/?p=1732 题图:UniFi Dream Machine 使用体验

UniFi 系列是我使用的第一个较为专业的 Wi-Fi 系统,在本文中,我将以 UniFi Dream Machine 为例,介绍 UniFi 中我感兴趣功能。

通过 VLAN 与 mDNS 为智能家居提供安全的网络环境

随着「智能家居」等概念的普及,越来越多的家庭开始使用监控摄像头和 IoT 设备。这些设备在为生活提供便利的同时,也可能对网络安全带来隐患。

在 WWDC 2019 上,Apple 公布了支持 HomeKit 的家用无线路由器。这些路由器能自动阻止 HomeKit 设备连接 Internet,提高安全性。但这些功能只能用于支持 HomeKit 的设备上。而对于 UniFi Dream Machine,则可以自己动手,为 IoT 设备提供一个安全的网络环境。

为了提高智能家居设备的安全性,同时不牺牲过多的易用性,需要实现如下几点:

  1. 使智能家居设备位于独立的网络中,与个人设备(电脑、手机等)隔离
  2. 如果没有必要,禁止智能家居设备访问 Internet
  3. 在局域网内,仍能通过手机 App 控制智能家居设备

对于第 1 点和第 2 点,可在 UDM 中为 IoT 设备创建一个单独的 VLAN 和 SSID,从而实现 IoT 设备与其他设备隔离。还可以让自己的手机电脑使用 WPA2 Enterprise,而不支持的 IoT 设备则使用常见的 WPA2 Personal,进一步提高安全性。同时,通过防火墙阻止 IoT 设备对 Internet 的访问:

UDM 设置页面:创建新的网络
UDM 设置页面:创建新的网络

而多数智能家居设备的手机 App,通过 mDNS 协议来搜索设备。在 UDM 上配置 mDNS 反射器后,就能做到即使手机和智能家居设备即使不在同一个二层网络,手机 App 仍然能够查找到智能家居的 IP 地址并建立连接:

UDM 设置界面:开启 mDNS 反射器
UDM 设置界面:开启 mDNS 反射器

入侵防御系统(IPS)

什么是 IPS

IPS 为入侵防御系统 Intrusion Prevention System 的缩写,能够实时监视并分析网络流量,阻止有安全风险的连接。

常见的开源 IPS 工具有 SnortSuricata。之前我在折腾 pfSense 的时候,也尝试过在 pfSense 中配置和使用 Suricata

支持 IPS 的家用设备

根据我的了解,目前已经有不少家用无线路由器内置了 IPS,例如华硕的 ASUSWRT,但功能相对比较简单。而内置 Suricata IDS/IPS 的家用级网络设备,如果不考虑软路由的话,只有 Synology 的 RT1900ac 和 RT2600ac

我之前使用的是 RT1900ac,早期软件版本的 IPS 吞吐量太小,在百兆宽带下基本不可用,后来新系统优化后,才能支持最高 800M 左右的带宽。但经过实际体验,打开后仍会偶尔出现断网、打开网站速度过慢等情况,需要重启路由器才能解决。

根据 Synology 的一篇博文,IPS 需要消耗大量的 CPU、内存、IO 资源,这些功能通常只存在于 1000 美元级别的企业级防火墙中。Synology 对 Suricata 进行了修改和优化,才使其在家用路由器中能够正常工作。具体技术细节可参考这篇文章:

UniFi Dream Machine 的 IPS

而在 UniFi 这边,之前的入门级 UniFi Security Gateway,IPS 性能也只有 85Mbps 左右。而 UniFi Dream Machine 的 IPS 吞吐量直接提升到了 850Mbps,应对国内的大部分家庭宽带,都毫无压力。

最近一两年里,UniFi 的 IPS 功能在易用性方面有了明显的提升。例如设置界面,能够方便选择 IPS 等级,而不像我之前使用的 RT1900ac 一样,默认打开所有规则,产生大量日志信息,给新用户带来困惑。

UDM 设置界面:设置 IPS 等级
UDM 设置界面:设置 IPS 等级

另外是 IPS 的 Overview 界面,通过图表的方式显示统计信息,能够直观看到威胁的数量、来源地区、变化趋势等。但是,界面上面的地图只是用于设置和显示 GeoIP Filter,无法将威胁的来源地区直接显示在地图上。整体界面与 RT1900ac 的 Threat Prevention 仍有一些差距。

UDM 的 Threat Management overview 界面
UDM 的 Threat Management overview 界面

目前 UniFi 的 Threat Management 仍处于 BETA 阶段,希望后续能为我们带来更多惊喜。

局域网扫描、蜜罐

UniFi 的局域网扫描和蜜罐功能,能够辅助用户找到局域网内有安全弱点的设备。

局域网扫描功能能够主动扫描网络内所有设备,找出设备的操作系统版本、开放端口等信息。用户可以根据这些信息,找到网络中怀疑有安全风险的设备:

Endpoint Scans
Endpoint Scans

而蜜罐功能在局域网内运行了一个开放所有端口的虚拟设备。如果发现蜜罐的 SSH、RDP 等关键端口被访问,则可以怀疑局域网有设备正在对其他设备发起攻击:

蜜罐
蜜罐

深度包检测(DPI)、流量统计

虽然目前网络上的加密流量越来越多,DPI 的作用越来越不明显。但仍可以通过域名等信息(例如 TLS 流量中的 SNI 信息),大体统计出家庭网络的使用情况。

UniFi 内置的 DPI 功能,提供了较为详细的分类,例如 P2P 传输、流媒体播放、网盘和文件共享等:

DPI 全局流量统计界面
DPI 全局流量统计界面

当然,除了全局的流量统计信息,也可以查看网络中各个设备的流量情况:

单个设备流量统计界面
单个设备流量统计界面

智能队列

对于家庭网络,经常会遇到同时使用多个应用的场景,例如一边进行在线视频播放、P2P 下载,一边进行微信语音、网络游戏。其中在线视频和 P2P 下载对带宽要求高、不关注延迟;而微信语音、网络游戏等应用不需要较大的带宽,但对延迟比较敏感。

传统的做法是通过路由器上的 QoS 功能,设置规则,提高网络游戏等应用的优先级。但手动设置 QoS 是一件较为复杂的事情。例如下图是一个路由器系统的 QoS 设置页面,可以看到,需要手动对不同的应用设置不同的优先级:

DD-Wrt 的 QoS 设置
DD-Wrt 的 QoS 设置

智能队列功能通过自动对网络流量进行调整,来避免 bufferbloat,降低延迟,提高上网体验:

UDM 支持智能队列,在首次设置时,只要填入了当前宽带的带宽,智能队列就会自动打开。后续如果更换宽带,重新在设置页面填入新的带宽即可。无需其他复杂设置:

UDM 智能队列设置界面
UDM 智能队列设置界面

射频环境扫描、Wi-Fi AI

RF Environment 功能能够扫描当前环境中的 Wi-Fi 信道,并使用图形化的方式显示各个信道的使用情况。用户可根据扫描结果,选择干扰最少的 Wi-Fi 信道,提高无线网络质量:

射频环境扫描
射频环境扫描

而 Wi-Fi AI 功能,能定期自动对 Wi-Fi 环境进行扫描,并自动选择合适的信道,无需人工干预:

Wi-Fi AI 设置界面
Wi-Fi AI 设置界面

对 Wi-Fi 信道有特殊需求的用户,例如有日版 Nintendo Switch 的用户,由于不同国家和地区无线电法规不同,5GHz Wi-Fi 允许使用的信道也有差异。可以在 Wi-Fi AI 的设置中,排除不兼容的信道:

Wi-Fi AI 的高级设置中,能够排除特定信道
Wi-Fi AI 的高级设置中,能够排除特定信道

访客网络

在 UniFi 上,可以方便地创建访客网络。访客网络支持 Portal 认证,一定程度上避免了通过所谓的「Wi-Fi 密码分享软件」蹭网。

Portal 认证页面具有一定程度的自定义功能,支持更改配色和 logo。如果不满足需求,也可以使用外部 Portal 服务器:

Guest Portal 自定义 Web 界面
Guest Portal 自定义 Web 界面

支持设置使用条款,用户同意后才能上网:

在 Guest Portal 中显示使用条款
在 Guest Portal 中显示使用条款

也可在访客网络下设置 DNS Filter,阻止有安全风险的网络活动:

设置 DNS Filter
设置 DNS Filter

同时可以限制访客网络的带宽,避免影响网速:

限制访客网络的带宽
限制访客网络的带宽

日志发送

如果家中有 NAS,可以打开 UniFi 的日志发送功能,将日志信息发送到 NAS 中长期保存。部分 NAS 系统,例如 DSM,已经内置了 Syslog 服务器,能够集中收集和查看各个设备的日志。

设置 Syslog,将日志发送到日志服务器
设置 Syslog,将日志发送到日志服务器

当然,也可以使用 ELK Stack 收集 UniFi 的日志,并通过可视化的方式实现。之前我已经在使用 ELK Stack 收集 pfSense 和 Suricata 的日志,接下来可能也会尝试一下通过同样的方式展示 UniFi 的日志:

测试并统计 ISP 网速

UniFi 还可以定期进行网速测试,并以图表的形式展示出来。通过图表,我们可以追踪运营商的网络性能,观察运营商是否持续提供了足够的带宽。

以图表形式展示的历史测速结果
以图表形式展示的历史测速结果

自动为局域网设备匹配合适的图标

UniFi Controller 中内置了大量设备的图标,无论是最新的 iPhone 11,还是 NAS 等网络设备,或者是 Nintendo 3DS、Nintendo Switch 等游戏机,或者是智能家居设备,都能匹配到合适的图标。

局域网中各个设备的图标
局域网中各个设备的图标

Airtime Fairness 等高级功能

在打开 Advanced Features 之后,还可以启用一些高级功能。例如 Airtime Fairness 能够避免低性能设备拖慢整体网速。

启动 Advanced Features,包括 Airtime Fairness
启动 Advanced Features,包括 Airtime Fairness

两个好玩的新配件

除了 UniFi Dream Machine,在 2019 年,Ubiquiti 还推出了两个我感兴趣的配件,可以搭配 UniFi Dream Machine 一起使用。

UniFi AP BeaconHD

官网商店链接:https://store.ui.com/products/uap-beaconhd

UniFi AP BeaconHD
UniFi AP BeaconHD,图片来源:https://www.ui.com/marketing/#unifi

传统的 UniFi 系列 Wi-Fi 产品,都是以无线 AP 的形式提供,一般需要连接网线到交换机上,并通过 PoE 的方式供电。而 AmpliFi 家用系列产品,则主打无线 mesh 组网。

而与 UniFi Dream Machine 同期推出的 UniFi AP BeaconHD,则是 UniFi 系列的第一款纯 mesh 节点,可以与 UDM 或者其他 UniFi AP 搭配,直接插在电源插座上即可工作。对于不方便进行布线的地方,可以使用 UniFi AP BeaconHD 扩展 Wi-Fi 覆盖范围。

UniFi Smart Power Plug

相关信息:https://www.reddit.com/r/Ubiquiti/comments/e3j11o/more_ea_toys_unifi_smart_power_plug/

UniFi Smart Power Plug 是一个智能插座,如果家中的光猫不稳定,可以将其作为光猫的电源。当 UniFi 检测到互联网连接丢失时,会自动断开并重新接通光猫的电源,强制光猫重启,从而恢复互联网连接。

UniFi Smart Power Plug 目前还没有正式发布,可在 Ubiquiti 官网注册 Beta Program 后,在 Early Access Store 中购买 BETA 版本硬件。

> 本文首发于少数派,同时发布于我的博客,欢迎关注:https://sspai.com/post/58303

]]>
https://blanboom.org/2020/udm-2/feed/ 0 1732