用面向 DD-WRT 的高级提示和技巧向无线路由器添加 Linux 功能
安装、保护并简化由 DD-WRT 助力的无线路由器
简介
DD-WRT 是一种基于 Linux 的固件,可为低端的客户无线宽带路由器增效,可以将一个价值只有 70 美元的玩具转变成一个强大的网联动力室。DD-WRT 为这些小设备带来了 Linux 网络栈的全部功能:有线和无线路由、防火墙、QoS、DHCP 服务器和转发器 (forwarder)、RADIUS 服务器、OpenVPN、VLAN、wake-on-LAN、Wireless Distribution System 转发器模式、Kai 游戏引擎、WPA2 加密和验证等等(参见 参考资料)。DD-WRT 提供了一个很棒的 Web GUI 管理接口以及强大的可脚本化的命令行工具。
接下来,您将了解如何获得 DD-WRT、设置安全的 GUI 和命令行管理以及如何探测和配置硬件。
Sebastian Gottschall,又称为 BrainSlayer,是 DD-WRT 的主创者和维护者。DD-WRT 团队则由一个核心开发团队和社区贡献者(参见 参考资料)组成。DD-WRT 对于非商业使用是免费的。商业用户必须付费获得许可。还有很多专业服务的选项,您可以在 DD-WRT 商店购买好的硬件组件,比如 Ubiquiti 和 Senao。欢迎您在论坛内捐赠硬件和资金,以及帮助其他用户。
受支持的 OEM 设备
DD-WRT 是针对基于 Atheros 和 Broadcom 的 IEEE802.11a/b/g/h/n 无线路由器而设计的,比如 Linksys WRT54GL,它实际上还把支持 DD-WRT 作为其卖点。DD-WRT 项目的一个很有价值的特性是它有 受支持设备的数据库 和 不兼容设备的列表。请先查阅这些信息。不要为了一个不受支持的路由器而浪费时间,除非您有兴趣测试它并将您的新发现贡献给社区。
Broadcom 路由器的最低构建只有 2MB 闪存,但仍提供了比供应商最初的固件还要多的功能。基于 Atheros 的路由器需要至少 4MB 闪存。受支持设备的数据库很有帮助,它列出了设备的指标。
您可能都无需亲自安装 DD-WRT,因为有越来越多的供应商现在都预载了 DD-WRT。Buffalo、Netgear、ASUS、Linksys 和 Toplink 均宣称自己的路由器 “预载了 DD-WRT 固件”。
安装
具体的路由器 不同安装也不尽相同。我使用的是 Cisco/Linksys WRT160NL 宽带路由器。这是一款很棒的小工具:四个 Ethernet LAN 端口、一个 WAN 端口、8MB 闪存和 32MB RAM、MIMO,以及一个用于连接到外部存储设备的 USB 端口,因此它可以充当一个文件或媒体服务器。
受支持列表内的所有路由器均具有详细的安装指导(请谨遵指导)。不要即兴发挥,则一切就会顺利。您会看到很多警告,提示说对安装过程的任何中断都将会 “砖化” 您的路由器。砖化的意思是路由器无法启动,所以您最好引以为戒。若真的砖化了路由器,可以参考 DD-WRT 维基(参见 参考资料)内的 “Recover from a bad flash” 部分。软件受损程度有可能极深以致无法刷新 (reflash),路由器真的成为了一个砖头,但在现实生活中,这种情况很少见。
Web 浏览器也不总是那么合作,您在使用 Web GUI 时有可能会遇到麻烦。但您若能进行正确的配置更改,页面应该会自动刷新。如果它变成空白,那么您的更改就未保存,因此必须清空浏览器缓存、重启浏览器并再次尝试。
启用 Boot Wait:无砖化保障
默认的登录名是 root,默认的密码是 admin,路由器的默认 IP 地址是 192.168.1.1。要打开 DD-WRT Web GUI,可以将相邻 PC 上的 Web 浏览器指向 http://192.168.1.1。
在做其他操作之前,访问 Administration > Management 页面,并检查 Boot Wait 是否启用,如 图 1 所示:
图 1. 总是启用 Boot Wait

