路由器 – Blanboom https://blanboom.org Sat, 09 Jul 2022 04:22:50 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.5.2 https://blanboom.org/wp-content/uploads/2018/03/cropped-favicon.001-32x32.png 路由器 – Blanboom https://blanboom.org 32 32 53782978 「智能队列」如何改善你的家庭网络质量 https://blanboom.org/2021/smart_queue/ https://blanboom.org/2021/smart_queue/#respond Tue, 02 Feb 2021 15:48:17 +0000 https://blanboom.org/?p=2044 阅读全文]]> 在无线路由器的设置页面上,我们可能会看到一个名为「智能队列」的功能(根据品牌或操作系统的不同,也可能会被称做「智能 QoS」、「SQM」等)。

这一功能是如何工作的?是否能让网速变快?是否需要打开?本文将尝试解答这些问题。

从「网络如何连接」说起

本章节主要介绍计算机网络的基础知识。如果读者已经熟悉相关知识,可跳过这部分内容。

在介绍「智能队列」之前,先来了解一下基础的网络知识。

两台电脑间进行数据传输,存在两种方式,分别是电路交换分组交换

对于电路交换,两台电脑独占一条线路进行数据传输。过去的固定电话,大多使用的就是电路交换。

由于独占一条线路,两台设备之间的通信较为稳定,很难出现数据丢失、数据传输顺序错乱等情况。但一条线路只能供一组电脑使用,另外一组电脑想要通信,就不能复用原来的线路了。

对于分组交换,传输的数据被拆分为小段,每一小段叫做一个数据包(报文)。数据以报文的形式进行转发,从而实现了多组电脑复用一条线路进行通信。

分组交换示意图

电路交换虽然能保证数据传输的稳定性,但由于独占线路浪费太多资源,所以在 Internet 中,使用的是分组交换

分组交换将数据拆分成一个一个的小片段来转发,没有独占线路。如果网络条件不好(例如同时有大量报文经过路由器,超出了路由器的处理能力),很有可能遇到数据顺序错乱、甚至数据丢失等情况。那么,这些情况应该如何避免?

  • 在微信视频通话电视直播等应用中,报文的丢失或乱序,只会造成视频图像卡顿,不会造成太严重的影响。所以这些应用会使用简单的 UDP 协议,不考虑丢包、乱序
  • 网页浏览文件下载等应用中,一般使用基于 TCPHTTP 协议。TCP 在报文中携带序号,避免乱序;同时提供了报文的丢失重传机制,避免了丢包。所以,也可以认为 TCP 为两台电脑的应用程序建立了一个虚拟的「连接」。(最新版本的 HTTP/3 协议,使用的则是 QUIC。QUIC 虽然基于 UDP,但引入了与 TCP 类似的报文丢失重传机制)

如果想要了解更多网络基础知识,推荐阅读「入网指南」系列文章:

网络延迟:影响上网体验的重要因素

带宽延迟,是影响上网体验的两大因素。

带宽指的是在单位时间内,网络最多能传输多少数据。

网络的带宽水管的粗细有着很多相似之处,水管越粗,相同时间流出的水越多;同样地,网络带宽越大,相同时间能够传输的数据越多。

在日常上网过程中,大的带宽能带来这些好处:

  • 上传、下载文件的速度更快
  • 在线看视频时,缓冲的时间更短
  • 如果家中有多个人同时上网,大的带宽能够保证每个人都能流畅上网,相互的影响更小

对于家庭宽带,我们常常听到的 10 兆、50 兆、100 兆、千兆,就是指的带宽的大小。

带宽 示意图

延迟指的是数据从网络的一端到达另一端,所需要的时间。

过大的延迟也会对上网体验带来不好的影响,例如:

  • 在浏览器中输入网址敲回车后,需要等更长的时间,网页才能加载
  • 视频聊天、语音通话质量变差,甚至能直接感受到声音、画面的滞后
  • 玩在线游戏时,发现游戏变慢

在很多时候,延迟相比带宽更容易被人感知,对网络体验的影响更大。

是什么导致了网络延迟?

上文中介绍过,Internet 使用的是分组交换。如果大家阅读过计算机网络相关的书籍,应该对分组交换的「存储-转发」机制有一定的印象。

