Dropbear:嵌入式Linux的轻量级SSH——从协议原理到远程管理实战

发布时间:2026/8/29 21:39:25
Dropbear:嵌入式Linux的轻量级SSH——从协议原理到远程管理实战 Dropbear嵌入式Linux的轻量级SSH——从协议原理到远程管理实战大家好我是黒漂技术佬。上一篇咱们用 BusyBox 从零搭了一个最小根文件系统跑起来那一刻确实爽——但爽完就发现一个问题这玩意只能靠串口伺候。串口调试的痛苦做过现场部署的都懂得拖着 USB 转 TTL 线蹲在设备旁边智慧农业网关装在大棚顶上、无人售货柜塞在商场角落你人上不去串口波特率 115200传文件慢得像蜗牛驮着铅球多人协作时串口是个独占资源——你连着同事就只能干瞪眼。解法人尽皆知SSH。但问题来了——OpenSSH 在嵌入式上是个大胖子。这时候就该本文的主角登场了Dropbear嵌入式世界的 SSH 守护神。一、Dropbear 是什么一句话Dropbear 是专为嵌入式和低资源环境设计的轻量级 SSH2 服务端 客户端实现。由澳大利亚工程师 Matt Johnston 于 2002 年发起名字来自澳洲特有的动物袋熊wombat 的近亲圆润、占地小——起名意图一目了然。它实现的是 SSH-2 协议RFC 4251~4254 系列在嵌入式领域是和 BusyBox 齐名的减重双子星。先看对比感受量级差距维度OpenSSHDropbear二进制体积静态sshd 约 2~3 MB 依赖 openssl/libcrypto 若干 MB单二进制约 200~500 KB运行时内存每连接几 MB 起每连接约 1~2 MB组件sshd、ssh、scp、sftp-server、ssh-keygen、ssh-agent… 各自独立dropbear、dbclient、scp 合体一个二进制依赖zlib、crypto 库、可选 privilege separation 用户可选 zlibcrypto 可用更小的 libtomcrypt/tommathsftp-server独立进程支持编译开启后支持较新版本配置复杂度sshd_config 十几个常用项命令行参数直给几行搞定一句话总结定位差异OpenSSH 的目标是功能完备的安全堡垒Dropbear 的目标是塞进 8MB Flash 的看门狗。它出现在哪里OpenWrt几乎所有路由器固件、buildroot、Yocto、各种 IoT SDK、安卓的 userdebug/eng 构建adb之外开发者常启用的sshd就是 dropbear 的安卓移植。可以说你能买到的带网口的嵌入式设备一半以上跑着它。一个熟悉的味道multi-call binary如果你看过我上一篇 BusyBox 文章Dropbear 的玩法会让你会心一笑——它也是单二进制多路复用ls-l/usr/sbin/dropbear /usr/bin/dbclient /usr/bin/dbclient2/dev/null# dbclient - dropbeardropbear是服务端dbclient早期版本叫dbclient或通过dropbear -client调用现在直接做软链接是客户端dropbearkey是密钥生成工具dropbearconvert做密钥格式转换。它们在构建时合体成一个或极少数几个二进制靠argv[0]分流——和 BusyBox 一个套路。嵌入式世界的体积哲学是共通的包装纸只买一张。二、SSH 协议速成Dropbear 到底在忙什么要用好 Dropbear以及排查它的问题必须懂一点 SSH 协议。不深入密码学细节只讲工程视角的主干。SSH-2 协议分三层┌──────────────────────────────────────────┐ │ 连接层Connection Layer │ │ 多路通道shell / exec / sftp / 端口转发 │ ├──────────────────────────────────────────┤ │ 用户认证层Userauth Layer │ │ 密码认证 / 公钥认证 │ ├──────────────────────────────────────────┤ │ 传输层Transport Layer │ │ 算法协商 → 密钥交换 → 之后全部加密 │ └──────────────────────────────────────────┘2.1 传输层先接头对暗号再加密连接建立后第一件事是算法协商——客户端和服务端各自亮出支持的算法列表取交集客户端 → SSH-2.0-OpenSSH_9.6 服务端 → SSH-2.0-dropbear_2022.83 客户端 → 我支持这些 KEX / 加密 / 哈希 / 签名算法列表 服务端 → 选这几个交集然后是密钥交换KEX典型流程是 ECDH/DH 类算法——双方交换公开参数各自算出相同的会话密钥全程明线传输但密钥不落网线。服务端同时会用**主机密钥host key**对交换过程签名客户端据此确认对面的 dropbear 就是我上次连的那台。这就是你第一次连接时那个著名提问的来源The authenticity of host 192.168.1.50 cant be established. ED25519 key fingerprint is SHA256:xxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])?确认后指纹存进 PC 的~/.ssh/known_hosts。以后如果指纹变了设备重刷、被人中间人客户端立刻报警。工程提醒批量生产设备时如果每台都自动生成 host key指纹各不相同资产台账里要记录每台的指纹别图省事全厂共用一个 host key 私钥——那是把设备身份变成了厂商身份一台泄露全线沦陷。2.2 认证层密码 or 公钥协商完成后才轮到登录。SSH 支持多种认证方式Dropbear 常用的两种密码认证像平时登录 Linux 一样输密码。简单但 root 密码弱密码 设备暴露公网 肉鸡预定后文安全节细说公钥认证你把公钥放进板子的~/.ssh/authorized_keys登录时客户端用私钥证明身份。无密码、防爆破、可自动化是嵌入式远程管理的正解。2.3 连接层一个 TCP 连接里的多车道认证通过后SSH 在同一条加密连接里开多个通道channel你敲命令的 shell 是一个通道SCP 传文件再开一个端口转发还能继续开。这就是为什么scp一个文件不用重新登录一次。三、交叉编译 Dropbear 到 ARM继续上一篇 BusyBox 文章的场景给 RV1106 那类 ARM 板子编译。假设交叉工具链arm-linux-gnueabihf-已就位。3.1 获取与配置wgethttps://matt.ucc.asn.au/dropbear/releases/dropbear-2022.83.tar.bz2tarxjf dropbear-2022.83.tar.bz2cddropbear-2022.83# Dropbear 的配置界面比 busybox 朴素用 configure 脚本./configure--hostarm-linux-gnueabihf\--disable-zlib\--disable-lastlog\--disable-utmp --disable-utmpx\--disable-wtmp --disable-wtmpx\--prefix/usr逐个解释这些裁剪都是嵌入式惯例--disable-zlib关压缩。传输压缩会多占内存和 Flash速度在百兆网内几乎无感差异可按需开--disable-utmp/wtmp/lastlog登录审计记录。这仨在嵌入式上通常没有配套的用户态工具去读谁在板子上跑last关掉省事。注意金融、门禁等有审计合规要求的项目别关读你产品的安全需求文档。3.2 编译前的一个经典选择题crypto 库Dropbear 支持两套加密后端configure 时二选一选项体积说明用系统 libcryptoOpenSSL大如果 rootfs 里已经有 OpenSSL比如要跑别的依赖它的程序顺手复用内置 libtomcrypt libtommath小嵌入式默认推荐代码自带静态编进 dropbear零外部依赖默认是内置 tomcrypt。如果你的 BusyBox rootfs 里没放 OpenSSL 库——上一篇我们可是静态编译的——那保持默认就是正解dropbear 静态编完即插即用。makePROGRAMSdropbear dbclient dropbearkey dropbearconvert scp-j8makeDESTDIR/home/hanxi/rootfsinstallmake install后 rootfs 里多了/usr/sbin/dropbear # 服务端 /usr/bin/dbclient # 客户端软链接 /usr/bin/dropbearkey # 密钥生成 /usr/bin/dropbearconvert # 密钥格式转换 /usr/bin/scp # 远程拷贝看一下体积ls-lrootfs/usr/sbin/dropbear# 约 300~500 KB静态、含 tomcrypt对比 OpenSSH 全家桶在 ARM 上动态编译还要 2MB 依赖这一步的快感谁编译谁知道。3.3 生成主机密钥dropbearkey 登场SSH 服务端需要主机密钥来标识自己。用dropbearkey生成在目标板上跑或者在 PC 上用交叉工具链跑目标板二进制不行——它是 ARM 程序PC 跑不动用 qemu-arm 可以但没必要直接在板上生成最省事# 在板子的串口 shell 里执行mkdir-p/etc/dropbear# 生成 ED25519 主机密钥首选又小又快又安全dropbearkey-ted25519-f/etc/dropbear/dropbear_ed25519_host_key# 或者传统 RSA2048 位dropbearkey-trsa-f/etc/dropbear/dropbear_rsa_host_keyDropbear 启动时默认在/etc/dropbear/下找这两种密钥有哪个用哪个。密钥选型建议2026 年了除非你的客户端还有老古董不支持 ED25519否则直接 ED25519密钥文件小几十字节 vs RSA 上 KB、握手快、无参数选择的坑。还有个更懒的办法量产批量部署福音dropbear-R-R表示启动时若无主机密钥自动生成首次开机时稍慢一秒之后持久保存。产线不用单独跑密钥生成步骤了。3.4 让它跑起来在 rcS 里加一行# /etc/init.d/rcS 追加dropbear-R或者更规范些写成一个启动脚本cat/etc/init.d/S50dropbearEOF #!/bin/sh case $1 in start) mkdir -p /etc/dropbear /var/run dropbear -R -p 22 echo dropbear started ;; stop) killall dropbear ;; esac EOFchmodx /etc/init.d/S50dropbear然后从 PC 上连接sshroot192.168.1.50# root192.168.1.50s password: ← 输入 root 密码连上了。恭喜你的板子从此摆脱串口线。但先别急着高兴按 CSDN 文章的说法——能跑和能上量之间隔着一条安全鸿沟下面我们把整条链路补完。四、公钥认证嵌入式远程管理的正解密码认证能用但工程上更推荐公钥认证。原因很现实设备 root 密码往往是全厂统一的弱口令别装外宾都干过公钥认证可以做到密钥只存在于你的开发机设备上只有公钥泄露面完全不对称自动化脚本部署、巡检、日志拉取没法输密码公钥是唯一优雅解。4.1 生成你的密钥对在 PC 上ssh-keygen-ted25519-Chanxiworkstation# 生成 ~/.ssh/id_ed25519私钥绝不外传和# ~/.ssh/id_ed25519.pub公钥随便撒4.2 传公钥到板子注意格式差异本节是全文最大坑点OpenSSH 和 Dropbear 的公钥文件格式不一样。你的id_ed25519.pub长这样ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...一长串... hanxiworkstationDropbear 的authorized_keys期望的格式是每行一个公钥格式类似但由 dropbearconvert 产出。实测新版本 Dropbear 能直接读 OpenSSH 格式的 authorized_keys但老版本以及某些魔改版 SDK 里的会静默不认——公钥认证失败、又没有任何报错日志就是这个坑的高发区。稳妥流程走 convert# 在 PC 上把 OpenSSH 公钥转成 Dropbear 格式# dropbearconvert 只转私钥格式公钥其实不转——# 所以标准做法是转换私钥让 dbclient 用 dropbear 私钥格式去连停一下这里容易把人绕晕我把四种文件的角色一次性讲清楚PC 侧OpenSSH 客户端 板子侧Dropbear 服务端 ───────────────────────── ───────────────────────── id_ed25519 私钥 ────签名证明身份──→ authorized_keys 公钥列表 known_hosts 记录对方指纹 ←───主机密钥签名──── dropbear_ed25519_host_key私钥转公钥永远单向、格式无关Dropbear 服务端验签时需要的是公钥数学结构新版本 Dropbear 对 OpenSSH 公钥格式是兼容解析的。所以最小惊讶流程是# 1. 在板子上创建目录权限是关键见下mkdir-p/root/.sshchmod700/root/.ssh# 2. 把 PC 的公钥追加进去用密码登录最后一次 scp 传过去scp~/.ssh/id_ed25519.pub root192.168.1.50:/root/.ssh/authorized_keys# 3. 在板上修权限chmod600/root/.ssh/authorized_keys# 4. 退出重新 ssh —— 不再要密码sshroot192.168.1.504.3 权限公钥认证失败的头号元凶如果你按上面做了还是提示输密码九成是权限问题。SSH 对文件权限的洁癖是有原因的——authorized_keys是谁能登录 root的决定文件别人可写那还了什么安全。自检清单在板上逐条核对ls-ld/root# 应为 drwx------ (700) 或 755 至少不能 group/other 可写ls-ld/root/.ssh# 必须 700ls-l/root/.ssh/authorized_keys# 必须 600BusyBox 自制 rootfs 常见的坑make install出来的 rootfs 是 root 拥有没问题但如果你在 PC 上用普通用户身份拷文件进去owner 变成了你的开发用户名——Dropbear 一看authorized_keys的 owner 不是 root直接拒用且默认不打日志。修复chown-Rroot:root /root/.ssh4.4 scp 与 dbclient板子主动连外界Dropbear 不只是被动挨连。板子上可以用dbclient主动连接其他主机、用scp推拉文件——现场排障时从板子上直接把日志拉到跳板机就靠它# 板子 → PCPC 得开 sshdscp/var/log/messages hanxi192.168.1.10:/tmp/# 板子之间互传dbclient root192.168.1.51uptimedbclient 的密钥生成也用 dropbearkey私钥放/root/.ssh/id_dropbear格式与 OpenSSH 私钥不同——两头都是 Dropbear 的话无缝衔接要用 PC 上的 OpenSSH 私钥连板子正常用客户端是你 PC 的 OpenSSH要在板子上用 PC 生成的私钥就得dropbearconvert openssh dropbear转一下格式# 在有 dropbearconvert 的机器上PC 装了 dropbear 包也行dropbearconvert openssh dropbear ~/.ssh/id_ed25519 /tmp/id_dropbear# 把 /tmp/id_dropbear 拷到板子的 /root/.ssh/ 下即可五、安全加固量产设备的 SSH 正确姿势又是安全环节老读者知道我这个环节从不注水。Dropbear 默认配置对嵌入式来说偏宽松量产前过一遍下面的清单。5.1 命令行参数即加固工具Dropbear 没有 sshd_config所有配置都是启动参数dropbear-R-p22-w-g-s-T300参数作用工程建议-w禁止 root 登录看业务。设备无其他用户时禁 root 等于禁登录改为只允许 root 公钥登录-g禁止 root 密码登录公钥仍可量产必开。root 只走公钥-s禁用所有密码登录更狠。若运维还要密码通道就别开-T 秒登录超时默认无限制开个 60~300 秒防恶意连接占资源-p 端口监听端口换非 22 端口属于降低被扫到的概率不是安全边界但白嫖的收益-R自动生成主机密钥量产方便配合产线记录指纹-F前台运行用 busybox init 的 respawn 管理时加上我的智慧农业网关量产配置供参考# 只允许公钥、root 专用、5分钟登录超时、内部管理网端口dropbear-R-g-s-T300-p2222运维要连设备先派发密钥公钥到白名单——多一步流程换掉的是整个密码爆破攻击面。5.2 那些年设备厂商SSH翻的车把行业事故当反面教材均已做脱敏抽象全厂共用 host key厂商为方便把一个 host key 烧进所有固件。安全研究员从一台设备导出私钥后可对全网同型号设备做中间人。教训host key 必须每台设备唯一-R自动生成即可默认弱密码 公网暴露某批摄像头 root/admin123 出厂密码固件里 dropbear 监听 0.0.0.0:22 Mirai 类僵尸网络的剧本级猎物。教训密码认证和公网监听量产二选一都不能留调试通道忘关研发期开的dropbear -p 22 -s无密码、仅密钥听起来安全但密钥是团队共享的开发机私钥那台机器丢失后全套设备沦陷。教训密钥轮换机制 量产配置独立 review。5.3 传输层算法的 2026 年基线老版本 Dropbear 支持的一些算法该淘汰了。核对你的版本KEX只用 curve25519-sha256 或 ecdh-sha2-nistp256禁用旧 DH group11024 位主机密钥/签名ED25519 或 RSA-SHA2rsa-sha2-256/512RSA-SHA1 已出局对称加密chacha20-poly1305 或 aes128-gcm禁 3des/cbc 老组合。Dropbear 2020.79 之后版本默认集就健康别用 SDK 里打包了六七年的老 dropbear——用dbclient -V或dropbear -V查版本太老就换新的。协议算法是安全的地基地基旧了楼再漂亮也白搭。六、性能与内存小到什么程度快到什么程度给一组实测量级参考ARM Cortex-A53 1.2GHz静态编译Dropbear 2022.83指标数值dropbear 二进制静态含 tomcrypt~450 KBdbclient 软链接0共享二进制每连接内存交互 shell1.5~2.5 MB RSSED25519 握手耗时 100 msRSA-2048 握手200~400 msscp 传 10MB 文件百兆网接近线速瓶颈在网络对比 OpenSSH 同场景每连接内存 4MB二进制加依赖 5MB。在 64MB 内存的设备上跑十几条并发 SSH 会话Dropbear 活得潇洒OpenSSH 已经开始换页。什么时候必须上 OpenSSH你的需求超出 Dropbear 能力圈时需要完整 sftp大文件管理、断点续传——Dropbear 的 sftp-server 支持较晚且功能精简需要 ssh-agent 转发、证书认证、GSSAPI 等企业特性设备资源充裕x86 工控机且要和大厂运维体系堡垒机审计等对接。选型原则一句话资源紧张或需求简单的场景 Dropbear企业级全家桶需求 OpenSSH两者不冲突。七、常见报错速查表老规矩踩坑清单直接收藏报错/现象原因解决ssh: connect to host ... port 22: Connection refuseddropbear 没起来 / 端口不对板上 ps连接建立但提示Exceeded MaxStartups并发未认证连接过多网络里有扫描器换端口 防火墙公钥不生效、静默回落到密码authorized_keys 权限/owner 错或格式不认700/600/root 属主逐项查确认 dropbear 版本支持 OpenSSH 公钥格式Host key verification failed客户端known_hosts 指纹不匹配设备重刷导致ssh-keygen -R IP清记录后重连并核对新指纹登录后立刻断开shell not found/bin/sh 软链接损坏BusyBox rootfs 高发修/bin/sh - busybox软链接dropbear: no hostkeys启动失败无密钥且未加 -Rdropbearkey生成或启动加-Rscp 报sh: dbclient: not foundscp 需要同目录的 dbclient 软链接rootfs 里补dbclient - dropbear链接握手慢几秒才出密码框RSA-2048 主机密钥在低速板上算得吃力或反向 DNS换 ED25519Dropbear 默认不做反向 DNS慢多半在密钥中文文件名/终端乱码BusyBox ash 无 locale客户端终端设 UTF-8export LANGC.UTF-8八、总结收尾拎主线Dropbear 是嵌入式 SSH 的默认答案单二进制多路复用和 BusyBox 同款设计哲学、静态编译约 500KB、每连接 1~2MB 内存OpenWrt 级别的江湖地位协议主干三件事传输层算法协商 密钥交换host key 签名防中间人→ 认证层密码/公钥 → 连接层多通道复用。排障时先判断问题出在哪一层效率翻倍交叉编译三板斧configure 裁剪登录审计按合规需求→ 默认内置 tomcrypt 零依赖 →make install进 rootfsrcS 里dropbear -R起服务公钥认证是正解但三道坎要过格式老版本对 OpenSSH 公钥格式兼容性差、权限700/600 root 属主、以及密钥管理纪律私钥不下发、host key 每台唯一量产加固基线-g -s -T 300起步root 仅公钥、禁公网密码暴露、算法基线对齐 2020.79 版本、SDK 自带的老 dropbear 该换就换。回头看这个系列的两篇文章BusyBox 给了板子活着的躯干命令与 shellDropbear 给了它伸出去的手加密远程管理。躯干加手臂一块裸板才算真正具备了部署到现场、被远程运维的资格——这也是所有嵌入式产品从能演示走到能交付的分水岭。我是黒漂技术佬咱们下篇见。