为什么我构建了自己的自制 Linux 路由器

目前还没有读者喜欢这篇文章。
Is Occupy Wall St. really an "open source protest?"

Opensource.com

在过去的几个月里,我一直在讨论使用标准 Linux 发行版的裸安装作为路由器。我 在 Ars Technica 上写过关于它的文章,我在 Great Wide Open 上做过一次演讲,下周我将在 SouthEast LinuxFest 上做另一次演讲。我必须告诉你,自制路由器是我写过和演讲过的最具争议的话题之一——有些人喜欢这个想法,但那些不喜欢的人似乎真的、真的讨厌它。

公平地说,从通用服务器发行版设置你自己的路由器并不是适合每个人的项目。无论是在构建过程中还是在完成后,它肯定都不方便用户使用。虽然它不是特别复杂,但它绝对是神秘的,一路上没有任何手把手的指导。如果你还没有非常丰富的 Linux 经验,你可能会挠头思考(也许会咒骂几句)。一旦你完成了,你也不会得到一个超级功能丰富的构建——除非你为你构建做的比我做的更多,否则你不会有花哨的服务质量功能、使用情况图表,或者除了一个裸机(虽然非常高性能)路由器之外的任何东西,它可以分配 IP 地址、解析 DNS 记录、连接到互联网,并使数据包按照它们应该去的地方进行传输。

我不反对任何人指出任何这些。 实际上,我自己指出了所有这些,通常在最初的几段中。 但是,让我摇头叹息的常见抱怨是:“这将非常不安全,并且会让你被 root,这就是你应该运行专门构建的路由器发行版的原因。” 等一下——什么?

好吧,让我们谈谈安全性。 安全性不是事后才添加的东西,也不是用几千行代码构建的东西。 安全是一种心态,它是一种设计——它是你从基础上构建的东西。 提高的安全性实际上是我首先构建自己的裸机 Linux 路由器的整个原因。

我的职业迫使我对信息安全保持警惕,这就是为什么我首先想构建一个裸机 Linux 路由器。 专有路由器固件通常在升级之间间隔几个月甚至几年——而且当它确实升级时,它更频繁地是为了在 UI 中添加一些闪光点——更可能引入更多的错误——而不是为了修复安全问题。 开源固件的情况也好不到哪里去。 DD-WRT 是最流行的固件之一,虽然它每隔几周就会发布一个新的(且充满错误的)测试版,但该项目已经八年没有稳定版本了。 八年! pfSense 几乎是该行业的宠儿,这是理所当然的——但它仍然是一个庞大而复杂的移动部件堆,带有 Web 界面和漂亮的图表以及可以切换的零碎东西,你永远不会真正知道它在做什么——你单击 Web UI 中的框,然后假设它正在执行你告诉它的操作,这已经与底层配置的现实相去甚远。 它还在固件更新发布之间间隔数月(或更长时间),并且(再次)没有真正的保证更新不会更改 UI 和功能的主要部分,而不仅仅是修复错误。

对于很多人——以及企业,别误会我的意思——这完全没问题。 对于我自己的个人网络,这已经不够好了。 我想要一些最少的东西,在其中我知道实际配置的每一寸,因为是我自己编写的。 我希望获得真正频繁的安全更新,并具有主要发行版带来的那种质量保证和测试。 那些小的专业路由器发行版也只能是二流货色。

这就是我的 自制路由器 的用武之地。 不,它并不比路由器发行版“更不安全”——它的移动部件少得多得多,而且我非常了解所有这些部件。 除了我的实际配置文件外,它的每一部分每天都会自动获得安全更新。 如果 dhcpd 中存在次要的安全问题,它的补丁不会坐在队列中,直到“有足够的东西可以麻烦”进行完整的固件升级发布。 它会立即通过 unattended-upgrades 服务自动获取并修补。

我不必担心是否因为忘记单击正确的复选框而意外地将 Web 界面暴露给外部世界——因为根本没有 Web 界面。 同样,我不必担心 Web 界面中的错误是否会做类似的事情,尽管我已经选中了一个框——因为没有复选框,我所做的配置是对实际服务的真实配置,而不是一个抽象的和简化的版本,必须由几千行 PHP 代码来翻译,而这些代码得到的审查次数要少几个数量级。