简单说,「存储-转发」是指网络设备将收到的报文存储在缓冲区,然后再发送。

这是由于网络设备的性能有限,转发报文有速率限制。如果设备短时间内收到大量报文,一时半会儿处理不过来,就可以先报文存起来,空闲时慢慢发送。通过「存储-转发」,能够提高网络设备的吞吐量,更充分地利用带宽

其中,存储报文缓冲区,是一个先进先出队列那么,队列的长度应该如何确定?是不是队列越长,能够存储的报文越多,网络的性能就越好?大家可以先思考下这个问题。

其实在过去,内存价格比较昂贵,考虑到成本,网络设备的队列不会太大。现在,随着内存价格的下降,网络设备拥有了更大的队列。

但是,网络的带宽是有限的。实际的可用带宽,取决于数据传输路径上的最小带宽。这个最小带宽也被称做带宽上的「瓶颈」(bottleneck)。

bottleneck 示意图

由于瓶颈的存在,如果流量长时间以较大速率发送,大的队列并不能显著提升吞吐量。相反,大量报文滞留在队列中,会带来延迟的增大

这种队列中缓存有大量报文,来不及发送,导致数据传输延迟增大的现象,被称做 bufferbloat(缓冲区膨胀)。

bufferbloat 示意图

DSLReport 提供的测速服务,能够检测网络的 bufferbloat 程度。不过由于没有中国大陆服务器,测试结果不够准确。国外的读者可以尝试一下:

Flent 是一个本地的网络测试工具,也可以用于测试 bufferbloat:

家用无线路由器中的 QoS 功能

在「智能队列」出现之前,很多家用路由器已经提供了 QoS 功能。那么,传统的 QoS 如何解决网络延迟、网络拥堵?存在哪些不足之处?

在了解这个问题之前,先来熟悉一下网络中的报文,是什么样子的:

在网络中传输的报文,一般包括了链路层、网络层、传输层、应用层这四层信息。其中,网络层的源 IP 地址目的 IP 地址协议号,和传输层的源端口号目的端口号,是 QoS 算法中常常会关注的五个信息。这些信息合称「五元组」。

同一个应用在同一时间段内,传输的报文中,这些信息一般是不会发生变化的。例如观看在线视频时,同一个视频的所有报文 ,一般拥有相同的五元组信息。所以,通过五元组,我们能够区分不同应用的流量。

五元组 示意图

特别地,一些常见的应用,会使用固定的端口号。例如网页浏览一般使用 80、443 端口;英雄联盟游戏,使用的是 5000-5500 端口……

所以,当我们想要提升英雄联盟游戏的体验时,在路由器上设置让 5000-5500 端口的报文优先通过即可:


家用路由器中常见的 QoS 功能,就是通过手动设置 IP 地址、协议号、端口号等报文特征来实现的。这种方式需要用户了解一定的网络知识,且操作复杂。(虽然部分无线路由器内置了常用应用的 QoS 规则,但仍需要一定的手动设置,且无法及时适配新的、小众的应用)

当然,除了上文中介绍的内容,QoS 还有多种不同的实现方式。例如:

  • 对特定应用(例如 BitTorrent)进行限速
  • 按照 MAC 地址指定某台设备的优先级(例如提高 Nintendo Switch 的优先级,使游戏更加流畅)
  • 通过 WMMDSCP 等机制来决定报文优先级

这些机制各有各的特色和不足。例如对应用程序限速的方式,虽然效果明显,但无法在网络空闲时,动态利用剩余带宽来提升传输速度,也难以适应带宽频繁变化的无线网络。关于上述 QoS 机制的技术细节,本文不再详细介绍。如果感兴趣,可以搜索相关关键词,进一步了解。

智能队列:通过「全自动」的方式优化网络、降低延迟

什么是「智能队列」

目前,一部分新的无线路由器,开始有了名为「智能队列」的功能。这一功能一般指的是 fq_codel。

fq_codel 包含两种队列管理机制,分别是 Flow Queue 和 CoDel。在下文中,我将简要介绍这两种机制的作用。

Flow Queue

前文中介绍过,网络中的报文一般都有自己的五元组信息;同一应用发送的报文,在一定的时间段内,五元组信息是相同的。这些信息相同的一系列报文,被称做一条流(flow)

