02 - 安装与编译
第二章:安装与编译
2.1 获取源码
方式一:GitHub 获取(推荐)
# 克隆最新代码
git clone https://github.com/mkj/dropbear.git
cd dropbear
# 查看最新标签
git tag -l | sort -V | tail -5
# 输出示例:
# DROPBEAR_2020.81
# DROPBEAR_2022.83
# DROPBEAR_2024.84
# DROPBEAR_2024.85
# DROPBEAR_2024.86
# 切换到稳定版本
git checkout DROPBEAR_2024.86
方式二:源码包下载
# 下载发布包
wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2024.86.tar.bz2
# 校验签名(可选但推荐)
wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2024.86.tar.bz2.asc
gpg --verify dropbear-2024.86.tar.bz2.asc dropbear-2024.86.tar.bz2
# 解压
tar xjf dropbear-2024.86.tar.bz2
cd dropbear-2024.86
源码目录结构
dropbear/
├── src/ # 核心源码
│ ├── main.c # 服务端主入口
│ ├── common-*.c # 通用模块
│ ├── svr-*.c # 服务器端逻辑
│ ├── cli-*.c # 客户端逻辑
│ ├── session.c # 会话管理
│ ├── auth*.c # 认证逻辑
│ ├── channel.c # 通道管理
│ ├── tcpfwd*.c # 端口转发
│ └── packet.c # 数据包处理
├── libtomcrypt/ # 内置加密库
├── libtommath/ # 内置数学库
├── sysoptions.h # 编译选项(自动生成)
├── default_options.h # 默认选项模板
├── localoptions.h # 本地覆盖选项(需手动创建)
├── Makefile.in # Makefile 模板
├── configure # 配置脚本
├── configure.ac # Autoconf 源文件
├── dropbear.8 # man page
├── dropbearkey.c # 密钥生成工具
├── dropbearconvert.c # 密钥转换工具
├── dbmulti.c # 多合一二进制入口
├── CHANGES # 变更日志
└── LICENSE # MIT 许可证
2.2 本地编译
基本编译流程
# 1. 安装编译依赖
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y build-essential autoconf automake zlib1g-dev
# CentOS/RHEL/Rocky
sudo yum groupinstall -y "Development Tools"
sudo yum install -y zlib-devel
# Alpine(适合极简环境)
sudo apk add build-base zlib-dev linux-headers
# 2. 配置
./configure --help # 查看所有选项
./configure
# 3. 编译
make -j$(nproc)
# 4. 安装(可选)
sudo make install
# 5. 验证
dropbear -V
dbclient -V
configure 选项详解
| 选项 | 默认值 | 说明 |
|---|---|---|
--prefix=PATH | /usr/local | 安装路径 |
--disable-zlib | 启用 | 禁用 zlib 压缩 |
--enable-openpty | 自动 | 使用 openpty() 分配伪终端 |
--disable-syslog | 启用 | 禁用 syslog 日志 |
--enable-shadow | 自动 | 支持 shadow 密码 |
--enable-pam | 禁用 | PAM 认证支持 |
--disable-pam | - | 确保禁用 PAM |
--enable-bundled-libtom | 自动 | 使用内置 libtom 库 |
--with-pam=lib | - | 指定 PAM 库名 |
--enable-static | 禁用 | 生成静态链接二进制 |
--host=TRIPLE | - | 交叉编译目标三元组 |
配置示例
# 标准服务器编译
./configure \
--prefix=/usr \
--sysconfdir=/etc/dropbear \
--disable-pam
# 最小化编译(嵌入式)
./configure \
--prefix=/usr \
--disable-zlib \
--disable-pam \
--enable-bundled-libtom \
--disable-syslog
# 使用系统 OpenSSL(而非内置 libtomcrypt)
./configure \
--prefix=/usr \
--disable-bundled-libtom
2.3 编译选项深度定制
localoptions.h
Dropbear 允许通过 localoptions.h 文件在不修改源码的情况下覆盖默认编译选项。在源码根目录创建该文件:
/* localoptions.h - 自定义编译选项 */
/* 禁用 X11 转发(嵌入式通常不需要) */
#define DROPBEAR_X11FWD 0
/* 禁用本地端口转发(如果不需要) */
#define DROPBEAR_CLI_LOCALTCPFWD 0
/* 禁用远程端口转发(如果不需要) */
#define DROPBEAR_CLI_REMOTETCPFWD 0
/* 禁用 Agent 转发 */
#define DROPBEAR_AGENTFWD 0
/* 禁用 SFTP 子系统(如果只需要 scp) */
#define DROPBEAR_SFTP_SERVER 0
/* 限制最大未认证连接数 */
#define MAX_UNAUTH_CLIENTS 3
/* 限制最大认证尝试次数 */
#define MAX_AUTH_TRIES 3
/* 会话超时(秒) */
#define AUTH_TIMEOUT 120
/* 空闲超时(秒) */
#define DEFAULT_IDLE_TIMEOUT 300
/* 监听队列长度 */
#define LISTEN_QUEUE_SIZE 3
/* 最大通道数 */
#define MAX_CHANNELS 5
/* 使用较小的缓冲区(节省内存) */
#define RECV_MAX_PAYLOAD_LEN 1000
#define TRANS_MAX_PAYLOAD_LEN 1000
/* 禁用 HMAC-SHA1(只保留更强的算法) */
#define DROPBEAR_SHA1_HMAC 0
/* 指定默认主机密钥路径 */
#define DSS_PRIV_FILENAME "/etc/dropbear/dropbear_dss_host_key"
#define RSA_PRIV_FILENAME "/etc/dropbear/dropbear_rsa_host_key"
#define ECDSA_PRIV_FILENAME "/etc/dropbear/dropbear_ecdsa_host_key"
#define ED25519_PRIV_FILENAME "/etc/dropbear/dropbear_ed25519_host_key"
常用编译选项配置表
| 配置项 | 默认 | 精简值 | 说明 |
|---|---|---|---|
DROPBEAR_X11FWD | 1 | 0 | X11 转发 |
DROPBEAR_CLI_LOCALTCPFWD | 1 | 0 | 客户端本地转发 |
DROPBEAR_CLI_REMOTETCPFWD | 1 | 0 | 客户端远程转发 |
DROPBEAR_CLI_AGENTFWD | 1 | 0 | Agent 转发 |
DROPBEAR_SVR_LOCALTCPFWD | 1 | 0 | 服务端本地转发 |
DROPBEAR_SVR_REMOTETCPFWD | 1 | 0 | 服务端远程转发 |
DROPBEAR_SVR_AGENTFWD | 1 | 0 | 服务端 Agent 转发 |
DROPBEAR_SFTP_SERVER | 1 | 0 | SFTP 子系统 |
ENABLE_CLI_PASSWORD_AUTH | 1 | 1 | 客户端密码认证 |
ENABLE_CLI_PUBKEY_AUTH | 1 | 1 | 客户端公钥认证 |
ENABLE_SVR_PASSWORD_AUTH | 1 | 1 | 服务端密码认证 |
ENABLE_SVR_PUBKEY_AUTH | 1 | 1 | 服务端公钥认证 |
DROPBEAR_SHA1_HMAC | 1 | 0 | SHA1 HMAC |
DROPBEAR_MD5_HMAC | 1 | 0 | MD5 HMAC |
MAX_UNAUTH_CLIENTS | 10 | 3 | 最大未认证连接数 |
MAX_AUTH_TRIES | 10 | 3 | 最大认证尝试次数 |
最小化编译实战
以下脚本实现一个极致精简的 Dropbear 编译,适用于 Flash 空间极其有限的设备:
#!/bin/bash
# minimal_build.sh - 最小化编译 Dropbear
set -e
DROPBEAR_VERSION="2024.86"
BUILD_DIR="/tmp/dropbear-build"
INSTALL_DIR="/opt/dropbear-minimal"
# 清理
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR" "$INSTALL_DIR"
# 获取源码
cd "$BUILD_DIR"
wget -q "https://matt.ucc.asn.au/dropbear/releases/dropbear-${DROPBEAR_VERSION}.tar.bz2"
tar xjf "dropbear-${DROPBEAR_VERSION}.tar.bz2"
cd "dropbear-${DROPBEAR_VERSION}"
# 创建最小化编译选项
cat > localoptions.h << 'EOF'
/* 最小化编译配置 */
#define DROPBEAR_X11FWD 0
#define DROPBEAR_CLI_LOCALTCPFWD 0
#define DROPBEAR_CLI_REMOTETCPFWD 0
#define DROPBEAR_CLI_AGENTFWD 0
#define DROPBEAR_SVR_LOCALTCPFWD 0
#define DROPBEAR_SVR_REMOTETCPFWD 0
#define DROPBEAR_SVR_AGENTFWD 0
#define DROPBEAR_SFTP_SERVER 0
#define ENABLE_CLI_PASSWORD_AUTH 0
#define ENABLE_CLI_PUBKEY_AUTH 1
#define ENABLE_SVR_PASSWORD_AUTH 1
#define ENABLE_SVR_PUBKEY_AUTH 1
#define DROPBEAR_SHA1_HMAC 0
#define MAX_UNAUTH_CLIENTS 3
#define MAX_AUTH_TRIES 3
#define AUTH_TIMEOUT 60
#define DEFAULT_IDLE_TIMEOUT 120
#define MAX_CHANNELS 4
#define RECV_MAX_PAYLOAD_LEN 1000
#define TRANS_MAX_PAYLOAD_LEN 1000
EOF
# 配置
./configure \
--prefix="$INSTALL_DIR" \
--disable-zlib \
--disable-pam \
--enable-bundled-libtom \
--disable-syslog \
--enable-static
# 编译为单一多合一二进制
make -j$(nproc) MULTI=1
# 安装
make install
# 可选:进一步压缩
if command -v upx &> /dev/null; then
upx --best "${INSTALL_DIR}/bin/dropbearmulti"
fi
# 显示结果
echo "=== 编译结果 ==="
ls -lh "${INSTALL_DIR}/bin/"*
file "${INSTALL_DIR}/bin/"*
echo "=== 体积对比 ==="
echo "Dropbear 多合一: $(du -sh ${INSTALL_DIR}/bin/dropbearmulti | cut -f1)"
echo "系统 OpenSSH sshd: $(du -sh /usr/sbin/sshd 2>/dev/null || echo '未安装')"
2.4 交叉编译
交叉编译是嵌入式开发的核心技能。以下介绍针对不同架构的交叉编译方法。
通用交叉编译流程
# 1. 安装交叉编译工具链
# ARM 64-bit (AArch64)
sudo apt-get install gcc-aarch64-linux-gnu
# ARM 32-bit (ARMv7)
sudo apt-get install gcc-arm-linux-gnueabihf
# MIPS
sudo apt-get install gcc-mips-linux-gnu
# RISC-V 64-bit
sudo apt-get install gcc-riscv64-linux-gnu
# 2. 配置(指定目标主机)
./configure --host=aarch64-linux-gnu \
--prefix=/usr \
--disable-pam \
--disable-zlib \
--enable-bundled-libtom
# 3. 编译
make -j$(nproc) MULTI=1
# 4. 验证
file dropbearmulti
# 输出应包含: ELF 64-bit ... ARM aarch64
常见目标架构三元组
| 架构 | 三元组 | 常见设备 |
|---|---|---|
| ARM 64-bit | aarch64-linux-gnu | 树莓派 4/5、RK3588 |
| ARM 32-bit (硬浮点) | arm-linux-gnueabihf | 树莓派 2/3、i.MX6 |
| ARM 32-bit (软浮点) | arm-linux-gnueabi | 旧式 ARM 设备 |
| MIPS Big Endian | mips-linux-gnu | 路由器 |
| MIPS Little Endian | mipsel-linux-gnu | 路由器(MIPSel) |
| x86 (32-bit) | i686-linux-gnu | 旧式 x86 嵌入式 |
| RISC-V 64-bit | riscv64-linux-gnu | RISC-V 开发板 |
| PowerPC | powerpc-linux-gnu | 工控设备 |
Yocto / OpenEmbedded 集成
在 Yocto 构建系统中,Dropbear 通常是默认的 SSH 实现:
# conf/local.conf 中的配置
# 使用 Dropbear 作为 SSH 服务器
DISTRO_FEATURES:append = " ssh-server-dropbear"
# 自定义编译选项
PACKAGECONFIG:pn-dropbear = "disable-weak-ciphers"
# 添加到镜像
IMAGE_INSTALL:append = " dropbear"
Buildroot 集成
# 通过 menuconfig 配置
make menuconfig
# → Target packages
# → Networking applications
# → [*] dropbear
# 或直接编辑 .config
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_DROPBEAR_CLIENT=y
BR2_PACKAGE_DROPBEAR_DISABLE_REVERSEDNS=y
BR2_PACKAGE_DROPBEAR_LOCALOPTIONS_FILE="board/custom/dropbear_options.h"
使用 sysroot 交叉编译
当需要链接系统库(如 zlib)时:
# 指定 sysroot
SYSROOT="/opt/sysroot-aarch64"
./configure \
--host=aarch64-linux-gnu \
--prefix=/usr \
--with-zlib="${SYSROOT}/usr" \
CFLAGS="--sysroot=${SYSROOT}" \
LDFLAGS="--sysroot=${SYSROOT}"
make -j$(nproc)
2.5 依赖库说明
内置 libtom 库 vs 系统 OpenSSL
Dropbear 支持两种加密后端:
| 对比项 | 内置 libtomcrypt/libtommath | 系统 OpenSSL |
|---|---|---|
| 二进制大小 | 较小 | 较大(需链接 libcrypto) |
| 安全更新 | 随 Dropbear 更新 | 随系统更新 |
| FIPS 认证 | 无 | 可能有 |
| 编译复杂度 | 低 | 中 |
| 适用场景 | 嵌入式、最小化编译 | 需要 FIPS 合规、系统已安装 OpenSSL |
# 使用内置 libtom(默认,推荐嵌入式)
./configure --enable-bundled-libtom
# 使用系统 OpenSSL
./configure --disable-bundled-libtom
# 确保系统已安装 libssl-dev / openssl-dev
zlib 依赖
zlib 用于 SSH 连接的数据压缩:
# 禁用 zlib(推荐嵌入式,减少依赖和攻击面)
./configure --disable-zlib
# 启用 zlib(带宽受限场景有用)
./configure --with-zlib=/path/to/zlib
注意: SSH 压缩在现代高速网络中通常弊大于利(消耗 CPU,安全风险),建议在嵌入式环境中禁用。
2.6 编译优化
针对大小优化
# 使用 -Os 优化大小
CFLAGS="-Os" ./configure ...
# 使用 -ffunction-sections + --gc-sections 去除未使用代码
CFLAGS="-Os -ffunction-sections -fdata-sections" \
LDFLAGS="-Wl,--gc-sections -Wl,--strip-all" \
./configure --prefix=/usr --disable-pam --disable-zlib
make -j$(nproc)
# 使用 strip 去除符号
strip --strip-all dropbear dbclient dropbearkey
针对性能优化
# 使用 -O2 或 -O3 优化性能
CFLAGS="-O2 -march=native" ./configure ...
make -j$(nproc)
静态编译
# 完全静态链接
CFLAGS="-static" LDFLAGS="-static" \
./configure --prefix=/usr \
--disable-pam \
--disable-zlib \
--enable-bundled-libtom
make -j$(nproc)
# 验证
file dropbear
# 输出: ... statically linked
UPX 压缩
编译完成后,可以使用 UPX 进一步压缩二进制:
# 安装 UPX
sudo apt-get install upx-ucl # Debian/Ubuntu
# 或
sudo apk add upx # Alpine
# 压缩
upx --best dropbear
upx --best dbclient
# 解压(运行时自动解压)
upx -d dropbear # 仅用于调试
# 典型压缩效果
# dropbear: 180K → 110K (约 39% 减少)
# dbclient: 140K → 90K (约 36% 减少)
2.7 安装后配置
目录结构
# 创建必要的目录和文件
sudo mkdir -p /etc/dropbear
sudo mkdir -p /var/run/dropbear
# 生成主机密钥(首次运行时也会自动生成)
sudo dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
sudo dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key
systemd 服务文件
# /etc/systemd/system/dropbear.service
[Unit]
Description=Dropbear SSH Server
After=network.target
Documentation=man:dropbear(8)
[Service]
Type=notify
ExecStartPre=/usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
ExecStartPre=/usr/bin/dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key
ExecStart=/usr/sbin/dropbear -F -E -R -p 22
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
# 启用并启动
sudo systemctl daemon-reload
sudo systemctl enable dropbear
sudo systemctl start dropbear
sudo systemctl status dropbear
SysVinit 启动脚本
#!/bin/sh
# /etc/init.d/dropbear
### BEGIN INIT INFO
# Provides: dropbear
# Required-Start: $network $local_fs
# Required-Stop: $network $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
DAEMON=/usr/sbin/dropbear
PIDFILE=/var/run/dropbear.pid
KEY_DIR=/etc/dropbear
# 自动生成主机密钥
generate_keys() {
for keytype in rsa ed25519; do
keyfile="${KEY_DIR}/dropbear_${keytype}_host_key"
if [ ! -f "$keyfile" ]; then
dropbearkey -t "$keytype" -f "$keyfile"
fi
done
}
case "$1" in
start)
generate_keys
$DAEMON -p 22 -P "$PIDFILE"
;;
stop)
if [ -f "$PIDFILE" ]; then
kill $(cat "$PIDFILE")
rm -f "$PIDFILE"
fi
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
2.8 多合一二进制(Multi-binary)
Dropbear 支持编译为单一二进制文件,通过符号链接实现不同功能:
# 编译多合一二进制
make -j$(nproc) MULTI=1
# 创建符号链接
ln -sf dropbearmulti dropbear # SSH 服务器
ln -sf dropbearmulti dbclient # SSH 客户端
ln -sf dropbearmulti dropbearkey # 密钥生成
ln -sf dropbearmulti dropbearconvert # 密钥转换
ln -sf dropbearmulti scp # 安全复制
# 使用
./dropbear -h # 启动服务器
./dbclient -h # 客户端
./dropbearkey -h # 密钥生成
# 或通过命令名区分(类似 BusyBox)
cp dropbearmulti /usr/bin/dropbear
cd /usr/bin
ln -sf dropbear dbclient
ln -sf dropbear dropbearkey
ln -sf dropbear dropbearconvert
ln -sf dropbear scp
优势: 多合一二进制在设备上只存储一份代码,通过符号链接实现多个命令,进一步节省 Flash 空间。
2.9 编译问题排查
常见编译错误
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
zlib.h: No such file | 缺少 zlib 开发包 | --disable-zlib 或安装 zlib1g-dev |
pam_appl.h: No such file | 缺少 PAM 开发包 | --disable-pam 或安装 libpam0g-dev |
undefined reference to crypt | 缺少 crypt 库 | 添加 -lcrypt 到 LDFLAGS |
cc1: error: unrecognized option | GCC 版本太旧 | 升级 GCC 或调整 CFLAGS |
configure: error: ... | 各类依赖缺失 | 查看 config.log 详细信息 |
诊断命令
# 查看 configure 帮助
./configure --help
# 查看 config.log 了解详细错误
less config.log
# 检查编译结果
make -n # 干运行,显示命令
make V=1 # 详细输出
2.10 本章小结
| 要点 | 说明 |
|---|---|
| 获取源码 | GitHub 或官方发布页,选择稳定版本 |
| 本地编译 | ./configure && make,三步完成 |
| 交叉编译 | --host= 指定目标架构,使用对应工具链 |
| 最小化编译 | 通过 localoptions.h 禁用不需要的功能 |
| 多合一二进制 | make MULTI=1 生成单一可执行文件 |
| 大小优化 | -Os + --gc-sections + strip + UPX |
扩展阅读
- Dropbear INSTALL 文件
- Dropbear default_options.h
- Yocto Project Dropbear Recipe
- Buildroot Dropbear 包
- 交叉编译指南 (Linux From Scratch)
上一章:Dropbear 概述 | 下一章:配置详解 →