应该默认启用该选项。它在 root 创建了一个五秒的延迟,所以如果您的路由器变得无法启动,那么就可以利用这个短暂的时间窗口来刷新固件。可以将此视为是无砖化保障。
Save、Apply Setting 以及 Reboot Router
Web GUI 内的每个配置页都在底部具有 Save 和 Apply Setting 按钮,有时还会有 Reboot Router 按钮。Save 按钮会保存所做的更改,而不应用它们,所以在路由器重启或单击 Apply Setting 按钮之前,更改是不会被激活的。Apply Setting 则会立即保存并应用所做的更改,并在需要时重启服务。Reboot Router 按钮则是为了那些需要重新启动的更改所设(请先确保您保存了这些更改)。
与路由器进行安全会话
通过全面且组织良好的 DD-WRT Web GUI 可以处理大多数的管理任务。图 2 显示了路由器上这个 GUI 的样子。(查看 图 2 内图像的放大版。)
图 2. DD-WRT Web GUI 包含了有关配置和状态的丰富信息

它默认支持 HTTP,而这是一些纯文本,很不安全,所以在 Administration > Management > Web Access 内将其更改为 HTTPS-only 来加密 DD-WRT Web 管理。单击 Apply Setting 以立即保存并激活更改,并退出现有的会话。清空浏览器缓存,重启浏览器,然后将其指向 https://192.168.1.1。(或路由器的 IP 地址,如果您更改了的话。)您首次这么做时,将会收到由 NewMedia-NET GmbH 认证的有关站点证书的吓人警告。继续并永久接受它。您可以生成自己的证书并使用您自己的证书授权,而这是一个有趣的话题,值得我们改天讨论。
您也可以从命令行管理 DD-WRT,而这可以让您得以访问不受 Web GUI 支持的那些配置选项。如果 Web GUI 出现故障,它还可以为您打开通向路由器的另外一扇门。Telnet 默认启用,而 SSH 则没有。您可以以这种方式使用您自己的路由器的 IP 地址 telnet 到路由器:
$ telnet 192.168.1.1 DD-WRT login: root Password:
无论您配置的用户名是什么,登录名总是 root,密码则是您创建的实际密码。键入 exit 可关闭 telnet 会话。随着您对 DD-WRT 的熟悉,Telnet 应该没有什么问题,但是由于 telnet 很不安全,因此必须在生成路由器上禁用它并使用 SSH 作为替代。请通过 Services > Services 来完成此操作,如 图 3 所示:
图 3. 启用 SSH,禁用 Telnet

然后单击 Apply Setting,现在应该可以通过 SSH 登录。同样地,用户名总是 root,而密码则是您的实际密码:
$ ssh root@192.168.1.1 DD-WRT v24-sp2 std (c) 2010 NewMedia-NET GmbH Release: 08/07/10 (SVN revision: 14896) root@192.168.1.1's password: ========================================================== ____ ___ __ ______ _____ ____ _ _ | _ \| _ \ \ \ / / _ \_ _| __ _|___ \| || | || | || ||____\ \ /\ / /| |_) || | \ \ / / __) | || |_ ||_| ||_||_____\ V V / | _ < | | \ V / / __/|__ _| |___/|___/ \_/\_/ |_| \_\|_| \_/ |_____| |_| DD-WRT v24-sp2 http://www.dd-wrt.com ========================================================== BusyBox v1.13.4 (2010-08-07 05:06:30 CEST) built-in shell (ash) Enter 'help' for a list of built-in commands.
想要进一步加强?可以设置一个无密码的公共密钥登录。这可以防范强力的密码攻击,无人能在没有私有密钥副本的情况下登录。第一步是用 ssh-keygen
命令在您登录的 Linux PC 上创建一个加密密钥对:
$ ssh-keygen -t rsa -C router1 -f ~/.ssh/linksys
本例创建了一个 RSA 密钥对,名为 linksys。公共密钥是 linksys.pub,私有密钥是 linksys,二者均存储在 ~/.ssh 目录。虽然您可以随您所愿将它们放在任何位置,但这个目录是存储 SSH 密钥的标准位置。接下来,向 /etc/ssh/ssh_config 添加一行来识别此密钥:
IdentityFile ~/.ssh/linksys
-C
选项在纯文本文件的公共密钥文件内创建了一个注释,我用它来识别密钥以防遗忘。现在在 Services > Services 的 SSH 部分提供的字段内将这个新的公共密钥复制到 DD-WRT,并禁用密码登录,如 图 4 所示:
图 4. 将公用 SSH 密钥复制到 DD-WRT 以进行公共密钥验证