Flow Queue 为每条流单独维护一个队列。例如,如果我们一边在线观看视频,一边进行语音通话,一边玩游戏,Flow Queue 就会为视频播放的流量、语音通话的流量、在线游戏的流量各维护一条队列:

Flow Queue 示意图

正常情况下,在线观看视频需要占用较大的带宽,但对延迟不敏感,用户可以容忍几秒甚至几十秒的缓冲时间。

而语音通话和在线游戏占用带宽小,但对延迟敏感。例如语音通话时,如果一个人说了一句话,对方在几秒后才能听到,用户就能明显感知到延迟。

如果三种应用共用一个队列,队列中会充满大量视频播放应用的报文,导致语音通话、在线游戏的报文迟迟无法发送,增大了这两种应用的延迟。

Flow Queue 为视频播放、语音通话、在线游戏各维护一条队列,并公平地调度三个队列,避免视频播放的报文占用太多时间,从而让在线游戏、语音通话的报文得到及时处理。由于 Flow Queue 确保了应用程序之间的「公平」(fair),所以又被称做 Fair Queue。

CoDel

我们已经知道,适当长度的队列,能够充分利用带宽、提高吞吐量。但过长的队列,又会导致过大的延迟。也就是说,队列既不能过长、也不能过短。

CoDel 所做的,就是让队列维持在合适长度,最大限度地提升网络性能。

