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