强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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_X11FWD10X11 转发
DROPBEAR_CLI_LOCALTCPFWD10客户端本地转发
DROPBEAR_CLI_REMOTETCPFWD10客户端远程转发
DROPBEAR_CLI_AGENTFWD10Agent 转发
DROPBEAR_SVR_LOCALTCPFWD10服务端本地转发
DROPBEAR_SVR_REMOTETCPFWD10服务端远程转发
DROPBEAR_SVR_AGENTFWD10服务端 Agent 转发
DROPBEAR_SFTP_SERVER10SFTP 子系统
ENABLE_CLI_PASSWORD_AUTH11客户端密码认证
ENABLE_CLI_PUBKEY_AUTH11客户端公钥认证
ENABLE_SVR_PASSWORD_AUTH11服务端密码认证
ENABLE_SVR_PUBKEY_AUTH11服务端公钥认证
DROPBEAR_SHA1_HMAC10SHA1 HMAC
DROPBEAR_MD5_HMAC10MD5 HMAC
MAX_UNAUTH_CLIENTS103最大未认证连接数
MAX_AUTH_TRIES103最大认证尝试次数

最小化编译实战

以下脚本实现一个极致精简的 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-bitaarch64-linux-gnu树莓派 4/5、RK3588
ARM 32-bit (硬浮点)arm-linux-gnueabihf树莓派 2/3、i.MX6
ARM 32-bit (软浮点)arm-linux-gnueabi旧式 ARM 设备
MIPS Big Endianmips-linux-gnu路由器
MIPS Little Endianmipsel-linux-gnu路由器(MIPSel)
x86 (32-bit)i686-linux-gnu旧式 x86 嵌入式
RISC-V 64-bitriscv64-linux-gnuRISC-V 开发板
PowerPCpowerpc-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 optionGCC 版本太旧升级 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 概述 | 下一章:配置详解