Linux on Linksys Wi-Fi 路由器
无线网络已成为大众市场技术,802.11 或 Wi-Fi 设备的价格已降至商品水平。数千家竞争对手推出几乎相同的产品,争夺您的 Wi-Fi 消费。在这种竞争激烈的领域中,制造商自然会寻求成本最低的替代方案。他们的选择是什么?当然是 Linux。
Linux 已成为廉价、功能丰富的无线网络的优质操作系统。Linksys 是主要的无线厂商之一,在其 802.11g 下一代 Wi-Fi 设备中采用了 Linux。当思科在 2003 年初收购 Linksys 时,它继承了 Linux 设备以及关于未发布的 GPL 源代码的新兴争端。经过开源爱好者的几个月游说,思科让步并发布了源代码。
Linksys WRT54G 产品(图 1)因其低廉的价格和内部硬件而特别引人注目。WRT54G 包含一个四端口以太网集线器、一个以太网 WAN 端口,支持新的高速 54MB/s 802.11g 无线协议,并向后兼容较旧的 802.11b 设备。
但 WRT54G 缺少的东西才是它引人入胜之处。在机箱内部,该设备配备了一个 125MHz MIPS 处理器和 16MB 内存。这足以运行一些严肃的应用程序,那么为什么不添加一些呢?
Linksys 网站上的最新源代码大小约为 145MB,包含用于 MIPS 交叉开发的完整工具链(请参阅“Linksys WRT54G 源代码树”侧边栏)。
按照 WRT54G/src 子目录中 README 文件中的说明创建符号链接和 PATH 添加。然后cd到 router 子目录并运行make menuconfig。为您的首次构建保留标准选项,然后点击完成以创建您的配置文件。cd返回上一级到 WRT54G/src 目录并输入make。这就是全部。一个名为 code.bin 的文件在 WRT54G/image 目录中创建,其中包含压缩的 cramfs 文件系统和一个 Linux 2.4.20 内核。
现在到了可怕的部分——如何将这个新固件安装到您的 Linksys 上?有两种方法,通过 tftp 或通过基于 Web 的固件升级界面。我建议您第一次尝试使用 Web 升级。
浏览到您的 Linksys 设备——默认地址为 192.168.1.1——并登录。从“管理”菜单中选择“固件升级”并上传您的 code.bin 文件。路由器现在重新启动。恭喜,您刚刚改装了您的 Linksys 设备。
WRT54G 上 Linux 的存在是通过“诊断”菜单中 ping 实用程序中的一个错误发现的。1.42.2 之前的固件版本允许从 ping 窗口运行任意代码,如果代码用反引号包围。如果您有一个运行旧固件的设备,请尝试输入`ls -l /`在 ping 窗口的 IP 地址字段中。 瞧——根目录的列表神奇地出现了。
ping 漏洞允许好奇的人在不修改源代码的情况下探索他们的设备。但是通过 ping 窗口进行探索是缓慢且乏味的。我们真正需要的是设备上的 shell。
通过扩展源代码中的 ping 漏洞,可以创建一个自定义固件镜像,通过 Web 界面提供 Linux shell 的全部功能。请参阅在线“资源”部分中的 URL,了解如何创建命令 shell。
但是为什么要止步于此呢?默认固件的 cramfs 文件系统留出了 200K 的闪存空间。这里有足够的空间容纳许多有用的应用程序,例如 telnet 或 Secure Shell,甚至可能是 VPN 客户端或服务器。
Linksys 以二进制形式提供的唯一有用的命令是 wl。wl 命令包含数十个控制无线设置的内部命令,包括流行的功率调整设置。输入wl不带参数将生成其所有功能的完整列表。
WRT54G 上的默认功率设置为 28 毫瓦,并且此设置无法从外部更改。但是通过使用 ping 漏洞或 shell,您可以使用 wl 和 txpwr 子命令以及介于 1 到 84 毫瓦之间的数字来更改此设置。此数字会提高或降低默认功率设置,直到下次重启。
提高功率设置或更换原装天线可能会增加您的无线电输出并违反当地法律。如果您更换原装天线并降低功率设置,您的设备范围可以显着扩展,同时仍保持在合法的无线电功率限制内。
WRT54G 支持两个外部天线,并根据哪个天线接收到最后一个活动数据包自动在它们之间进行平衡。当添加更强大的外部天线时,这不是您想要的设置。您需要强制设备每次都选择高功率天线。这可以通过以下方式完成:wl txant用于接收,以及wl antdiv用于发送。参数 0 强制左天线耦合,参数 1 强制右天线耦合,当您面对前面板时。
一位有进取心的人将整个 OpenSSH 工具链移植到了 Linksys 设备上。不幸的是,OpenSSH 二进制文件的大小意味着必须删除许多标准的 Linksys 功能才能腾出空间。此外,由此产生的 RAM 要求已达到可用内存的极限。我们需要的是一个内存占用小的 SSH 服务器,而 Dropbear 服务器非常适合。Matt Johnson 专门设计了 Dropbear SSH 守护程序,以在内存受限的系统(如 Linksys)中运行。
标准的 Linksys Linux 实现缺少多用户 Linux 系统所需的许多标准文件。其中两个——/etc 目录中的 passwd 和 groups——是绝大多数 Linux 应用程序所必需的。为了运行 Dropbear 服务器,我们需要将这些文件添加到 Flash 构建中。
通过创建一个包含 root 条目且没有密码的 passwd 文件和一个匹配的 groups 文件,我们可以使 Dropbear 几乎足以运行。这些文件被复制到 Flash 镜像的 /etc 目录,并且在 Linksys 上是只读的。
运行时,Dropbear 还需要访问用于 SSH 握手和身份验证的私钥,以及包含已批准客户端机器公钥的 known_hosts 文件。使用 dropbearkey 程序生成私钥非常简单,但将其存储在 Linksys 上有点棘手。
WRT54G 包含一个键名和值对的哈希映射,位于称为 nvram 的非易失性存储器中。捆绑的 nvram 实用程序和 API 允许我们读取和写入此内存区域。Dropbear 私钥和我们主目录 .ssh 目录中 id_rsa.pub 中的公钥 ID 存储在 nvram 中,并在系统启动时复制到 RAM 磁盘中的 /var 中。
我们编译了支持密钥文件授权的 Dropbear,现在有一种安全的方式登录到 Linksys。如果您需要密码登录,可以修补 Dropbear 代码以从 nvram 读取系统密码,并添加密码登录功能。
在添加 SSH 和 telnetd 等实用程序后,您很快就会发现您的 Linksys 固件镜像触及了设备上闪存存储空间的限制。您需要的是一种比 cramfs 提供更好压缩的文件系统,一种与 Linksys Linux 内核兼容的文件系统。
默认的 cramfs 文件系统以 4K 块压缩数据,但在 4K 边界上压缩限制了可以实现的压缩率。如果我们能找到一种压缩较大块数据但正确映射到操作系统页面大小的文件系统,我们将能够在固件中放入更多的数据和应用程序。
Phillip Lougher 的 squashfs 文件系统以 32K 块压缩,并且与 2.4 和 2.6 内核兼容。如果我们能将 Linksys 固件从 cramfs 迁移到 squashfs,我们可能有足够的空间在系统中安装 VPN 客户端和服务器。
Linksys 内核是由 Broadcom 修改的定制 2.4.20 源代码树。Broadcom 是领先的 802.11g 芯片制造商,负责 WRT54G 中的 CPU 和无线电芯片。squashfs tar 文件包含用于 2.4.20 到 2.4.22 内核的补丁。不幸的是,这些补丁都无法完全应用于 Broadcom 内核树,因此需要进行一些手工编辑。错误最少的补丁是 2.4.22 版本,该版本在应用时仅缺少一个代码块。通过读取补丁文件并找到丢失的代码块,您可以手动修补丢失的代码。您还可以在 Sveasoft 网站上找到特定于 WRT54G 的 squashfs 补丁。
Linksys WRT54G 源代码树
当您从 Linksys 解压缩 GPL 源代码时,会在主 WRT54G 子目录下创建一个目录结构。以下是对重要部分的解释。
主 tarball 目录是 /WRT54G。主 Makefile 位于 /release/src。解压缩源代码后,请阅读此处的 README 文件,了解如何编译它。
与 Linksys 设备打包的所有应用程序都从 /release/src/router 构建。如果您想添加应用程序,请在此处执行,并修改此目录中的 Makefile。此 Linux 内核源代码树已由 Broadcom(WRT54G 中无线芯片和 CPU 的制造商)修改。在此处添加您的内核修改或补丁:/release/src/linux/linux。
您需要从 /opt 创建一个到此处 brcm 目录的符号链接:/tools/brcm。brcm 下的两个子目录必须添加到您的 PATH 中。有关更多信息,请参阅上面的 README 文件。
补丁和更新的源代码可以从 Sveasoft 下载。有关更多信息,请参阅“资源”。
下一步是编辑 Broadcom 内核启动代码并添加对 squashfs 的检查。do_mount.c 文件包含几乎相同的代码,可以在修补 arch/mips/brcm-boards/bcm947xx 子目录中的 startup.c 文件时用作指南。
在修补内核之后,必须修补路由器 Makefile 以生成 squashfs 镜像,并且必须设置 Linux 内核配置以包含 squashfs 支持。
然而,这非常值得付出努力。重新编译后,您应该会发现大约有 500K 的可用字节,而使用原装 cramfs 文件系统则没有。
标准的 WRT54G 是无线接入点 (AP)。这意味着它可以与无线客户端通信,但不能与其他无线接入点通信。使用无线分布式系统 (WDS) 将其链接到其他接入点或充当无线客户端的能力可以使用 wl 命令实现。
无线分布式系统是一种 IEEE 规范,允许无线接入点在广域网中链接在一起。虽然这样做会带来一些性能损失,但最终结果是一个扩展的无线网络,其范围比使用单个 AP 可用的范围大得多。
为了使用 WDS 将两个 AP 链接在一起,必须知道它们各自的 MAC 地址。登录到每个设备并运行命令wl wds [Mac 地址],使用对方机器无线接口的 MAC 地址。然后,每个设备上都会出现一个名为 wds0.2 的新设备,并且可以分配 IP 地址。一旦分配了 IP 地址并在两个设备之间设置了路由,您就可以从一个设备 ping 另一个设备。
每个 WDS 链路都会导致网络内的数据流量加倍。由于 802.11g 是半双工的,这会将网络吞吐量减半。如果 AP 以 54MB/s 的速度运行,如果您将链路保持在三个或更少,则性能损失不大。
一种更简单的桥接形式是将一个设备设置为客户端,并使其链接到接入点。这称为以太网桥接,并且专门为此目的存在多种产品。
必须在 Linux 内核构建菜单中选择客户端模式并在内核中编译。完成后,内核将与 Broadcom 二进制模块一起构建,该模块包括对 AP 和客户端模式的支持。命令wl ap 0将设备设置为客户端模式,以及wl join [SSID]将其链接到接入点。如果您在客户端中使用接入点的 IP 地址作为默认网关设置路由,则客户端会自动路由到接入点,并且您的桥接将变为活动状态。可以设置多个 AP 和客户端对作为上述 WDS 方法的替代方法。
Linux 已经渗透到从超级计算机到嵌入式系统的所有领域,包括 Linksys。转向 Linux 是在竞争激烈的市场中追求最高性能与最低成本平衡的结果。许多类似的无线路由器,例如 Belkin F5D7230-4、Buffalotech WBR-G54 以及 ASUS WL-300g 和 WL-500g,都在其固件中使用 Linux,并且此列表每天都在扩大。不幸的是,这些公司都没有遵守 GPL 要求并发布源代码。撇开法律问题不谈,在功能和特性方面,这些产品在一段时间内将远远落后于 Linksys 开源产品。
包含惊人新功能和特性的 Linksys 固件构建每天都在出现。在撰写本文时,适用于 Linksys WRT54G 的固件构建(支持 VPN、功率调整、天线选择、客户端和 WDS 模式、带宽管理以及更多功能)可从多个来源获得。互联网与开源代码相结合可以将小型 SOHO 无线路由器变成强大的多功能设备。
一个警告:使用实验性固件可能会损坏您的设备,并且可能违反 Linksys 保修。如果您是普通用户并且需要家庭或小型办公室访问无线网络,那么这绝对不适合您。请改用官方 Linksys 固件版本。
但是,如果您愿意冒险损坏您的设备并尝试其潜力,您可能会发现它的功能远超产品包装上列出的规格——这要归功于 Linux 和开源开发的力量。
本文资源: /article/7609。
James Ewing (james.ewing@sveasoft.com) 是一位企业家和软件开发人员,拥有超过 20 年的经验。他最初来自加利福尼亚州,十年前移居瑞典,现在在他的妻子和两个孩子以及在 Muppet 秀中练习他正宗的瑞典厨师表演之间平衡时间。