OpenWrt/ssh

OpenWrt/ssh

OpenWrt 默认使用 Dropbear 作为 ssh client / server。Dropbear 与 openssh 有一些不同。

ssh-keygen

OpenWrt 默认的 Dropbear 的 ssh 客户端没有 ssh-keygen。需要自行安装完整版 ssh client 里的 utils 包才有 ssh-keygen:

opkg update
opkg install openssh-client openssh-client-utils

ssh-copy-id

OpenWrt 没有 ssh-copy-id, 可以自己写个脚本实现基本的 ssh-copy-id 功能。

ssh client

公钥认证登录其他 ssh 服务器

OpenWRT 内置的 dropbear ssh,其公钥文件格式与 OpenSSH 相同,但私钥文件格式与 OpenSSH 不同(Dropbear 使用二进制格式的私钥文件)。

dropbear 的 ssh client 默认使用 ~/.ssh/id_dropbear 文件作为登陆时用于验证的私钥。

使用 dropbearkey 生成 dropbear 格式的公钥 / 私钥对。

转换 Dropbear OpenSSH 格式的私钥:(需要在 Debian / Ubuntu Linux 系统里操作)

apt-get install dropbear
# openssh => dropbear key
/usr/lib/dropbear/dropbearconvert openssh dropbear id_rsa id_dropbear
# dropbear => oppenssh key
/usr/lib/dropbear/dropbearconvert dropbear openssh id_dropbear id_rsa

如果用 dropbearconvert 转换 openssh -> dropbear 时报错 "Error: Unrecognised key type",则需要先处理下 id_rsa 将其从 RFC4716 转换为 PEM 格式。

# update id_rsa file in place
ssh-keygen -m PEM -p -f id_rsa

后台运行

某些情况下,需要保持在后台运行 dropbear ssh 客户端(如使用 ssh tunnel)

dropbear 的 ssh 支持 -f 选项后台运行,但必须配合指定 command 使用。

可以在远端 ssh 服务器上写一个 /usr/bin/pause.sh 脚本无限 block:

#!/bin/sh

while [ 1 ]
do
  sleep 10000
done

然后在 OpenWrt 上启动 后台 ssh client 连接 ssh 服务器同时开启隧道(以下示例将 ssh 服务器 192.168.1.2 的 21 端口通过 ssh 客户端转发给 1.2.3.4:21):

nohup ssh -R 21:1.2.3.4:21 192.168.1.2 pause.sh > /dev/null 2>&1 &

PS. 测试 OpenWrt 的 dropbear ssh client 的 local tunnel (-L) 似乎 break。

ssh server

监听 IP

OpenWrt 安装的 dropbear 默认仅监听 LAN。

/etc/config/dropbear

config dropbear
        option PasswordAuth 'on'
        option Port '22'
#       option Interface 'lan'
        option GatewayPorts 'on'

如上,注释掉 option Interface 后 Dropbear 即监听所有 IP。注意如果需要从 WAN 访问 dropbear 的 ssh server,还需要在 iptables 的 INPUT 里放行入站流量。

SSH public key authorization

OpenWRT 内置的是 dropbear ssh server,其公钥登录文件路径是 /etc/dropbear/authorized_keys。而 OpenSSH Server 默认的公钥路径是 ~/.ssh/authorized_keys。所以从其他机器 ssh-copy-id 到 OpenWrt 设备后也无法公钥登录 OpenWrt。

解决方法是(如果存在该文件的话)删掉OpenWRT 自带的 /etc/dropbear/authorized_keys,然后做个符号链接指向 /root/.ssh/authorized_keys

rm /etc/dropbear/authorized_keys
ln -s /root/.ssh/authorized_keys  /etc/dropbear/authorized_keys

sftp

Dropbear 的 ssh server 只支持 scp 传输文件。如果需要 sftp,安装 openssh-sftp-server 包

opkg install openssh-sftp-server

Last update: 2021-04-12 03:31:45 UTC