因此,这让我们回到了自制路由器适合或不适合谁的话题。 它是否适合一个繁忙的管理员,他不熟悉命令行级别的 Linux 网络,包括 dhcpd、iptables 和 bind? 可能不适合——他们没有时间处理所有这些。 它是否适合一个不是对这些东西感兴趣的爱好者的家庭用户? 同样,可能不适合——他们会对配置的神秘(但最终很简单)的性质感到沮丧。

但是,自制 Linux 路由器适合一个真正对这些东西在底层如何工作感兴趣的爱好者或初级系统管理员。 设置和管理一个路由器将教会你很多东西。 它也非常适合一个已经了解大部分系统并且只需要复习一两件事就可以熟悉它的资深系统管理员——原始性能简直令人瞠目结舌,并且系统的简单性将使该资深系统管理员可以自由地以他们已经非常熟悉的方式管理和备份它。 最后,它非常适合那些极其喜欢戴锡箔帽的人(不幸的是,也像现在的我一样),因为它的精简性质使他们绝对确定他们了解它正在做什么和没有做什么,并在规划他们的安全设置时相应地进行计划。

如果你是一个感兴趣的爱好者或系统管理员,并且认为这听起来像是你想要着手的项目——或者甚至是那些认为这听起来完全疯狂,但可能花一个小时思考一下会很有趣的人——今年来夏洛特的 SouthEast LinuxFest 吧! 该活动于 6 月 10 日至 12 日举行,我的演讲应该在 6 月 11 日星期六上午 9-10 点 举行。

Jim Salter
我是位于南卡罗来纳州哥伦比亚市的雇佣系统管理员。 我第一次真正亲身接触开源软件是在 90 年代末和 2000 年代初在 FreeBSD Web 服务器上运行 Apache。 从那时起,我开始使用 Samba、BIND、qmail、postfix 以及任何其他引起我注意的东西。

16 条评论

很棒的文章,Jim! 对我来说很及时。 多年来,我一直在积极避免构建自己的路由器,因为我宁愿拥有不需要我维护的东西。 我可以管理它,但我在工作中花费了足够的时间与计算机争论,我不一定想在家里这样做(或者至少我想按照我自己的方式去做)。 但是我越来越对我的路由器最近出现的 DD-WRT 构建感到沮丧,而你的帖子是促使我咬紧牙关自己制作的又一个推动力。

很棒的文章 Jim。 虽然我使用 IPFire,但我理解你为什么要采用自制的方式。 以它自己的方式简单而优雅。 你知道你知道的那种交易。 我喜欢它!

谢谢 Jim。 我已经运行 DD-WRT 几个月了,在阅读了你的文章后,也许我应该重新考虑一下。 我有一些备用硬件。 这是一个及时的主题,我希望我能去 Southeast Linux Fest 听你的演讲。 你给了我一些需要思考的东西。 你使用什么风味的 Linux?

Don,我个人使用 Ubuntu——部分原因是我更喜欢 Debian 包管理,部分原因是 Ubuntu 提供具有明确支持周期的 LTS 版本。 我喜欢知道 14.04 LTS 于 2014 年 4 月发布,将于 2019 年 4 月到期,这意味着在 2016 年 4 月,我可以选择是否查看 16.04 LTS 的升级,如果我选择不升级,那么在 2018 年 4 月,我有一年的时间需要迁移到 18.04 LTS。

回复 作者: Don Watkins

