NoctisNode
← 指南安全2026-10-238 分钟

通过 SSH 远程解锁 LUKS:dropbear-initramfs 与 cryptroot-unlock

在开机时远程解锁服务器上的 LUKS 根分区:安装 dropbear-initramfs、添加密钥、设置端口和 IP、重建 initramfs,然后 SSH 登录并运行 cryptroot-unlock。

简答:安装 `dropbear-initramfs`,把你的 SSH 公钥放入 `/etc/dropbear/initramfs/authorized_keys`(Debian 12/13、Ubuntu 24.04),为 initramfs 配置网络,运行 `update-initramfs -u` 并重启。在服务器等待输入密码时,SSH 登录到运行在独立端口上的小型 Dropbear 服务器并运行 `cryptroot-unlock`;随后系统会正常继续启动。

本指南假定根文件系统已位于 LUKS 之上(按照 LUKS 加密根分区指南设置),且 `/boot` 未加密——这是 Debian 和 Ubuntu 安装程序的默认设置。它适用于任何你能控制内核和 initramfs 的 KVM VPS;在磁盘上部署 小型 VPS 自托管栈中那类服务之前,这也是一个合理的基础。

远程解锁的工作原理

在根分区加密的系统中,内核首先加载 initramfs——一个以未加密形式存放在 `/boot` 中的小型临时根文件系统。它的任务是找到 LUKS 设备、询问密码、打开设备并移交给真正的根分区。通常,密码提示只会出现在本地控制台上。

`dropbear-initramfs` 向 initramfs 中添加了三样东西:Dropbear SSH 服务器、网络配置步骤,以及 `cryptroot-unlock` 辅助工具。Dropbear 在密码提示之前启动,只接受你预先写入的公钥登录,而 `cryptroot-unlock` 会把你的密码转交给正在等待的 `cryptsetup` 提示。根分区打开后,initramfs 会终止 Dropbear,你真正的 OpenSSH 服务器照常启动。

不同版本的文件路径不同

Dropbear 2022.83 发布后,配置目录发生了变化。许多旧教程仍使用旧路径,而在当前版本中,放在旧路径的密钥会被静默忽略。复制命令前请先确认你的系统版本。

Note · 在所有版本中,选项文件都是同一目录下的 `dropbear.conf`。initramfs 的主机密钥也存放在那里(`dropbear_ed25519_host_key` 等),与运行中系统的 OpenSSH 主机密钥是分开的。

发行版配置目录密钥文件
Debian 13(trixie)`/etc/dropbear/initramfs/``/etc/dropbear/initramfs/authorized_keys`
Debian 12(bookworm)`/etc/dropbear/initramfs/``/etc/dropbear/initramfs/authorized_keys`
Ubuntu 24.04(noble)`/etc/dropbear/initramfs/``/etc/dropbear/initramfs/authorized_keys`
Debian 11、Ubuntu 22.04 及更早版本`/etc/dropbear-initramfs/``/etc/dropbear-initramfs/authorized_keys`

在 Debian 12/13 和 Ubuntu 24.04 上分步配置

  1. 01.安装软件包:`apt install dropbear-initramfs`。此时出现关于 `authorized_keys` 文件缺失或无效的警告是正常的。
  2. 02.把你的公钥(最好是专用的 Ed25519 密钥)添加到 `/etc/dropbear/initramfs/authorized_keys`,每行一个密钥,并加以限制,使其只能用于解锁。
  3. 03.在 `/etc/dropbear/initramfs/dropbear.conf` 中设置 Dropbear 选项,包括使用非默认端口,以免 initramfs 主机密钥与你常规 SSH 主机密钥在 `known_hosts` 中冲突。
  4. 04.用 `ip=` 内核参数(静态)为 initramfs 配置网络;如果你的 VPS 网络支持,也可以依赖 DHCP。
  5. 05.用 `update-initramfs -u` 重建 initramfs;如果修改了内核命令行,还需运行 `update-grub`。
  6. 06.保持控制台访问作为后备手段后重启,然后连接并运行 `cryptroot-unlock`。
apt install dropbear-initramfs

# 1. Key (forced command: the key can only unlock)
echo 'no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/bin/cryptroot-unlock" ssh-ed25519 AAAA...yourkey unlock@laptop' \
  > /etc/dropbear/initramfs/authorized_keys
chmod 600 /etc/dropbear/initramfs/authorized_keys

# 2. Options in /etc/dropbear/initramfs/dropbear.conf
#    -p 2222  listen on port 2222
#    -s       disable password logins
#    -j -k    no local/remote port forwarding
#    -I 300   drop idle sessions after 300 s
DROPBEAR_OPTIONS="-p 2222 -s -j -k -I 300"

# 3. Rebuild
update-initramfs -u

initramfs 中的网络配置

initramfs 不读取 `/etc/network/interfaces`、netplan 或 systemd-networkd。它使用内核 `ip=` 参数,或 `/etc/initramfs-tools/initramfs.conf` 中的 `IP=` 行。两者都未设置时,它会在所有网卡上尝试 DHCP,这在许多云平台上可行,但在静态分配地址的 VPS 上并不保证有效。