CoDel 通过计算报文在队列中的停留时间,来判断队列是否过长。具体做法如下:

  1. 报文进入队列时,在报文上记录当前时间(也就是报文入队时间
  2. 报文出队列时,再次获取当前时间(报文出队时间
  3. 计算报文入队时间与出队时间的差值,即可得到报文在队列中停留的时间
  4. 当报文在队列中的停留时间超过阈值,说明队列过长,需要缩小队列长度

当队列过长时,CoDel 会直接丢弃出队列的报文,从而减少队列中报文的数量,达到控制队列长度的效果。(这种对报文的丢弃,并不会对网络带来负面影响,具体请见后续章节)

CoDel 示意图

可以看出,CoDel 根据队列中报文的停留时间,来决定是否丢弃报文。而不是「一刀切」地将队列限制在一个固定的、较小的长度。这样既能降低延迟,又保留了队列最大的优点:吸收短暂的大流量报文、提升吞吐量。

另外,我们的设备,尤其是手机等移动设备,所处的网络环境是复杂多变的。例如手机靠近或远离无线路由器,就有可能导致网络带宽的变化。CoDel 通过计算报文停留时间的方式控制队列,能够更加灵活地适应网络带宽、网络质量的变化。

fq_codel

Flow Queue 确保了不同应用程序的流量能够公平传输。CoDel 控制队列长度,实现了整体延迟的降低。fq_codel 就是将 Flow Queue 和 CoDel 结合在一起使用的机制。

其中,Flow Queue 先将不同的流划分为不同的队列,再为每一个队列使用 CoDel,控制报文的延迟。两者结合使用,共同提升网络体验。

fq_codel 具有免配置、天然适应不同的网络环境、实现简单、消耗资源少等特色,越来越多的无线路由器(以及开源的路由器操作系统),开始内置这一机制。

参考 KoolShare 上的这篇帖子,作者经过测试,发现打开 fq_codel 之后,在 BT 下载占满上行带宽时,在线游戏依旧保持较低的延迟:

是否需要打开「智能队列」?

前面介绍了 fq_codel 的一系列优点。那么,fq_codel 有没有缺点?是否需要我们打开?

我的设备 CPU 性能不强,是否可以打开「智能队列」?

根据这篇帖子,ER-X 路由器在打开 fq_codel 时,最大支持 200M 左右的带宽。

ER-X 使用的是 MT7621 CPU。从这个页面可以看到,我们熟悉的小米路由器 Pro、斐讯 K2P 等,都采用了这一系列的 CPU。也就是说,如果宽带带宽小于 200M,使用这些路由器,「智能队列」对网速基本不会有太大影响。

当然,在家用路由器上,不同人有着不同的方案:从百元以下、到千元以上的无线路由器,都有不少人在使用;还有一些人使用有线路由器、软路由,甚至企业级网络设备。

不同的设备,在 CPU 性能上存在很大的差异。还有一些设备,虽然 CPU 性能较弱,但使用了专门的硬件来处理报文。对于 CPU 性能不足的设备,一旦打开了「智能队列」,CPU 就需要参与更多的运算来处理报文,影响报文转发速度。

虽说 fq_codel 是一个简单的算法,占用 CPU 资源相对较少。但考虑到家用网络设备的多样性,还是需要经过实测,才能决定是否要打开该功能。

我家的宽带速度较快(100M 以上),是否还有必要开启「智能队列」?

很多人已经用上了 200M、500M 甚至 1000M 的宽带。而大部分应用跑不满这么大的带宽,即使家里的多个人一起用宽带,也很难把带宽占满。对于这样的宽带,是否有必要开启「智能队列」呢?

大部分家庭宽带,上传和下载带宽是不对等的。例如一个 200M 的宽带,上传带宽可能只有 20M。而很多协议需要客户端和服务端的双向交互(例如 TCP,接收端要向发送端发送确认报文),如果上传速度受到限制,也会影响到下载速度

所以对于下载带宽大,但上传带宽小的环境,使用「智能队列」也有利于提升上网体验。

但是,流量速率越快,fq_codel 处理报文消耗的 CPU 资源也就越多。如果带宽较大,CPU 可能处理不过来大速率的报文。所以,最终还是要综合考虑宽带带宽,和网络设备的 CPU 性能,来决定是否要打开「智能队列」。

「智能队列」会主动丢弃报文,会不会对网络造成负面影响?

fq_codel 控制队列长度,是通过主动丢弃报文来实现的。或许读者们会有疑问,主动丢包是否会对网络有负面影响?是否会导致传输数据的缺失?

其实,Internet 被设计成分组交换的方式,丢包是很常见的现象。对于视频通话等使用的 UDP 协议的应用,少量丢包不会有太大的影响;对于网页浏览等应用使用的 TCP 协议,其本身的重传机制,也能确保数据全部正确传输。

另外,TCP 协议还拥有拥塞控制机制,能够自动调整数据发送速率。大部分拥塞控制算法在检测到丢包时,能够自动降低发送速率。所以,fq_codel 的丢包,还可以反馈到 TCP,让 TCP 协议主动降低数据发送速率,进一步缓解 bufferbloat。

总之,fq_codel 的丢包并不会对网络带来太多负面影响。

结论

在网络设备的 CPU 性能足够的情况下,打开「智能队列」,能够在一定程度上提升上网体验。推荐有条件的用户打开该功能。

但是,如果家庭网络环境特殊,例如路由器性能差、上下行带宽都非常充足等情况,fq_codel 的作用就没有那么大了。如果不确定是否需要打开,还是建议亲自测试一下,观察该功能对上网体验的影响。

参考资料与延伸阅读

在常用的无线路由器操作系统上设置 fq_codel:

CAKE 是一种新的队列管理机制。它吸收了 fq_codel 的优点,并在 fq_codel 的基础上增加了更多新特性。如果自己的路由器支持 CAKE,建议直接用 CAKE 代替 fq_codel:

如何进一步优化家庭网络、降低网络延迟:

fq_codel 基础知识:

关于 Bufferbloat 的更多介绍:

本文介绍了 Linux 网络协议栈中的「队列」。通过阅读本文,可以更清晰地了解报文在网络设备内部是如何处理的:

传统的 TCP 拥塞控制算法倾向于填满队列,可能会加剧 bufferbloat。所以除了 fq_codel,还可以通过优化 TCP 拥塞控制算法,来缓解 bufferbloat。最近几年流行的 TCP BBR,就是一种新的拥塞控制算法:

本文中的图片素材来自 www.flaticon.com,作者分别是 FreepiksripsurangxnimrodxVitaly Gorbachevphoto3idea_studio。题图来自 Unsplash,作者是 Jonathan

笔者对 fq_codel 的了解还不够深入。如果发现文章中有错误,请在评论区留言指正。

对于家庭网络的更多内容,可关注我在 GitHub 上创建的 Awesome List。欢迎提交 issue 和 pull request:

本文首发于少数派,原文链接:https://sspai.com/post/64870

]]>
https://blanboom.org/2021/smart_queue/feed/ 0 2044
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 上的拆机图:


