SSH — протокол шифрованного удалённого доступа: шелл на сервере, копирование
файлов и туннелирование трафика через один порт. Сценарий статьи: сервер
web1.example.com, пользователь admin.
Установка сервера#
sudo apt update
sudo apt install openssh-server
Клиент (openssh-client) на Ubuntu уже установлен; на машинах без сервера —
только клиент.
Настройка сервера#
Конфигурация — /etc/ssh/sshd_config. Базовый безопасный набор:
Port 22
# Вход root по SSH запрещён
PermitRootLogin no
# Аутентификация по ключам
PubkeyAuthentication yes
# Ключи лежат здесь
AuthorizedKeysFile .ssh/authorized_keys
# Парольный вход — выключить, когда ключи отлажены
PasswordAuthentication no
# Подробный лог попыток подключения
LogLevel VERBOSE
Проверка синтаксиса и перезапуск:
sudo sshd -t
sudo systemctl restart ssh
sshd -tпроверяет конфиг до перезапуска — так не отрежете себе доступ из-за опечатки. На Ubuntu/Debian служба называетсяssh, в RHEL-семействе —sshd.
PasswordAuthentication noвключайте только после того, как ключи уже работают: иначе останетесь без серверного входа (последний шанс — консоль хостера/VNC).
Генерация ключей#
Современный тип — Ed25519 (короткие ключи, быстрая проверка):
ssh-keygen -t ed25519 -C "admin@laptop"
Ключи появятся в ~/.ssh/: приватный id_ed25519 (никогда не покидает
машину) и публичный id_ed25519.pub (его раскидываем по серверам).
RSA (
ssh-keygen -t rsa -b 4096) — для совсем старых серверов, в которых Ed25519 ещё не реализован.
Права на ~/.ssh и приватный ключ ssh проверяет жёстко:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
Копирование ключа на сервер#
ssh-copy-id admin@web1.example.com
# Нестандартный порт сервера
ssh-copy-id -p 2222 admin@web1.example.com
Публичный ключ допишется в authorized_keys сервера — вход по паролю больше
не понадобится.
Подключение#
ssh admin@web1.example.com
# Нестандартный порт
ssh -p 2222 admin@web1.example.com
# Разовая команда, без интерактивного шелла
ssh admin@web1.example.com "df -h /"
# Отладка проблем подключения (-vv — многословнее)
ssh -v admin@web1.example.com
Файл ~/.ssh/config#
Псевдонимы хостов: раз — и потом короткие ssh web1 без имён/портов/ключей:
# ~/.ssh/config
Host web1
HostName web1.example.com
User admin
IdentityFile ~/.ssh/id_ed25519
Host db1
HostName db1.example.com
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
ssh web1
scp backup.sh web1:/opt/
Все опции из config применяются и к scp, и к ssh-copy-id — хост с
псевдонимом ведёт себя как обычное имя. Файл должен быть доступен только
вам: chmod 600 ~/.ssh/config.
Для входа через промежуточный сервер (bastion) — опция
ProxyJump:ssh -J bastion web1илиProxyJump bastionв блокеHost web1.
Копирование файлов: scp#
# Файл на сервер
scp deploy.sh admin@web1.example.com:/tmp/
# Файл с сервера сюда
scp admin@web1.example.com:/var/log/app.log .
# Каталог целиком (рекурсивно)
scp -r ./assets admin@web1.example.com:/var/www/
# Порт указывается заглавной -P (в ssh — строчная -p!)
scp -P 2222 file.txt admin@web1.example.com:~
# Сохранить времена и права файлов (-p)
scp -p admin@web1.example.com:/etc/nginx/nginx.conf .
Начиная с OpenSSH 9.0 протокол по умолчанию — SFTP; для очень старых серверов добавьте
-O(режим старого SCP-протокола). Для больших каталогов и повторяющихся синхронизаций удобнееrsync -avz …— докачивает и перекачивает только изменившееся.
SSH-агент#
Агент держит расшифрованные ключи в памяти — пароль ключа спрашивается один раз за сессию:
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519
На десктопах (macOS, GNOME) агент обычно уже запущен — достаточно
ssh-add. На macOS ключ можно держать в связке Keychain:ssh-add --apple-use-keychain.
Туннели#
# Локальное перенаправление: localhost:5432 → БД на стороне сервера
ssh -L 5432:localhost:5432 admin@db1.example.com
# Обратное: порт сервера ведёт на сервис вашей локальной машины
# (покажите локальную разработку коллеге с сервера)
ssh -R 8080:localhost:3000 admin@web1.example.com
# SOCKS-прокси на localhost:1080 — трафик браузера через сервер
ssh -D 1080 admin@web1.example.com
Туннель живёт, пока живо ssh-подключение; запускайте с
-N(без шелла) и-T, если нужен только туннель:ssh -N -L 5432:localhost:5432 admin@db1.example.com.