В общем, много разных советов читал, но нормальной инструкции так и не нашёл, так что вот вам моя версия с успешным подключением по ключу.
Подключение через порт DropBear (предустановленный пакет Entware) - не путайте с параметрами SSH, настраиваемыми на самом роутере. При подключении напрямую к DropBear вы попадаете в Entware минуя cli роутера (не нужно будет писать `exec sh`).
Может потребоваться настраивать разрешение в фаерволе самого роутера (через веб-морду).
Настройки для ROOT (пароль должен быть задан при первоначальной настройке Entware)!
Для Windows-пользователей расположение config-файла SSH и ключи по умолчанию в папке пользователя: C:\Users\<USERNAME>\.ssh ( %userprofile%\.ssh )
Настройка входа по SSH-ключу в Entware Dropbear на Keenetic
1. Создать SSH-ключ на компьютере
Если ключа ещё нет:
ssh-keygen -t ed25519
По умолчанию будут созданы:
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
id_ed25519 — приватный ключ, его никому не передавать;
id_ed25519.pub — публичный ключ, его нужно добавить на роутер.
2. Определить домашний каталог root в Entware
Подключиться к Entware Dropbear по паролю и выполнить:
echo "$HOME"
grep '^root:' /opt/etc/passwd /etc/passwd 2>/dev/null
Обычно для Entware:
HOME=/opt/root
3. Создать каталог для ключей
На роутере:
mkdir -p /opt/root/.ssh
chmod 700 /opt/root/.ssh
Добавить содержимое публичного ключа в файл:
nano /opt/root/.ssh/authorized_keys
Вставить одну строку вида:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... user@computer
После сохранения:
chmod 600 /opt/root/.ssh/authorized_keys
chown -R root:root /opt/root/.ssh
Проверить:
ls -ld /opt/root /opt/root/.ssh
ls -l /opt/root/.ssh/authorized_keys
Нормальные права:
drwxr-xr-x /opt/root
drwx------ /opt/root/.ssh
-rw------- /opt/root/.ssh/authorized_keys
4. Проверить вход с явным указанием ключа
На компьютере:
ssh -i ~/.ssh/id_ed25519 -p 222 root@ROUTER_IP
Для проверки без перехода к паролю:
ssh -o BatchMode=yes -i ~/.ssh/id_ed25519 -p 222 root@ROUTER_IP
Если вход прошёл — настройка готова.
5. Если Dropbear всё равно требует пароль
Запустить временный Dropbear на другом порту, явно указав каталог с authorized_keys:
/opt/sbin/dropbear \
-F \
-E \
-p 223 \
-P /tmp/dropbear-test.pid \
-D /opt/root/.ssh
Из другого окна проверить:
ssh -o BatchMode=yes -i ~/.ssh/id_ed25519 -p 223 root@ROUTER_IP
Если с параметром -D ключ заработал, значит установленный Dropbear по умолчанию ищет authorized_keys не в домашнем каталоге пользователя.
6. Постоянно указать каталог authorized_keys
Открыть конфигурацию:
nano /opt/etc/config/dropbear.conf
Добавить:
AUTHORIZED_KEYS_DIR="/opt/root/.ssh"
Пример полного файла:
PORT=222
PIDFILE="/opt/var/run/dropbear.pid"
AUTHORIZED_KEYS_DIR="/opt/root/.ssh"
Открыть init-скрипт:
nano /opt/etc/init.d/S51dropbear
Найти функцию запуска:
start()
{
$DROPBEAR -p $PORT -P $PIDFILE
}
Заменить на:
start()
{
$DROPBEAR -p "$PORT" -P "$PIDFILE" -D "$AUTHORIZED_KEYS_DIR"
}
Перезапустить Dropbear:
/opt/etc/init.d/S51dropbear restart
Текущую SSH-сессию до проверки лучше не закрывать.
Проверить из нового окна:
ssh -o BatchMode=yes -i ~/.ssh/id_ed25519 -p 222 root@ROUTER_IP
7. Проверить параметры запущенного процесса
На роутере:
ps w | grep '[d]ropbear'
У Entware Dropbear должна быть строка примерно такого вида:
/opt/sbin/dropbear -p 222 -P /opt/var/run/dropbear.pid -D /opt/root/.ssh
Также можно проверить слушающий порт:
netstat -lntp | grep ':222'
8. Удобная запись в SSH config
На компьютере можно добавить:
Host my-router
HostName 192.168.1.1
User root
Port 222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
После этого подключение выполняется одной командой:
ssh my-router
"my-router" можно заменить на любое удобное для вас название. HostName - указываете IP роутера (внутренний, если работаете в сети роутера / внешний, если подключаетесь извне и открыт доступ на фаерволе роутера)
Диагностика
Для подробного вывода клиента:
ssh -vvv -i ~/.ssh/id_ed25519 -p 222 root@ROUTER_IP
В исправном случае должны появиться строки:
Offering public key
Server accepts key
Authenticated ... using "publickey"
Если есть:
Offering public key
но нет:
Server accepts key
значит клиент ключ нашёл, но Dropbear его отвергает. Нужно проверять:
путь к authorized_keys;
параметр -D;
права каталогов и файла;
соответствие публичного ключа приватному;
пользователя, под которым выполняется вход.
Поиск файлов вида `id_ed25519-cert` и `id_ed25519-cert.pub` в отладочном выводе OpenSSH является нормальным. Клиент автоматически проверяет наличие SSH-сертификата рядом с обычным ключом; отсутствие этих файлов не мешает авторизации обычным ключом.