SSH
SSH (Secure Shell) — защищённый сетевой протокол для удалённого доступа к командной строке, выполнения команд, передачи файлов и создания зашифрованных туннелей.
Руководство ориентировано на OpenSSH в Linux и macOS. Большинство клиентских команд также работает во встроенном OpenSSH для Windows.
Содержание
- Как работает SSH
- Подключение к серверу
- Проверка ключа сервера
- SSH-ключи
- Создание ключей через ssh-keygen
- Установка публичного ключа на сервер
- Аутентификация по ключу и паролю
- ssh-agent
- SSH config
- Port forwarding
- Передача файлов через scp
- SFTP
- Базовая безопасность SSH-сервера
- Ограничение ключей в authorized_keys
- Устранение неполадок
- Шпаргалка
Как работает SSH
Обычное SSH-соединение включает несколько этапов:
- клиент подключается к TCP-порту SSH-сервера, по умолчанию
22; - клиент и сервер согласуют алгоритмы шифрования;
- сервер подтверждает свою подлинность ключом хоста;
- создаётся зашифрованный канал;
- пользователь проходит аутентификацию;
- внутри защищённого канала открывается терминал, выполняется команда или передаются файлы.
Упрощённая схема:
SSH-клиент
│
│ TCP-соединение и зашифрованный канал
▼
SSH-сервер
│
├── интерактивная оболочка
├── выполнение команды
├── SFTP
└── перенаправление портовСовременные версии OpenSSH используют SSH Protocol 2. Устаревший SSH Protocol 1 применять нельзя.
В SSH используются два разных типа ключей:
- ключ хоста идентифицирует сервер;
- ключ пользователя используется для входа пользователя на сервер.
Приватный ключ пользователя при подключении не передаётся. Клиент доказывает владение им с помощью криптографической подписи.
Подключение к серверу
Основной синтаксис:
ssh USER@HOSTПример:
ssh alice@example.comПодключение к нестандартному порту:
ssh -p 2222 alice@example.comПодключение по IP-адресу:
ssh alice@192.168.1.50Выполнение одной команды без открытия интерактивной оболочки:
ssh alice@example.com 'uname -a'Несколько команд:
ssh alice@example.com 'cd /var/log && tail -n 50 syslog'Передача локальной переменной в удалённую команду требует осторожного экранирования:
ssh alice@example.com "echo '$USER'"В этом примере $USER раскрывается локальной оболочкой. Чтобы раскрыть переменную на сервере:
ssh alice@example.com 'echo "$USER"'Полезные параметры
| Параметр | Назначение |
|---|---|
-p PORT |
Порт SSH-сервера |
-i FILE |
Приватный ключ |
-J HOST |
Подключение через промежуточный сервер |
-v |
Диагностический вывод |
-vvv |
Максимально подробная диагностика |
-N |
Не запускать удалённую команду |
-T |
Не выделять псевдотерминал |
-t |
Принудительно выделить псевдотерминал |
-4 |
Использовать IPv4 |
-6 |
Использовать IPv6 |
Подключение с конкретным ключом:
ssh -i ~/.ssh/id_ed25519_work alice@example.comЗапуск интерактивной команды, которой нужен терминал:
ssh -t alice@example.com 'sudo systemctl status nginx'Проверка ключа сервера
При первом подключении OpenSSH показывает отпечаток ключа сервера:
The authenticity of host 'example.com' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?Перед подтверждением отпечаток желательно сверить через доверенный канал. На самом сервере отпечаток ключа можно получить командой:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pubПосле подтверждения ключ сохраняется в:
~/.ssh/known_hostsПри последующих подключениях клиент сравнивает полученный ключ с сохранённым.
Предупреждение:
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!может появиться после переустановки сервера, изменения ключей или подключения к другому серверу по тому же адресу. Оно также может указывать на перехват соединения. Не удаляйте старую запись, пока не проверите новый отпечаток.
После проверки удалить устаревшую запись можно так:
ssh-keygen -R example.comДля нестандартного порта:
ssh-keygen -R '[example.com]:2222'SSH-ключи
Пара SSH-ключей состоит из двух файлов:
~/.ssh/id_ed25519 приватный ключ
~/.ssh/id_ed25519.pub публичный ключПриватный ключ:
- остаётся на клиентском компьютере;
- не должен передаваться другим людям;
- желательно защищать парольной фразой;
- должен храниться с ограниченными правами доступа.
Публичный ключ:
- можно копировать на серверы;
- хранится на сервере в
~/.ssh/authorized_keys; - сам по себе не позволяет восстановить приватный ключ.
Парольная фраза ключа и пароль пользователя — разные вещи:
- пароль пользователя проверяет SSH-сервер;
- парольная фраза защищает файл приватного ключа на клиентском компьютере.
Создание ключей через ssh-keygen
Рекомендуемый ключ Ed25519
ssh-keygen -t ed25519 -a 100 -C "alice@example.com"Параметры:
| Параметр | Значение |
|---|---|
-t ed25519 |
Тип ключа Ed25519 |
-a 100 |
Число раундов защиты приватного ключа |
-C |
Комментарий для идентификации ключа |
По умолчанию будут созданы файлы:
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pubРекомендуется задать парольную фразу. Она защищает приватный ключ при копировании или краже файла.
Отдельный ключ для конкретного назначения
ssh-keygen -t ed25519 -a 100 \
-f ~/.ssh/id_ed25519_work \
-C "alice work key"Будут созданы:
~/.ssh/id_ed25519_work
~/.ssh/id_ed25519_work.pubОтдельные ключи удобны для разделения личных, рабочих и автоматизированных подключений.
RSA для совместимости
Если сервер не поддерживает Ed25519:
ssh-keygen -t rsa -b 4096 -a 100 -C "alice@example.com"Для новых систем предпочтительнее Ed25519. Ключи DSA использовать не следует.
Просмотр публичного ключа
cat ~/.ssh/id_ed25519.pubПубличный ключ выглядит примерно так:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alice@example.comПросмотр отпечатка ключа
ssh-keygen -lf ~/.ssh/id_ed25519.pubОтпечаток в другом формате:
ssh-keygen -E sha256 -lf ~/.ssh/id_ed25519.pubИзменение парольной фразы
ssh-keygen -p -f ~/.ssh/id_ed25519Восстановление публичного ключа из приватного
Если файл .pub потерян:
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pubПрава доступа
Рекомендуемые права:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/configПриватный ключ не должен быть доступен другим пользователям.
Установка публичного ключа на сервер
Через ssh-copy-id
Самый простой вариант:
ssh-copy-id alice@example.comУстановка конкретного ключа:
ssh-copy-id -i ~/.ssh/id_ed25519_work.pub alice@example.comДля нестандартного порта:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 alice@example.comПосле установки проверьте подключение:
ssh alice@example.comВручную
Если ssh-copy-id отсутствует:
cat ~/.ssh/id_ed25519.pub |
ssh alice@example.com 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'Либо скопируйте содержимое .pub в файл на сервере:
~/.ssh/authorized_keysКаждый публичный ключ должен находиться на отдельной строке.
Права на сервере:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysДомашний каталог и каталог .ssh не должны быть доступны для записи посторонним пользователям.
Удаление доступа
Чтобы отозвать ключ, удалите соответствующую строку из:
~/.ssh/authorized_keysПеред удалением удобно посмотреть ключи с номерами строк:
nl -ba ~/.ssh/authorized_keysАутентификация по ключу и паролю
Парольная аутентификация
При парольной аутентификации сервер проверяет пароль учётной записи.
Преимущества:
- не нужно заранее устанавливать ключ;
- удобно для первоначальной настройки;
- поддерживается практически везде.
Недостатки:
- пароль можно подобрать;
- возможны атаки на повторно используемые пароли;
- пароль приходится вводить при каждом подключении;
- менее удобно для безопасной автоматизации.
Пароль передаётся внутри зашифрованного SSH-канала, а не открытым текстом. Основная проблема заключается не в передаче, а в подборе, краже или повторном использовании пароля.
Аутентификация по ключу
При аутентификации по ключу сервер хранит публичный ключ, а клиент доказывает владение приватным ключом.
Преимущества:
- высокая стойкость к перебору;
- приватный ключ не передаётся серверу;
- удобно использовать с
ssh-agent; - подходит для автоматизации;
- доступ можно отозвать удалением публичного ключа.
Недостатки:
- ключи нужно создавать, устанавливать и учитывать;
- украденный незащищённый приватный ключ можно использовать;
- потеря приватного ключа без резервного способа доступа может заблокировать вход.
Рекомендуемый вариант:
- создать отдельный ключ Ed25519;
- защитить приватный ключ парольной фразой;
- установить публичный ключ на сервер;
- проверить вход по ключу;
- только после проверки отключить парольную аутентификацию.
ssh-agent
ssh-agent хранит расшифрованные приватные ключи в памяти. Благодаря этому парольную фразу не приходится вводить при каждом подключении.
Запуск агента
Во многих графических окружениях агент запускается автоматически. Вручную его можно запустить так:
eval "$(ssh-agent -s)"Пример результата:
Agent pid 12345Проверить наличие агента:
printf '%s\n' "$SSH_AUTH_SOCK"Добавление ключа
ssh-add ~/.ssh/id_ed25519Добавление рабочего ключа:
ssh-add ~/.ssh/id_ed25519_workПосле ввода парольной фразы агент сохранит ключ в памяти.
Добавление ключа на ограниченное время
Например, на один час:
ssh-add -t 1h ~/.ssh/id_ed25519На десять минут:
ssh-add -t 10m ~/.ssh/id_ed25519Просмотр загруженных ключей
ssh-add -lПросмотр публичных частей:
ssh-add -LУдаление ключа
ssh-add -d ~/.ssh/id_ed25519Удаление всех ключей из агента:
ssh-add -DДобавление ключа в macOS Keychain
В современных версиях OpenSSH для macOS:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519В конфигурации можно указать:
Host *
AddKeysToAgent yes
UseKeychain yesПараметр UseKeychain специфичен для поставляемого Apple клиента OpenSSH и может не поддерживаться в других системах.
Agent forwarding
Перенаправление агента позволяет использовать локальный ключ через промежуточный сервер:
ssh -A alice@gateway.example.comПриватный ключ при этом не копируется на промежуточный сервер. Однако процесс с достаточными правами на таком сервере потенциально может использовать подключённый агент, пока соединение активно.
Вместо ssh -A по возможности используйте ProxyJump:
ssh -J alice@gateway.example.com bob@internal.example.comSSH config
Пользовательский конфигурационный файл:
~/.ssh/configСистемный файл:
/etc/ssh/ssh_configСоздание пользовательского файла:
mkdir -p ~/.ssh
touch ~/.ssh/config
chmod 700 ~/.ssh
chmod 600 ~/.ssh/configПростой пример
Host production
HostName server.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_production
IdentitiesOnly yesПосле этого вместо длинной команды:
ssh -p 2222 -i ~/.ssh/id_ed25519_production deploy@server.example.comможно использовать:
ssh productionПсевдоним работает и в других OpenSSH-командах:
scp report.txt production:/tmp/
sftp productionОсновные параметры
| Параметр | Назначение |
|---|---|
Host |
Псевдоним или шаблон хостов |
HostName |
Реальное имя или IP-адрес |
User |
Имя пользователя |
Port |
Порт SSH |
IdentityFile |
Приватный ключ |
IdentitiesOnly |
Использовать только явно заданные ключи |
ProxyJump |
Промежуточный SSH-сервер |
ServerAliveInterval |
Интервал проверок соединения |
ServerAliveCountMax |
Допустимое число пропущенных ответов |
ForwardAgent |
Перенаправление агента |
LocalForward |
Локальное перенаправление порта |
RemoteForward |
Удалённое перенаправление порта |
DynamicForward |
Динамический SOCKS-прокси |
AddKeysToAgent |
Добавлять использованный ключ в агент |
Compression |
Включать сжатие |
Несколько серверов
Host dev
HostName dev.example.com
User alice
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
Host production
HostName production.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_production
IdentitiesOnly yes
Host backup
HostName 192.168.10.20
User backup
IdentityFile ~/.ssh/id_ed25519_backup
IdentitiesOnly yes
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yesOpenSSH обычно использует первое полученное значение параметра. Поэтому специфичные блоки рекомендуется размещать выше общих правил Host *.
Шаблоны
Настройки для всех серверов домена:
Host *.example.com
User alice
IdentityFile ~/.ssh/id_ed25519_workИсключение из шаблона:
Host *.example.com !public.example.com
User aliceПодключение через промежуточный сервер
Host gateway
HostName gateway.example.com
User alice
IdentityFile ~/.ssh/id_ed25519_work
Host internal
HostName 10.20.0.15
User admin
ProxyJump gateway
IdentityFile ~/.ssh/id_ed25519_internalПодключение:
ssh internalЭквивалентная команда:
ssh -J alice@gateway.example.com admin@10.20.0.15Просмотр итоговой конфигурации
ssh -G productionНайти отдельные параметры:
ssh -G production | grep -E '^(hostname|user|port|identityfile) 'Port forwarding
SSH может передавать произвольные TCP-соединения через зашифрованный канал.
Основные виды:
| Вид | Параметр | Назначение |
|---|---|---|
| Local forwarding | -L |
Открыть порт на локальной машине |
| Remote forwarding | -R |
Открыть порт на удалённой машине |
| Dynamic forwarding | -D |
Создать локальный SOCKS-прокси |
Для туннелей обычно используются параметры:
-N не запускать удалённую команду
-T не выделять терминалLocal forwarding
Синтаксис:
ssh -N -L LOCAL_ADDRESS:LOCAL_PORT:TARGET_HOST:TARGET_PORT USER@SSH_SERVERПример:
ssh -N \
-L 127.0.0.1:15432:db.internal:5432 \
alice@gateway.example.comСхема:
localhost:15432
│
│ SSH-туннель
▼
gateway.example.com
│
▼
db.internal:5432Теперь локальная программа может подключиться к:
127.0.0.1:15432Например:
psql -h 127.0.0.1 -p 15432Адрес db.internal разрешается и открывается со стороны SSH-сервера, а не локального компьютера.
Если сервис работает непосредственно на SSH-сервере:
ssh -N -L 127.0.0.1:8080:127.0.0.1:80 alice@example.comЛокальный адрес сервиса:
http://127.0.0.1:8080Remote forwarding
Синтаксис:
ssh -N -R REMOTE_ADDRESS:REMOTE_PORT:LOCAL_HOST:LOCAL_PORT USER@SSH_SERVERПример:
ssh -N \
-R 127.0.0.1:9000:127.0.0.1:3000 \
alice@example.comПосле этого порт 9000 на удалённом сервере перенаправляется на локальный сервис:
локальная машина:3000
▲
│ SSH-туннель
│
удалённый сервер:9000На удалённом сервере:
curl http://127.0.0.1:9000Для открытия удалённого порта на всех интерфейсах может потребоваться:
GatewayPorts yesв серверном /etc/ssh/sshd_config. Это делает порт доступным из сети и требует осторожности, а также настройки межсетевого экрана.
Без необходимости привязывайте удалённый порт к 127.0.0.1.
Dynamic forwarding
Создание локального SOCKS5-прокси:
ssh -N -D 127.0.0.1:1080 alice@example.comПосле этого приложения можно настроить на SOCKS5-прокси:
127.0.0.1:1080Проверка через curl:
curl --proxy socks5h://127.0.0.1:1080 https://example.comВариант socks5h передаёт разрешение доменного имени через прокси и уменьшает риск локальной утечки DNS-запроса.
Не привязывайте SOCKS-прокси к 0.0.0.0, если не хотите сделать его доступным другим устройствам.
Проверка успешного создания туннеля
ssh -o ExitOnForwardFailure=yes \
-N -L 127.0.0.1:8080:127.0.0.1:80 \
alice@example.comЕсли порт невозможно открыть, SSH сразу завершится с ошибкой.
Запуск туннеля в фоне
ssh -fN \
-o ExitOnForwardFailure=yes \
-L 127.0.0.1:8080:127.0.0.1:80 \
alice@example.comПараметр -f переводит клиент в фон после аутентификации.
Туннели в SSH config
Host database-tunnel
HostName gateway.example.com
User alice
IdentityFile ~/.ssh/id_ed25519_work
LocalForward 127.0.0.1:15432 db.internal:5432
ExitOnForwardFailure yesЗапуск:
ssh -N database-tunnelДинамический прокси:
Host socks-proxy
HostName server.example.com
User alice
DynamicForward 127.0.0.1:1080
ExitOnForwardFailure yesЗапуск:
ssh -N socks-proxyПередача файлов через scp
scp копирует файлы через SSH. В современных версиях OpenSSH команда scp по умолчанию использует протокол SFTP, сохраняя привычный синтаксис.
Копирование файла на сервер
scp report.txt alice@example.com:/home/alice/Через псевдоним из ~/.ssh/config:
scp report.txt production:/tmp/Копирование файла с сервера
scp alice@example.com:/var/log/app.log .Копирование под другим именем:
scp alice@example.com:/var/log/app.log ./production-app.logКопирование каталога
scp -r project/ alice@example.com:/home/alice/Получение каталога:
scp -r alice@example.com:/var/www/site/ ./site-backup/Нестандартный порт
Для scp порт задаётся заглавным -P:
scp -P 2222 report.txt alice@example.com:/tmp/Не путайте:
-P PORT порт SSH-сервера
-p сохранить время изменения и режим файлаКонкретный ключ
scp -i ~/.ssh/id_ed25519_work report.txt alice@example.com:/tmp/Ограничение скорости
Ограничение задаётся в килобитах в секунду:
scp -l 8000 large-file.iso alice@example.com:/tmp/Сохранение атрибутов
scp -p report.txt alice@example.com:/tmp/Принудительное использование старого SCP-протокола
Для совместимости с устаревшим сервером:
scp -O file.txt alice@legacy.example.com:/tmp/Старый SCP-протокол имеет больше особенностей с обработкой удалённых путей. Используйте -O только при необходимости.
SFTP
SFTP — протокол передачи и управления файлами поверх SSH. Несмотря на название, он не связан с обычным FTP и не требует отдельного FTP-сервера.
Подключение:
sftp alice@example.comНестандартный порт:
sftp -P 2222 alice@example.comКонкретный ключ:
sftp -i ~/.ssh/id_ed25519_work alice@example.comПсевдоним из SSH config:
sftp productionОсновные команды SFTP
| Команда | Действие |
|---|---|
pwd |
Показать удалённый каталог |
lpwd |
Показать локальный каталог |
ls |
Показать удалённые файлы |
lls |
Показать локальные файлы |
cd DIR |
Сменить удалённый каталог |
lcd DIR |
Сменить локальный каталог |
get FILE |
Скачать файл |
put FILE |
Загрузить файл |
reget FILE |
Продолжить скачивание |
reput FILE |
Продолжить загрузку |
mkdir DIR |
Создать удалённый каталог |
rmdir DIR |
Удалить пустой удалённый каталог |
rm FILE |
Удалить удалённый файл |
rename OLD NEW |
Переименовать файл |
chmod MODE FILE |
Изменить права |
progress |
Включить или отключить индикатор |
help |
Открыть справку |
exit |
Завершить сеанс |
Пример интерактивной работы:
sftp> lcd ~/Downloads
sftp> cd /var/tmp
sftp> put archive.tar.gz
sftp> ls -la
sftp> exitКопирование каталога
Загрузка:
sftp> put -r projectСкачивание:
sftp> get -r backupsПакетный режим
Файл sftp-commands.txt:
cd /srv/backups
put backup.tar.gz
ls -l
exitВыполнение:
sftp -b sftp-commands.txt backup@example.comОдноразовый пакет без отдельного файла:
printf '%s\n' \
'cd /srv/backups' \
'put backup.tar.gz' \
'exit' |
sftp backup@example.comДля автоматизации лучше использовать отдельный ключ с ограниченными правами и минимально необходимым доступом.
Базовая безопасность SSH-сервера
Конфигурация сервера обычно находится в:
/etc/ssh/sshd_configДополнительные фрагменты конфигурации могут находиться в:
/etc/ssh/sshd_config.d/Перед изменениями:
- убедитесь, что вход по ключу работает;
- сохраните текущую SSH-сессию открытой;
- откройте вторую сессию для проверки;
- проверьте конфигурацию через
sshd -t; - только после успешного теста закрывайте старое соединение.
Минимальный вариант усиления настроек
Пример фрагмента конфигурации:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 30Ограничение списка пользователей:
AllowUsers alice deployЕсли перенаправление портов не используется:
AllowTcpForwarding noЕсли не используется перенаправление агента:
AllowAgentForwarding noЕсли не используется X11:
X11Forwarding noОтключайте функции только после проверки, что они не нужны существующим сценариям работы.
Отключение входа по паролю
Сначала установите публичный ключ и проверьте отдельное подключение:
ssh -o PreferredAuthentications=publickey alice@example.comЗатем задайте на сервере:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication noПроверьте синтаксис:
sudo sshd -tЕсли команда ничего не вывела, синтаксических ошибок обычно нет.
Просмотр эффективных параметров:
sudo sshd -T |
grep -E '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) 'Перезагрузка конфигурации в Ubuntu и Debian:
sudo systemctl reload sshВ Fedora, RHEL и некоторых других системах:
sudo systemctl reload sshdНе закрывая старую сессию, проверьте новое подключение:
ssh alice@example.comЗапрет входа root
Полный запрет:
PermitRootLogin noВариант, допускающий вход root только по ключу:
PermitRootLogin prohibit-passwordОбычно безопаснее входить под обычным пользователем и выполнять административные команды через sudo.
Смена порта SSH
Изменение порта уменьшает количество автоматического сетевого шума, но не заменяет ключи, обновления и межсетевой экран.
Пример:
Port 2222До перезапуска SSH разрешите новый порт в межсетевом экране.
Для UFW:
sudo ufw allow 2222/tcpДля firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reloadВ системах с SELinux может понадобиться разрешить новый порт для SSH:
sudo semanage port -a -t ssh_port_t -p tcp 2222Если порт уже зарегистрирован с другим типом, сначала проверьте настройки:
sudo semanage port -l | grep sshЗатем проверьте конфигурацию и перезагрузите службу:
sudo sshd -t
sudo systemctl reload sshdНе закрывая текущую сессию, подключитесь через новый порт:
ssh -p 2222 alice@example.comТолько после успешной проверки можно удалить старое правило межсетевого экрана для порта 22.
Обновления и сетевые ограничения
Регулярно устанавливайте обновления OpenSSH и операционной системы.
Если SSH должен быть доступен только из доверенной сети, ограничьте входящие подключения межсетевым экраном. Пример для UFW:
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcpДля публичных серверов полезны:
- вход только по ключам;
- запрет прямого входа root;
- ограничение пользователей через
AllowUsers; - межсетевой экран;
- ограничение частоты попыток подключения;
- мониторинг журналов;
- отдельные ключи для людей и автоматизации.
Ограничение ключей в authorized_keys
Перед публичным ключом в authorized_keys можно указать ограничения.
Запрет туннелей, агента и X11:
no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAA...Разрешение входа только с определённого адреса:
from="192.168.1.0/24" ssh-ed25519 AAAA...Принудительное выполнение конкретной команды:
command="/usr/local/bin/create-backup",no-pty,no-port-forwarding ssh-ed25519 AAAA...Такие ограничения особенно полезны для ключей автоматизации.
Устранение неполадок
Подробная диагностика клиента
ssh -v alice@example.comБолее подробный вывод:
ssh -vvv alice@example.comВ диагностике можно увидеть:
- какие конфигурационные файлы прочитаны;
- какие ключи найдены;
- какие методы аутентификации разрешены;
- какой ключ предложен серверу;
- почему сервер отклонил ключ.
Сервер не принимает ключ
Проверьте на сервере:
ls -ld ~ ~/.ssh
ls -l ~/.ssh/authorized_keysИсправление типичных прав:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysПроверьте, что публичный ключ записан одной строкой:
cat ~/.ssh/authorized_keysПроверьте эффективную конфигурацию сервера:
sudo sshd -T | grep -E 'pubkeyauthentication|authorizedkeysfile'Permission denied (publickey)
Явно укажите ключ:
ssh -i ~/.ssh/id_ed25519 alice@example.comЗапретите перебор остальных ключей из агента:
ssh \
-o IdentitiesOnly=yes \
-i ~/.ssh/id_ed25519 \
alice@example.comЭквивалент в ~/.ssh/config:
Host example
HostName example.com
User alice
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesToo many authentication failures
SSH-agent предлагает серверу слишком много ключей, и сервер разрывает соединение раньше, чем будет проверен нужный ключ.
Решение:
ssh \
-o IdentitiesOnly=yes \
-i ~/.ssh/id_ed25519_work \
alice@example.comЛибо удалите лишние ключи из агента:
ssh-add -l
ssh-add -D
ssh-add ~/.ssh/id_ed25519_workПриватный ключ имеет слишком открытые права
Ошибка может выглядеть так:
WARNING: UNPROTECTED PRIVATE KEY FILE!Исправление:
chmod 600 ~/.ssh/id_ed25519Соединение разрывается при простое
Добавьте в ~/.ssh/config:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3Клиент будет отправлять проверочный пакет каждые 60 секунд и завершит соединение после трёх пропущенных ответов.
Не работает SSH config
Проверьте права:
chmod 600 ~/.ssh/configПосмотрите итоговые параметры:
ssh -G HOST_ALIASЗапустите диагностику:
ssh -vvv HOST_ALIASНе открывается перенаправленный порт
Запустите туннель с обязательной проверкой:
ssh -v \
-o ExitOnForwardFailure=yes \
-N -L 127.0.0.1:8080:127.0.0.1:80 \
alice@example.comПроверьте локальный порт:
ss -lnt | grep 8080В macOS можно использовать:
lsof -nP -iTCP:8080 -sTCP:LISTENУбедитесь, что целевой сервис доступен со стороны SSH-сервера.
Проверка журналов сервера
Ubuntu и Debian:
sudo journalctl -u ssh --since '10 minutes ago'Fedora и RHEL:
sudo journalctl -u sshd --since '10 minutes ago'Просмотр журнала в реальном времени:
sudo journalctl -fu sshdИмя службы зависит от дистрибутива.
Шпаргалка
Подключение
| Действие | Команда |
|---|---|
| Подключиться | ssh user@host |
| Указать порт | ssh -p 2222 user@host |
| Указать ключ | ssh -i ~/.ssh/key user@host |
| Выполнить команду | ssh user@host 'command' |
| Диагностика | ssh -vvv user@host |
| Подключиться через jump-host | ssh -J user@gateway user@target |
Ключи
| Действие | Команда |
|---|---|
| Создать Ed25519-ключ | ssh-keygen -t ed25519 -a 100 |
| Создать отдельный ключ | ssh-keygen -t ed25519 -f ~/.ssh/key |
| Показать отпечаток | ssh-keygen -lf ~/.ssh/key.pub |
| Изменить парольную фразу | ssh-keygen -p -f ~/.ssh/key |
| Установить ключ на сервер | ssh-copy-id -i ~/.ssh/key.pub user@host |
| Удалить старый ключ хоста | ssh-keygen -R host |
ssh-agent
| Действие | Команда |
|---|---|
| Запустить агент | eval "$(ssh-agent -s)" |
| Добавить ключ | ssh-add ~/.ssh/id_ed25519 |
| Добавить на один час | ssh-add -t 1h ~/.ssh/id_ed25519 |
| Показать ключи | ssh-add -l |
| Удалить ключ | ssh-add -d ~/.ssh/id_ed25519 |
| Удалить все ключи | ssh-add -D |
Туннели
| Вид | Команда |
|---|---|
| Локальный | ssh -N -L 127.0.0.1:8080:target:80 user@server |
| Удалённый | ssh -N -R 127.0.0.1:9000:127.0.0.1:3000 user@server |
| SOCKS5 | ssh -N -D 127.0.0.1:1080 user@server |
| В фоне | ssh -fN -L 127.0.0.1:8080:target:80 user@server |
Передача файлов
| Действие | Команда |
|---|---|
| Отправить файл | scp file user@host:/tmp/ |
| Скачать файл | scp user@host:/tmp/file . |
| Отправить каталог | scp -r directory user@host:/tmp/ |
| Указать порт | scp -P 2222 file user@host:/tmp/ |
| Открыть SFTP | sftp user@host |
Минимум для запоминания
ssh user@host
ssh-keygen -t ed25519 -a 100
ssh-copy-id user@host
ssh-add ~/.ssh/id_ed25519
ssh -v user@host
scp file user@host:/tmp/
sftp user@host
ssh -N -L 127.0.0.1:8080:target:80 user@host
ssh -N -R 127.0.0.1:9000:127.0.0.1:3000 user@host
ssh -N -D 127.0.0.1:1080 user@hostГлавное правило: сначала настройте и проверьте вход по ключу в отдельной SSH-сессии, а уже затем отключайте парольную аутентификацию или меняйте порт сервера.