Update (2021-06-20):

UniFi Dream Machine 的操作系统,已经更新至 UniFi OS。与本文中介绍的内容略有差异。

目前,在 GitHub 上,已经有人为 UniFi Dream Machine 适配了一系列第三方工具和内核,例如 ntopng 等,使 UniFi Dream Machine 能够实现更多功能:


> 本文首发于少数派,同时发布于我的博客,欢迎关注: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 系列是我使用的第一个较为专业的 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
UniFi Dream Machine 使用体验(1):开箱与设置 https://blanboom.org/2019/udm-1/ https://blanboom.org/2019/udm-1/#comments Sun, 29 Dec 2019 11:01:31 +0000 https://blanboom.org/?p=1697 阅读全文]]> 今年 11 月份, UniFi Dream Machine(UDM)正式发布,并于 12 月 11 日在国内上市。这是一款我今年比较期待的网络设备,知道消息后我立马在第一时间购买,在经历了海淘失败等小插曲之后,终于在前段时间拿到。

在本文和接下来的几篇文章中,我将从开箱与设置、特色功能、系统探索、缺点与不足等方面,分享一下我的使用体验。不过暂不涉及性能方面的测试。

什么是 UniFi Dream Machine (UDM)

关于 UniFi

UniFiUbiquiti 推出的商用 Wi-Fi 系统。由于其配置相对简单,且有着易用的 Web 界面移动 App,所以也受到了一部分家庭用户和网络爱好者的喜爱。当然,Ubiquiti 也推出过更加易用、但功能没有 UniFi 丰富的家用产品 Amplifi

UniFi 主要包含如下硬件:

虽然 UniFi 无线 AP 可以独立工作,但为了获得完整的 UniFi 体验,一些用户会同时购买无线 AP、安全网关、交换机、管理控制器等,并将其称做「UniFi 全家桶」。

UDM: 真正的 UniFi 全家「桶」

一直以来,UniFi 的每一个硬件,都有着自己的功能。想组建一个完整的 UniFi 系统,需要购买一整套 UniFi 硬件,且组网和配置都会花费掉不少时间。

而 UniFi Dream Machine 将无线 AP、网关、交换机、管理控制器整合在一台设备中,对于家庭用户,能够快速安装和配置,降低了学习成本和时间成本。

由于 UDM 集成了多个 UniFi 硬件,而且圆柱形的造型,确实像一个「桶」,所以被称为真正的 UniFi 全家「桶」

UDM = SOHO 无线路由器?

其实,我们常见的家用无线路由器(SOHO 无线路由器),也包含了路由器、防火墙、无线等多种功能。那么,UniFi Dream Machine 是否也可以被称做 SOHO 无线路由器?它跟普通的家用无线路由器,有什么样的区别?

其实,从功能上看,个人认为 UDM 就是我们所说的 SOHO 无线路由器。只不过是在普通无线路由器的基础上,增加了 UniFi 的特色功能,同时实现了其他 UniFi 设备的集中管理与控制。搭配更多的 UniFi 交换机、无线 AP、Mesh 节点,能够方便地扩展网络范围。

开箱

包装盒:

UDM 包装盒正面
UDM 包装盒正面
UDM 包装盒背面
UDM 包装盒背面
UDM 包装盒侧面
UDM 包装盒侧面
UDM 正面
UDM 正面
UDM 背面
UDM 背面

底部有一个复位按键,和一圈排气孔。橡胶材质感觉很容易脏:

UDM 底部
UDM 底部

配件只有一条电源线,不包含网线。电源线的两端自带魔术贴,可以与网线固定在一起,方便理线:

UDM 电源线
UDM 电源线

与 iPhone XR 的高度对比:

UDM 与 iPhone XR 高度对比
UDM 与 iPhone XR 高度对比

与 Synology DS918+ 的高度对比:

UDM 与 DS918+ 高度比较
UDM 与 DS918+ 高度对比
UDM 与 DS918+ 高度比较
UDM 与 DS918+ 高度对比

基础设置

内置了蓝牙是 UniFi 和 Amplifi 产品的一大特色,所以可以在手机、平板上快速发现、设置设备,无需中断原有的网络连接。