格式为 `ip=<client-ip>::<gateway-ip>:<netmask>:<hostname>:<device>:off`。使用运行中系统上 `ip -4 addr` 和 `ip route` 的输出值。initramfs 中的网卡名称通常与可预测的名称相同(例如 `ens3` 或 `eth0`);如果不确定,把设备字段留空即可使用第一块网卡。这里 IPv4 是可靠的选择,因为 initramfs 网络步骤对 IPv6 的支持有限。

# /etc/default/grub (static IPv4 example, documentation addresses)
GRUB_CMDLINE_LINUX="ip=203.0.113.10::203.0.113.1:255.255.255.0::ens3:off"

update-grub
update-initramfs -u

# From your workstation after reboot:
ssh -p 2222 [email protected]
# without the forced command, type: cryptroot-unlock

解锁与日常使用

重启后,等服务器在 2222 端口响应,然后以 `root` 身份连接。如果按配置步骤设置了强制命令,`cryptroot-unlock` 会立即启动并询问 LUKS 密码;如果没有,你会进入 BusyBox shell,需自行输入 `cryptroot-unlock`。成功后会话关闭,initramfs 继续启动,一分钟后你的常规 SSH 服务器会在 22 端口响应(按 SSH 加固指南加固)。

为解锁端口使用单独的 `known_hosts` 条目,例如在 `~/.ssh/config` 中添加一个 `Host myserver-unlock` 块,设置 `Port 2222` 和 `HostKeyAlias myserver-unlock`。每次内核更新时,Debian 和 Ubuntu 都会重新生成 initramfs 并保留你的 Dropbear 密钥和选项,但重大升级后请测试一次重启。

  • ▹连接被拒绝:网络配置有误;在控制台上检查 `ip=` 的值。
  • ▹主机密钥警告:你在常规别名下连到了 initramfs 主机密钥;请使用单独的别名。
  • ▹`cryptroot-unlock` 提示没有等待中的设备:系统已经启动完毕,或 `/etc/crypttab` 中缺少根分区条目。
  • ▹修改密钥后不生效:你编辑的是旧的 `/etc/dropbear-initramfs/` 路径,或忘了运行 `update-initramfs -u`。

威胁模型:远程解锁能保护什么、不能保护什么

带远程解锁的 LUKS 保护的是静态数据。断电的磁盘、复制的磁盘镜像、退役的硬盘,或在关机状态下被查扣的服务器,暴露的都只是密文。对 VPS 来说,这是真实且有用的保障。

它无法保护运行中的服务器免受宿主机控制者的影响。`/boot` 中的 initramfs 和内核未加密,因此拥有虚拟化层或控制台访问权限的人可以篡改它们,在下次启动时记录你的密码;运行中虚拟机的内存(包括 LUKS 主密钥)也能从宿主机读取。请把远程解锁视为防范查扣和磁盘泄露的手段,而不是防范恶意虚拟化层的手段。重启时出现的异常(例如 Dropbear 主机密钥变化)值得调查。

Note · 在 NoctisNode VPS 上,你拥有 KVM 上的完整 root 权限,并可使用 Debian 13/12 和 Ubuntu 24.04 镜像,因此该配置可按上述方式运行。这里的限制与其他地方一样:加密保护的是磁盘,而不是运行中的虚拟机。服务商一侧记录和不记录哪些内容,参见无日志 VPS 详解。

常见问题

QDebian 12 上 dropbear initramfs 的 authorized_keys 文件在哪里?

A在 Debian 12 和 13 以及 Ubuntu 24.04 上是 `/etc/dropbear/initramfs/authorized_keys`。Debian 11 和 Ubuntu 22.04 使用 `/etc/dropbear-initramfs/authorized_keys`。任何修改后都要运行 `update-initramfs -u`。

Qcryptroot-unlock 有什么作用?

A`cryptroot-unlock` 是 initramfs 中的辅助工具,它会找到等待中的 LUKS 密码提示,并把你输入的密码传给它。设备打开后,启动继续进行,Dropbear 会话结束。

Q如何修改 dropbear-initramfs 的 SSH 端口?

A在 `/etc/dropbear/initramfs/dropbear.conf` 中设置 `DROPBEAR_OPTIONS="-p 2222"`(以及其他所需参数),然后运行 `update-initramfs -u` 并重启。

Q在 VPS 上通过 SSH 远程解锁 LUKS 安全吗?

A它能保护断电或被复制磁盘上的数据。它无法防范拥有虚拟化层访问权限的人,对方可以篡改未加密的 initramfs 或读取运行中虚拟机的内存。

Qdropbear-initramfs 能配合 LUKS2 使用吗?

A能。解锁是在 Linux 用户态中通过 `cryptsetup` 完成的,因此使用 Argon2id 的 LUKS2 可以正常工作;格式差异参见 LUKS2 与 LUKS1 对比。

通过 SSH 远程解锁 LUKS:dropbear-initramfs 与 cryptroot-unlock · NoctisNode