好极了 (鼓掌)。
我在 1997 年用 Slackware 构建了我的第一个 Linux 路由器/家庭服务器。当时,Red Hat 没有及时更新,我可以利用 Slackware 构建脚本来编译更新和补丁。我使用仲裁机制让我和我的兄弟共享一个 56K 调制解调器。这并不漂亮,但至少我们俩可以同时浏览互联网。升级后,我不再需要仲裁,Fedora 从 Red Hat 分支出来,升级速度比我编写构建脚本的速度还快。我切换到了 Fedora,并将我的服务器用作虚拟环境和一个 DVR (Mythtv)。我在 2010 年购买了一个不错的 i3,它使用 CPU 的图形处理能力,配备了 10GB 内存,效果一直还不错。我对系统驱动器进行了 RAID,并为一个驱动器专门用于录制。如果我可以降低功耗,并保留虚拟机和 DVR 功能,这将是我唯一担心搞砸的平衡点。但是,BIND、dhcpd 和 iptables(使用 firewalld 实现,这是一个全新的学习体验)。我还为了好玩实现了 ipv6 NATting。最近开始实施 AD,并计划明年在 Fedora 上推出 Samba。目前为止,掌握 iptables 是最有用的(firewalld 只是设置它的一种方式,可以用来自动设置紧急模式)。

我强烈建议您安装类似 OSSEC 的东西,如果您的系统是您自己运行的。不一定是 OSSEC,但可以是某种能够动态应对攻击,并进行阻止或临时丢弃的解决方案。

我甚至没有在“通用服务器发行版”上运行,多年来,我一直运行一个基于 Linux From Scratch(一台我根据书中的说明手动编译所有内容的机器)构建的路由器,它运行良好且从未失败,但管理或进行任何花哨的操作都很痛苦。为了方便起见和易于更新,我的下一个路由器切换到了 pfSense。

去看看 BSDRP 吧... 它是为任何与您有相同观点的人准备的。 而且就性能而言,它是一头野兽。

很棒的文章。 很久以前,我感到沮丧,然后在旧的 Fedora Core Release 4 机器上做了类似的事情。 我很惊讶它有多么实用。 已经运行了大约 10 年。 但是,我将需要分解并升级它。 因为它有点耗电,并且使用标准的 IDE 驱动器。 IDE 驱动器的寿命就是这样,是时候了。 重新设置会感觉像一只心爱的宠物的死亡。 这篇文章很棒,因为我可以看到我需要去哪里。 很棒的工作,伙计们! 谢谢你的动力。

我的机器也有些耗电,但由于我将它用作 dvr 和家庭服务器,因此我不确定升级后的效果会好多少。 当然,我的比你的新得多,但我不想在提高效率的同时损失功能。

回复 作者: rwilcher

我的自制路由器运行功率为 9.2W,这是通过将其插入 Kill-A-Watr 测量的。

回复 作者: Jeff Sadowski(未验证)

我也决定自己构建一个。 我还购买了一个 Lamobo R1,因为我确定不信任 Intel 架构。 我运行一个最小的 Debian 8 系统,内核为 4.5.5,我在其中杀死了大部分服务,包括视频和 wifi(另一台机器,一个经过严重修改的 openwrt 为我提供了 wifi)。 我在那里运行我的 VPN IPsec 服务器 + asterisk + 防火墙 + NAT + DHCP + 一个带有 RPZ 的 DNS 服务器,可以切断恶意软件和广告。 我还与外界进行 dnscrypt 通信,因此我的 DNS 请求无法在传输过程中被记录/修改。 我偶尔也会在其上运行 tor 服务。 我不会将任何服务暴露给外部,除了 IPsec。 即使要通过 SSH 登录或使用 voIP 服务,我也必须通过 VPN 进入。 我对设置非常满意,并且所有更新都做得很好。

如果您想要强大而安全的软件,也许您会对两个基于 Ada 的项目感兴趣

* Ironsides (https://news.ycombinator.com/item?id=7553019) 一个“权威/递归 DNS 服务器对”,使用 SPARK(一种用于正式检查 Ada 程序的工具,参见 http://www.spark-2014.org/)进行形式验证

* ADHCP (https://www.codelabs.ch/adhcp/),Ada 中的 DHCP 实现

老实说,我从未自己使用过这些工具,也不知道它们在多大程度上得到了积极维护,但通常平均 Ada 程序比平均 C 程序少得多,并且通常语言默认插入的检查可以很容易地捕获错误(例如,您不能有“缓冲区溢出”来静默地粉碎堆栈)。 根据网站,Ironsides 应该被正式证明没有缓冲区溢出、未初始化的变量和其他便利设施。

你太棒了!

Creative Commons License此作品已根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.