先来尝试一下在移动设备上,通过蓝牙进行初始化。只需要打开 UniFi Network App,即可通过蓝牙自动发现 UDM。不过这个界面,跟 AirPods 的连接动画简直一模一样😂

UniFi Network App 通过 BLE 发现 UDM 时的动画
UniFi Network App 通过 BLE 发现 UDM 时的动画
UniFi Network App 通过 BLE 发现 UDM 时的动画(如果视频无法观看,请单击此处下载)

当然,也可以使用 Web 界面进行配置。Web 界面同样具有精美的 UI 和动画,至少是我见过的路由器里面,设置界面最漂亮的一个。根据我的习惯,还是使用了 Web 界面进行设置。

打开页面,首先 UDM 会尝试通过 DHCP 方式,自动进行配置:

UDM 设置页面:自动连接到 Internet
UDM 设置页面:自动连接到 Internet

对于 PPPoE 接入,则需要手动设置:

UDM 设置页面:PPPoE 设置
UDM 设置页面:PPPoE 设置

Internet 设置完成后,是一段效果十分炫目的欢迎动画。这段动画让我想起了第一次使用 Mac OS X ,看到开机欢迎视频时给我带来的惊喜感。

UDM 设置页面:欢迎动画
UDM 设置页面:欢迎动画

然后进行 Wi-Fi、自动更新等设置,并登录 UI.com 账号。这个账号默认就是管理员账号,支持双因素认证:

UDM 设置页面:登录 UI.com 账号
UDM 设置页面:登录 UI.com 账号
UDM 设置页面:设置自动优化网络等
UDM 设置页面:设置自动优化网络等

接下来进行网速测试。测速完成后,如果带宽在 300M 以下,UDM 会自动根据测试结果,设置智能队列,提升上网体验:

UDM 设置页面:测速
UDM 设置页面:测速
UDM 设置页面:测速完毕
UDM 设置页面:测速完毕

最后自动更新固件,设置完毕:

UDM 设置页面:安装更新
UDM 设置页面:安装更新
UDM 设置页面:设置完毕,进入控制器首页
UDM 设置页面:设置完毕,进入控制器首页

完整的设置视频:

UDM 完整设置过程(如果视频无法观看,请单击此处下载)

配置转移

经过上述步骤的初始化设置之后,UDM 即可正常使用了。不过在我的旧路由器上,还有防火墙、端口转发等设置。这些设置无法方便的转移到 UDM 上,所以需要手动配置一遍。

防火墙设置:

UDM 防火墙设置
UDM 防火墙设置

固定 IP 设置,支持批量添加:

UDM 静态 IP 设置
UDM 静态 IP 设置

端口转发设置:

UDM 端口转发设置
UDM 端口转发设置

我也整理了一个配置转移 checklist,如果有更换路由器的需要,可以参考这一清单进行设置:

家用路由器配置转移 checklist:
- SSID、密码等基本配置
- LAN 网段
- DHCP 服务器为局域网设备分配的固定 IP
- 防火墙规则
- 端口映射规则
- 限制物联网设备、摄像头等访问 Internet
- DDNS、SSL 证书等(如果需要通过 HTTPS 访问路由器管理页面)

经过了上述设置,UniFi Dream Machine 就基本可用了。在下一篇文章中,我将分享 UDM 上,我认为最有特色的一些功能。

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

]]>
https://blanboom.org/2019/udm-1/feed/ 2 1697
RT1900ac 路由器折腾笔记:安装 Homebridge 和 Plex Media Server https://blanboom.org/2017/plex-on-rt1900ac/ https://blanboom.org/2017/plex-on-rt1900ac/#comments Sat, 10 Jun 2017 02:12:09 +0000 https://sandbox.blanboom.org/?p=336 阅读全文]]> RT1900ac 是群晖 (Synology) 推出的第一款无线路由器,其操作系统 SRM 相当于简化版的 DSM(群晖 NAS 所使用的操作系统),在软件上较有优势。

可能是因为硬件性能,或是其他方面的考虑,群晖官方一直没有把其 NAS 上的大部分软件移植到 SRM 上,例如 Cloud Sync, Video Station 等,此外一些第三方软件,例如 Plex Media Server, 也没有推出兼容 SRM 的版本。

