低功耗设备和路由器上用什么替代 OpenSSH
在为微控制器、路由器或 Docker 容器构建精简镜像时,每一兆字节的内存都弥足珍贵。全功能的 OpenSSH 在服务器上表现出色,但对于嵌入式系统来说,它就像一辆卡车开到了街角小店。它拖着一串依赖项,RAM 在你眼前就融化了。
在这种情况下,人们会转向 Dropbear。这是一款由 Matt Johnston 编写的紧凑型 SSH 服务器和客户端。该项目出现在二十多年前,但至今仍在积极维护,是 OpenWrt 和网络设备固件中的默认标准。
内部实现原理及节省资源的途径
Dropbear 解决了一个特定任务:在保持 SSH-2 协议基本安全性的同时节省磁盘空间和 RAM。如果使用正确的标志编译项目,生成的二进制文件只有几百 KB。
开发者采用了单一多用途二进制文件的理念,类似于 BusyBox 工具的工作方式。在这种模式下,一个文件处理服务器、客户端 dbclient、密钥生成器 dropbearkey 和转换器 dropbearconvert 的功能。你创建指向同一二进制文件所需名称的符号链接,程序根据被调用文件的名称确定其运行模式。
还有几个进一步减小体积的技巧:
- 内置的客户端
scp默认不编译文件传输进度条。如果需要进度指示器,你必须在编译时显式传递SCPPROGRESS=1参数。 - 在
options.h文件中,你可以手动禁用未使用的加密算法、端口转发或密码认证支持,进一步减小最终文件大小。
密钥处理的细节
如果你习惯使用标准 OpenSSH 工具,这个项目会让你有些意外。在服务器端,一切都很熟悉:~/.ssh/authorized_keys 文件以标准方式工作。你可以在那里添加 ssh-rsa 或 ssh-ed25519 格式的公钥。最重要的是确保你的编辑器不会将密钥字符串拆分成多行,并且 .ssh 目录的权限只允许所有者写入。
在客户端和生成主机密钥时,特殊情况就开始了。该工具使用自己的私钥格式。要在 dbclient 客户端中使用你熟悉的 ~/.ssh/id_rsa 密钥,你需要先进行转换:
dropbearconvert openssh dropbear ~/.ssh/id_rsa ~/.ssh/id_rsa.db
dbclient -i ~/.ssh/id_rsa.db user@remotehost
如果通过原生 dropbearkey 工具创建新密钥,私钥和公钥部分会直接输出到控制台。你可以通过简单的过滤提取公钥,添加到另一台服务器:
./dropbearkey -y -f ~/.ssh/id_ed25519 | grep "^ssh-" > ~/.ssh/id_ed25519.pub
启动服务器及潜在陷阱
通常,在启动 SSH 服务器之前,你需要手动生成主机密钥:
./dropbearkey -t rsa -f dropbear_rsa_host_key
./dropbearkey -t ed25519 -f dropbear_ed25519_host_key
Dropbear 有一个方便的技巧来加快系统启动。与其在启动时生成密钥(这会拖慢弱处理器的启动速度),不如向服务器传递 -R 标志。在这种情况下,密钥只会在首次有传入连接时在 /etc/dropbear/ 目录中自动创建。
运行时,请注意该项目的特殊之处:
- 以普通用户身份运行服务器会受到严格限制。你将无法分配伪终端(pty)、切换到其他账户或使用影子密码。
- 不支持密码加密的主机密钥,但客户端可以连接到运行中的
ssh-agent。 - 该项目缺乏详细文档。主要说明分散在仓库根目录的文本文件
INSTALL.md、MULTI.md和SMALL.md中。
谁会发现这个工具很有用
如果你正在制作自定义路由器固件、开发内存有限的 Linux 设备或构建精简 initramfs 镜像,Dropbear 会派上用场。在配备数十 GB 内存的完整服务器上,你几乎不会注意到与 OpenSSH 的任何差异。但在每个 KB 都至关重要的地方,这个工具比大多数替代方案更能节省资源。
相关项目