单击 Save,然后 Reboot Router,大功告成。 如果有 SSH 会话开启,它将被关闭,当重新登录时,系统将不会再要求输入密码。要粘贴进多个密钥,可以在各密钥间插入一个换行符。
可以用 nvram
命令从命令行实现这一目的。请确保您的公共密钥是单引号内无间断的一整行。可以有空格但不能有换行符:
root@linksys:~# nvram set sshd_authorized_keys='ssh-rsa AAAAB3NzaC...89Suj router1' root@linksys:~# nvram commit root@linksys:~# reboot
可以用 nvram
在一个由空格分隔的列表内设置多个密钥,并且每个密钥都用单引号括起:
root@linksys:~# nvram set sshd_authorized_keys='key1' 'key2' 'key3' root@linksys:~# nvram commit
可以先在文本编辑器内键入以便检查输入是否正确,然后再将输入的全部内容复制并粘贴到命令行。
nvram 命令
nvram
具有多层含义。首先它是非可变性 RAM (non-volatile RAM) 的缩写,这种 RAM 是一种持久性内存,可在断电时保留数据。路由器内的闪存就是一种 nvram。
nvram
命令用于管理硬件设置,这些设置保存在闪存的最后一块内。这个内存段通常称为 “nvram”。nvram
命令有不同版本,比如 IBM、Cisco、Oracle 和 Apple 版。DD-WRT 内的 nvram
命令非常简单,因为它只是显示和更改分配给变量的值以及删除变量。无选项的情况下运行它可以看到选项和参数:
root@linksys:~# nvram usage: nvram [get name] [set name=value] [unset name] [show]
nvram show
显示了路由器上的所有设置,而且设置还不少。可以使用 less
将其分隔为一次一页:
root@linksys:~# nvram show | less
或是用 grep
查找特定的变量,比如:
root@linksys:~# nvram show | grep ssh
免费的快速提示:如果您无意间禁用了此 Web 界面,但仍有 telnet 或 SSH,可以以这种方式重新启用它:
root@linksys:~# nvram set http_enable=1 root@linksys:~# nvram commit root@linksys:~# reboot
更改会在重新启动之后应用。还记得 boot_wait 设置吧?GUI 不会让您更改其长度,但 nvram
可以。首先,查明它有多长:
root@linksys:/etc# nvram show |grep wait boot_wait=on wait_time=5
我是比较紧张的类型,所以我想要它长 10 秒:
root@linksys:/etc# nvram set wait_time=10 root@linksys:~# nvram commit
如何清除任何值的变量可参考如下所示:
root@linksys:~# nvram set http_enable="" root@linksys:~# nvram commit
如果不想让某个特定的更改在重新启动后仍存在,可以省略 nvram commit
,这是在试验阶段可以采用的一种很好的策略,因为仅仅是重新启动就可以放弃更改。
nvram unset [variable]
可以完全删除变量。OpenWrt Wiki 上有一个很好的 nvram
命令参考,即 NVRAM 在 OpenWrt 'WhiteRussian' 上的使用(参见 参考资料)。
清除一团糟的配置的最后一个手段是将所有的设置重置为固件的默认设置,方法是通过按下路由器上的 reset 按钮并保持 30 秒,然后重新启动它。这会恢复 DD-WRT 的默认设置,而不是像很多人错误地理解为是恢复最初的固件。
创建第二个分区
通常,DD-WRT 映像会占据 4MB 分区,即便闪存是 8MB 或更多,也是如此。可以在未使用的空间创建另一个分区并用其来存储文件。这应该主要是读存储 (read-storage),比如无线热点 splash 和配置页、Web 页、额外的配置文件以及面向 ipkg(针对嵌入式设备的 ItsyPackage Management System)的存储空间。不要将它用于像日志文件这样能生成大量写操作的文件,因为闪存只支持数量有限的写操作并最终会出现故障。现代的闪存都相当耐用,但它仍具有有限的写操作生命期限。用这个很好的旧 df
命令可以看到现有的文件系统:
root@linksys:/# df -h Filesystem Size Used Available Use% Mounted on /dev/root 4.0M 4.0M 0 100% /
我的路由器具有 8 MB 闪存,那么剩下的那些去哪了呢?它闲置在那,等着被派上用场。访问 Administration > Management 并检查 JFFS2 > Enable 和 Clean JFFS2 > Enable。 单击 Apply Setting,继而 Reboot Router。当它重启时,应该会看到类似下面的结果:
root@linksys:~# df -h Filesystem Size Used Available Use% Mounted on /dev/root 4.0M 4.0M 0 100% / /dev/mtdblock/3 2.3M 196.0K 2.1M 9% /jffs
JFFS2(Journalling Flash File System 版本 2)是针对闪存存储媒介设计的。我们先来看看这种闪存属于哪种媒介。它是一种特殊的设备,称为 Memory Technology Device,缩写为 MTD。它不是一种像硬盘和 USB 棒那样的块设备,也不是像键盘或鼠标那样的字符设备。块设备通常以大小固定(比如 512 和 1024 字节)的分区组织而成。而 MTD 则具有大小为 128KB 和更大的擦写块 (eraseblock)。块设备可以做两件事:读区和写区。MTD 可以做三件事:从擦写块读、写到擦写块和擦除擦写块。
紧凑式闪存、SD 卡、USB 棒究其本质都是 MTD。但它们对于操作系统而言更像是块设备,因为它们具有 Flash Translation Layers (FTL),用于在闪存硬件之上模拟块设备。这种 FTL 可以位于主计算机上,也可以位于此设备内的硬件控制器的固件上。如果您愿意牺牲一个 USB 棒(为知识的进步所做的一次伟大的牺牲)并撬开它,那么您很有可能会看到一些 NAND 芯片(原始的闪存芯片)和一个微控制器。
了解有关闪存的几件事情将有助于您的 DD-WRT 探险之旅。第一,NAND 擦写块显示的是全或无(整个块必须在新的数据写上之前先被擦除)。第二,Linux 具有一个 MTD 子系统,和一个用来执行基本任务(比如擦除或向设备写映像)的 mtd
命令。可以在 DD-WRT 上运行无选项的 mtd
命令来查看语法和选项。在 DD-WRT 维基上还可以看到一些关于如何使用 mtd
命令的 how-to 文章,现在您该知道它是怎么回事了吧。第三,nvram 位于最后一个擦写块上,而无论擦写块有多大,它都被以编程的方式限制为 32KB。
命令行提示
如下的提示可以为您探索 DD-WRT 提供指导:
- DD-WRT 构建于非常流行的嵌入式 Linux 工具包 BusyBox 之上。BusyBox 包含了核心 Linux 实用工具的精简版。为了节省空间,这里没有提供手册页,所以如果想要了解我们称之为 applet 的 BusyBox 命令,您可以阅读 busybox 手册页(参见 参考资料)。您还可以在
/sbin, /usr/bin
上或其他可执行的二进制目录上运行ls -l /bin
,来查看哪些命令是与 BusyBox 相链接的。 - DD-WRT 使用了 BusyBox 自带的 ash shell。在命令行键入
builtin
来查看所有的 shell 插件。 - 与一些成熟的大型 Linux 一样,您可以读取 /proc 和 /sys 伪文件系统来挖据硬件信息,并读取 /etc 中的配置文件。
相关主题
- 阅读 使用 hostapd 轻松实现强 WiFi 加密(Carla Schroder,developerWorks,2012 年 4 月),了解如何在 DD-WRT 路由器上为 WiFi 用户设置强 WPA2 加密和身份验证。
- 查阅 DD-WRT 维基上所列的 DD-WRT 特性。
- 了解有关 DD-WRT 以及支持 DD-WRT 核心开发团队 的更多信息。
- 访问 NVRAM 在 OpenWrt 'WhiteRussian' 上的使用,获得一个很好的
nvram
命令参考。 - 如果您砖化了您的路由器,可以参阅 Recover from a bad flash。
- 访问 DD-WRT 项目网站。
- 访问 Linux MTD,这是全面了解内存技术设备的一个不错的网站。
- 探索 DD-WRT Wiki 获得教程和设备数据库。
- developerWorks 中国网站开源技术专区 提供了有关开源工具和使用开源技术的丰富信息。
- 以最适合您的方式 IBM 产品评估试用版软件:下载产品试用版,在线试用产品,在云环境下使用产品,或者在 IBM SOA 人员沙箱 中花费几个小时来学习如何高效实现面向服务架构。
- 在 Twitter 上关注 developerWorks,或者订阅 Linux tweets on developerWorks 提要。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。