最近在网上看到了一篇在 RT2600ac 上安装 Plex Media Server 的教程,于是又有了折腾路由器的想法,开始在 RT1900ac 上安装自己需要软件。

运行在 RT1900ac 路由器上的 Plex Media Server

安装 Plex Media Server

Plex Media Server 是一套功能较为丰富的媒体服务器软件,能够集中管理电影、照片、音乐等媒体,支持在 PC、服务器、NAS 等设备上安装,同时提供了电脑、手机、机顶盒和游戏机上的客户端。Plex Media Server 提供了群晖 NAS 的版本,但不包含 RT1900ac.

由于 RT1900ac 采用的是双核 1GHz 的 ARM 处理器,而群晖部分型号的 NAS 也采用了 ARM 处理器,所以 ARM 版本的 Plex Media Server, 经修改之后,也可以在路由器上运行。

具体的安装过程,参考这篇文章:

How to: Run Plex Media Server on the Synology RT2600ac Router

其中安装包 .spk 文件中的 INFO 文件,包含了该软件支持的 CPU 架构。原文为了支持 RT2600ac, 添加了 "ipq806x", 对于 RT1900ac, 修改为 "northstarplus" 即可。

修改 .spk 中的 INFO 文件

经过测试,按照此教程,能够在 RT1900ac 上正常安装 Plex Media Server, 使用一段时间后,没发现太大问题。不过,由于 RT1900ac 的 CPU 和内存有限,建立索引需要消耗较长时间,转码功能也基本不可用。所以想要体验完整功能,还是需要一台 NAS.

按照这种方法,也可以安装 DSM 上的其他软件,但其中缺少的 lib 可能需要手动添加。相关的安装方法可参考这篇文章:

Audio Station on Synology RT1900ac router

安装 Homebridge

Homebridge 是一个兼容 HomeKit 的家居自动化服务器,通过插件,能够将多种不同种类的智能硬件接入 HomeKit. 在国内,常见的用法是将 Yeelight, 或者小米网关与 Homebridge 连接,实现通过 iOS HomeKit 控制智能家居硬件。

做为一个 Node.js 项目,首先想到的安装方法,就是通过 Entware-ng 安装 Node.js 和 npm, 再通过 npm 安装 node.js. 但发现 Homebridge 需要依赖 mdns 等组件,而 mdns 包含 C/C++ 代码,编译过程中需要 avahi 的 lib 和头文件,而这些文件 Entware-ng 没有提供。自己编译 avahi 觉得太麻烦,所以开始尝试其他方法。

于是又找到了 Entware-ng-3x, 这是一个 Entware-ng 的 fork, 用于 3.x 内核,同时提供了安装 Debian chroot 环境的工具,安装后能够方便地 chroot 到 debian 环境,在 RT1900ac 上使用「完整」的 Linux。

首先需要安装 Entwarw-ng-3x, 安装方法与在 DSM 上的安装基本没有区别,具体可参考这三篇文档:

安装过程中,有这几点需要稍加留意:

  1. Entware-ng-3x 和 debian 环境需要占用较大空间,在外界移动硬盘的情况下,建议安装在 /volumeUSB1/usbshare/@entware 目录
  2. 安装 debian 环境前,最好修改 /opt/bin/install-debian 文件,将软件源修改为国内源,例如 http://mirrors.ustc.edu.cn/debian/,以提高下载速度
  3. 由于 RT1900ac 的 CPU 支持硬件浮点运算,可在安装前,将 /opt/bin/install-debian 中的 ARCH=armel 修改为 ARCH=armhf, 从而提高程序运行效率

安装完成后,通过 start-debian 即可进入 debian 环境。后续通过这篇教程即可安装 HomeBridge, 此处不再详细介绍。

chroot 环境下的 debian 服务无法开机自动启动,如果需要 HomeBridge 开机自动运行,还需修改 /opt/debian/chroot-services.list 文件,添加 dbus, avahi-daemon, homebridge 三行内容。

debian chroot 服务列表

最后,可根据自己的情况安装合适的 HomeBridge 插件,即可在 iOS 上对相关硬件设备的控制。

iOS Home App

]]>
https://blanboom.org/2017/plex-on-rt1900ac/feed/ 2 336