В этом руководстве мы рассмотрим распространённые способы подключения к серверу по SSH, а также базовые настройки для безопасной и удобной работы. Вы можете использовать его как шпаргалку, когда понадобится настроить SSH на новом сервере.

Обзор SSH

Этот раздел — для тех, кто сталкивается с темой впервые. В нём мы для общего понимания ответим на базовые вопросы об SSH: что это за технология, как она работает и насколько безопасно её использовать.

Что такое SSH

SSH (англ. Secure Shell — «безопасная оболочка») — это протокол, который используется как основной способ для удалённого подключения к серверам с Linux. С его помощью можно выполнять команды, вносить изменения в файлы и настраивать сервисы.

Как работает SSH

При подключении через SSH вы попадаете в сеанс оболочки — текстовый интерфейс для взаимодействия с сервером. Все команды, которые вы вводите в локальном терминале, отправляются по зашифрованному каналу на удалённый сервер и выполняются там.

Соединение SSH реализовано по модели «клиент-сервер». Это значит, что на удалённой машине должна работать специальная программа — демон SSH. Эта программа слушает подключения на определённом сетевом порту, аутентифицирует запросы на подключение и создаёт нужную среду, если пользователь вводит правильные учётные данные.

На компьютере пользователя должен быть установлен SSH-клиент — программа, которую можно настроить для подключения к нужному серверу с указанием деталей от учётной записи и разных дополнительных параметров.

Аутентификация пользователей в SSH

Клиенты обычно проходят аутентификацию при помощи паролей (менее безопасный способ) или SSH-ключей (более безопасный способ).

Вход по паролю более простой для новичков и происходит по зашифрованному каналу, но боты и злоумышленники часто пытаются взломать аккаунты, использующие такой способ аутентификации. Поэтому лучше при возможности использовать вход по SSH-ключу.

SSH-ключи — это пара криптографических ключей (публичный и приватный). Публичный ключ можно свободно передавать другим, а приватный нужно хранить в секрете и ни при каких обстоятельствах никому не показывать.

Для аутентификации при помощи SSH-ключей пользователь должен создать их у себя на компьютере. Затем публичный ключ нужно скопировать на сервер в файл, расположенный по пути  ~/.ssh/authorized_keys. Это системный файл, где хранятся публичные ключи, при помощи которых разрешено входить в систему.

Когда клиент подключается к серверу, он сообщает, какой публичный ключ нужно использовать. Сервер находит этот ключ в файле authorized_keys и использует, чтобы зашифровать случайное сообщение, которое передаст клиенту. Расшифровать его получится только приватным ключом из правильной пары.

Клиент расшифровывает сообщение, генерирует на основе этих данных MD5-хеш и передаёт его на сервер. Поскольку сервер уже знает текст сообщения, он может тоже сгенерировать MD5-хеш на основе этих данных, а потом сравнить два значения и определить, правильный ли закрытый ключ у клиента.

Теперь, когда вы представили общий принцип работы SSH, можем перейти к примерам, демонстрирующим различные способы работы с SSH.

Работа с SSH-ключами

В этом разделе расскажем, как создать SSH-ключи и загрузить публичный ключ на сервер. Если вы раньше не работали с ключами, начните с этого раздела, это сильно повысит безопасность будущих подключений.

Как создать SSH-ключи

Создание SSH-ключей у себя на локальном компьютере — это первый шаг к тому, чтобы подключаться к удалённому серверу без пароля. Если нет веских причин отказаться от такого способа, рекомендуем всегда использовать аутентификацию с SSH-ключами.

Для генерации SSH-ключей можно использовать такие криптографические алгоритмы как RSA, DSA и ECDSA. Алгоритм RSA считается предпочтительным и выбран по умолчанию.

Чтобы создать пару RSA-ключей на локальном компьютере, введите:

ssh-keygen

Вам предложат указать путь к файлу, в который сохранится приватный ключ. Нажмите ENTER, чтобы оставить значение по умолчанию, которое сохранит ключи в скрытой директории .ssh в домашней директории пользователя. Если оставить место по умолчанию, SSH-клиент сможет автоматически находить ключи.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

Дальше вам предложат ввести парольную фразу для защиты приватного ключа. В целях безопасности вам придётся вводить парольную фразу каждый раз, когда вы используете приватный ключ. Можно оставить это поле пустым, и тогда парольной фразы не будет. Но помните, что это позволит любому, кто получит доступ к вашему приватному ключу, подключиться к вашим серверам.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Если вы решите установить парольную фразу, при вводе ничего не будет отображаться, что сделано для безопасности.

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a username@123.45.67.89
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+

Эта процедура создала пару RSA SSH-ключей, расположенную в скрытой директории .ssh в домашней директории пользователя. Эти файлы:

  • ~/.ssh/id_rsa — Приватный ключ. НИКОМУ ЕГО НЕ ПОКАЗЫВАЙТЕ!
  • ~/.ssh/id_rsa.pub — Публичный ключ. Его можно свободно передавать, это безопасно.

Как создать SSH-ключи с большим количеством бит

SSH-ключи по умолчанию имеют длину 2048 бит. Она считается достаточно безопасной, но вы можете указать и большее количество бит для более надёжного ключа.

Для этого добавьте аргумент -b с желаемым количеством бит. Большинство серверов поддерживают ключи длиной в 4096 бит, а вот более длинные ключи могут и не работать в целях защиты от DDoS-атак.

ssh-keygen -b 4096

Если до этого вы создали другой ключ, вам предложат его перезаписать:

Overwrite (y/n)?

Если выберете «yes», предыдущий ключ перезапишется и вы больше не сможете подключиться к серверу с его помощью. Учитывайте это, когда перезаписываете ключи.

Как удалить или изменить парольную фразу

Если вы создали парольную фразу для своего приватного ключа и хотите изменить или удалить её, сделать это легко. Для этого просто введите:

ssh-keygen -p

Введите местоположение ключа, для которого хотите изменить фразу, или нажмите ENTER, чтобы принять значение по умолчанию.

Enter file in which the key is (/root/.ssh/id_rsa):

Введите старую парольную фразу, которую вы хотите изменить. Если вы её забыли, восстановить доступ не получится, и вам придётся создать новую пару ключей.

Enter old passphrase:

Затем вам предложат ввести новую парольную фразу. Введите её или нажмите ENTER, чтобы удалить парольную фразу.

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

Как отобразить отпечаток SSH-ключа

Каждая пара SSH-ключей имеет единый криптографический «отпечаток», который можно использовать для уникальной идентификации ключей. Чтобы узнать отпечаток SSH-ключа, введите:

ssh-keygen -l

Нажмите ENTER, если это правильное местоположение ключа, или введите новое местоположение.

Enter file in which the key is (/root/.ssh/id_rsa):

Появится строка, содержащая длину ключа, его отпечаток, учётную запись и хост, для которого он был создан, а также используемый алгоритм:

4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e  username@123.45.67.89 (RSA)

Как скопировать публичный SSH-ключ на сервер с помощью ssh-copy-id

Это самый простой вариант, если у вас есть доступ к серверу по SSH с помощью пароля и установлена утилита ssh-copy-id. Эта утилита включена во многие пакеты OpenSSH для Linux, поэтому она, скорее всего, установлена по умолчанию.

Чтобы передать публичный ключ на сервер при помощи ssh-copy-id, введите:

ssh-copy-id username@123.45.67.89

Понадобится ввести пароль для учётной записи пользователя на удалённом сервере:

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysusername@123.45.67.89's password:

После ввода пароля содержимое вашего ключа ~/.ssh/id_rsa.pub будет добавлено в конец файла ~/.ssh/authorized_keys в учётной записи пользователя:

Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'username@123.45.67.89'"and check to make sure that only the key(s) you wanted were added.

Теперь вы можете войти в эту учётную запись без пароля:

ssh username@remote_host

Как скопировать публичный SSH-ключ на сервер без ssh-copy-id

Если у вас нет утилиты ssh-copy-id, но есть доступ к удалённому серверу по паролю, вы можете вывести содержимое ключа и передать его в команду ssh

На удалённом сервере вы можете убедиться, что директория ~/.ssh существует, а затем добавить скопированные данные в файл ~/.ssh/authorized_keys:

cat ~/.ssh/id_rsa.pub | ssh username@123.45.67.89 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Понадобится ввести пароль от учётной записи на удалённом сервере:

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
username@123.45.67.89's password:

После ввода пароля ключ скопируется в файл authorized_keys, что позволит подключаться к серверу по SSH без пароля:

ssh username@123.45.67.89

Как скопировать публичный SSH-ключ на сервер вручную

Если у вас нет доступа к серверу по SSH с паролем, придётся добавлять публичный ключ на удалённый сервер вручную. На вашем локальном компьютере найдите содержимое файла вашего публичного ключа при помощи команды:

cat ~/.ssh/id_rsa.pub

Вы можете скопировать полученное значение и вставить его в файл authorized_keys на удалённом сервере. Для этого вам нужно будет войти на удалённый сервер другими способами (например, через панель управления хостингом).

ssh-rsa AAAAB3NzaC1yc2EAAAADK2B+ZVIpSDfki9UVKzT8JUmwW6NDSCuh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqNzSgxUfQHURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUABAAACAQCqql6MzstZYGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikryghLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xtAQTKRFmNZISvAcywB9GVqNAVE+ZHFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== username@123.45.67.89

На удалённом сервере создайте директорию ~/.ssh, если она ещё не существует:

mkdir -p ~/.ssh

Затем создайте файл ~/.ssh/authorized_keys или добавьте в него скопированное содержимое при помощи команды:

echo public_key_string >> ~/.ssh/authorized_keys

После этого вы сможете войти на удалённый сервер без пароля.

Основные инструкции по подключению

В этом разделе рассмотрим основные моменты о том, как подключиться к серверу с помощью SSH.

Как подключиться к удалённому серверу

Чтобы подключиться к удалённому серверу и запустить там сеанс оболочки, используйте команду ssh.

Если имя пользователя на вашем локальном компьютере совпадает с именем на удалённом сервере, просто введите:

ssh remote_host

Если имена пользователей отличаются, укажите имя пользователя на удалённом сервере вот так:

ssh username@remote_host

При первом подключении к новому хосту появится сообщение о достоверности удалённого хоста. Введите «yes», чтобы продолжить.

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Дальше понадобится пройти аутентификацию: либо ввести пароль, либо парольную фразу, либо вы автоматически войдёте в систему (если парольная фраза отключена).

Как закрыть SSH-подключение

Чтобы выйти из оболочки и продолжить работать в терминале локального компьютера, используйте такую команду:

exit

Если соединение зависло, вы всё равно можете его закрыть со стороны клиента. Для этого используйте управляющий символ ~ с точкой. Этот escape-код сработает, даже несмотря на отсутствие обратной связи, но его нужно вводить только с новой строки. Поэтому сначала нажмите ENTER один или два раза.

[ENTER]
~.

После этого соединение должно немедленно закрыться, и вас вернёт в локальный сеанс терминала.

Как запустить одну команду на удалённом сервере

Вы можете не открывать сеанс оболочки, а просто выполнить одну команду на удалённом сервере. Для этого добавьте команду после информации о подключении:

ssh username@123.45.67.89 command

В результате вы подключитесь к удалённому хосту, на нём выполнится указанная команда, после чего соединение немедленно закроется.

Как зайти на сервер с другим портом

По умолчанию демон SSH работает на 22 порту. В целях безопасности его можно сменить на нестандартный. Так часто делают провайдеры, особенно на виртуальном хостинге. В таком случае нужно указать правильный порт при подключении:

ssh -p номер-порта username@123.45.67.89

Чтобы не указывать порт каждый раз, создайте или отредактируйте файл конфигурации в директории ~/.ssh:

nano ~/.ssh/config

Здесь можно задать специфические параметры для хоста. Например, такая конфигурация позволит входить в систему без указания номера порта в командной строке:

Host alias
    HostName хостнейм-сервера-или-IP
    Port номер-порта

Как использовать агент SSH, чтобы не вводить парольную фразу

Если вы создали парольную фразу для приватного ключа SSH, её нужно будет вводить каждый раз, когда вы подключаетесь к удалённому хосту. Чтобы не делать этого, можно запустить агент SSH. Эта утилита сохраняет ваш закрытый ключ после первого ввода парольной фразы. Он будет доступен на протяжении сеанса терминала, что позволит подключаться повторно, не вводя парольную фразу.

Чтобы запустить агент SSH, введите такую команду в локальном терминале:

eval $(ssh-agent)
Agent pid 10891

Это запустит программу агента и переведет её в фоновый режим. Теперь вам нужно добавить свой закрытый ключ в агент, чтобы он мог им управлять:

ssh-add

Понадобится ввести парольную фразу. После этого ваш идентификационный файл добавится в агент и можно будет управлять сервером без необходимости вводить фразу повторно. 

Enter passphrase for /home/username/.ssh/id_rsa:
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)

Как передать ваши учётные данные SSH для использования на сервере

Если вы хотите иметь возможность подключаться без пароля к одному серверу с другого сервера, необходимо будет переслать информацию о вашем ключе SSH. Это позволит пройти аутентификацию на другом сервере через сервер, к которому вы подключены, используя учётные данные на вашем локальном компьютере.

Для начала на вашем локальном компьютере должен быть запущен SSH-агент и к нему должен быть добавлен ваш SSH-ключ, как описано в предыдущем подразделе. После этого нужно подключиться к первому серверу, используя опцию -A. Это перенаправит ваши учётные данные на сервер для этого сеанса:

ssh -A username@123.45.67.89

Отсюда вы можете подключиться по SSH к любому другому хосту, к которому разрешен доступ с вашим ключом SSH. Вы подключитесь так, как если бы ваш приватный SSH-ключ находился на этом сервере.

Базовые настройки на стороне сервера

В этом разделе расскажем, какие настройки на стороне сервера стоит изменить, чтобы усилить безопасность системы. Вы научитесь определять, кто имеет право подключаться к вашему серверу и с какими параметрами.

Как отключить аутентификации по паролю

Если вы настроили и протестировали подключение по SSH-ключам, будет неплохой идеей отключить аутентификацию по паролю. Для этого подключитесь к удаленному серверу и откройте файл /etc/ssh/sshd_config с правами root или sudo:

sudo nano /etc/ssh/sshd_config

Найдите в файле директиву PasswordAuthentication. Если она закомментирована, раскомментируйте её. Установите значение no, чтобы отключить вход по паролю:

PasswordAuthentication no

После этого сохраните изменения и закройте файл. Чтобы изменения вступили в силу, следует перезапустить службу SSH.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

Теперь все учётные записи в системе не смогут войти в систему с использованием паролей.

Как изменить порт SSH

Некоторые администраторы считают, что порт по умолчанию нужно менять, чтобы снизить количество попыток подключения к серверу по SSH со стороны ботов.

Чтобы изменить порт, который прослушивает демон SSH, зайдите на удалённый сервер с правами root или sudo и откройте файл sshd_config:

sudo nano /etc/ssh/sshd_config

В этом файле вы можете изменить порт, на котором работает SSH, найдя директиву Port. Измените её или закомментируйте и добавьте новую с нужным портом. Например, чтобы изменить порт на 4444, поместите в файл следующее:

#Port 22
Port 4444

Сохраните и закройте файл, когда закончите. Для того чтобы изменения вступили в силу, перезапустите демон SSH.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

После перезапуска демона вам необходимо будет пройти аутентификацию, указав номер порта, как указано в предыдущем подразделе.

Как определить пользователей, которые могут подключаться по SSH

Чтобы ограничить учётные записи, которые могут входить в систему по SSH, вы можете использовать несколько способов. Каждый из них предполагает редактирование конфигурационного файла демона SSH.

На удаленном сервере откройте этот файл с правами root или sudo:

sudo nano /etc/ssh/sshd_config

Первый способ — использовать директиву AllowUsers. В ней нужно прямо перечислить юзернеймы пользователей, которые имеют право подключаться к серверу по SSH. Если такой директивы нет, создайте её где угодно в файле.

AllowUsers username-1 username-2

Сохраните и закройте файл. Перезапустите демон SSH, чтобы изменения вступили в силу.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

Если вам удобнее управлять группами, вместо этого вы можете использовать директиву AllowGroups. В этом случае просто добавьте название группы, которой должен быть разрешен доступ по SSH (затем мы покажем, как создать эту группу и добавить в неё участников):

AllowGroups sshmembers

Сохраните и закройте файл.

Теперь вы можете создать системную группу (без домашнего каталога):

sudo groupadd -r sshmembers

Обязательно добавьте в эту группу все необходимые учетные записи пользователей:

sudo usermod -a -G sshmembers username-1
sudo usermod -a -G sshmembers username-2

Теперь перезапустите демон SSH, чтобы изменения вступили в силу.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

Как отключить вход от имени root

Часто рекомендуется отключить подключение по SSH от имени root после того, как вы настроили учетную запись пользователя SSH с привилегиями sudo. Для этого откройте файл конфигурации демона SSH с помощью root или sudo на удаленном сервере.

sudo nano /etc/ssh/sshd_config

Внутри найдите директиву PermitRootLogin. Если она вдруг закомментирована, раскомментируйте её. Измените значение на «нет»:

PermitRootLogin no

Сохраните и закройте файл. Чтобы применить изменения, перезапустите демон SSH.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

Как разрешить root-доступ для определённых команд

В некоторых случаях может понадобиться отключить root-доступ в целом, но оставить для правильной работы определённых приложений. Например, для процедуры резервного копирования.

Это можно сделать с помощью файла authorized_keys у пользователя root, где лежат ключи SSH, которым разрешено использовать учетную запись.

Добавьте ключ, который вы хотите использовать для процесса (рекомендуем создавать новый ключ для каждого процесса) в файл authorized_keys у пользователя root на сервере. Мы сделаем это при помощи команды ssh-copy-id, но вы можете использовать и другой метод копирования ключей, про которые мы писали в предыдущих разделах:

ssh-copy-id root@remote_host

Теперь войдите на удалённый сервер и откройте файл authorized_keys с правами root или sudo:

sudo nano /root/.ssh/authorized_keys

В начале строки с ключом для процесса добавьте текст command= вместе с командой, для которой действителен этот ключ. Текст должен содержать полный путь к исполняемому файлу, а также все необходимые аргументы:

command="/path/to/command arg1 arg2" ssh-rsa ...

Сохраните и закройте файл, когда закончите.

Теперь откройте файл sshd_config с правами root или sudo:

sudo nano /etc/ssh/sshd_config

Найдите директиву PermitRootLogin и укажите значение «только для принудительных команд». Это позволит использовать root для входа в систему с ключом SSH только в том случае, если вместе с ключом указана команда:

PermitRootLogin forced-commands-only

Сохраните и закройте файл. Перезапустите демон SSH, чтобы изменения вступили в силу.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

Как настроить выполнение X11 в SSH-клиенте

Демон SSH можно настроить так, чтобы он передавал окна X-приложений с сервера на локальный компьютер. Для корректной работы такого проброса в клиенте должна быть включена и настроена система X Windows.

Чтобы включить эту функцию, войдите на свой удалённый сервер и отредактируйте файл sshd_config от имени пользователя root или с привилегиями sudo:

sudo nano /etc/ssh/sshd_config

Найдите директиву X11Forwarding. Если она закомментирована, раскомментируйте её. Если директивы нет, создайте и установите значение «да»:

X11Forwarding yes

Сохраните и закройте файл. Перезапустите демон SSH, чтобы изменения вступили в силу.

В Ubuntu/Debian:

sudo service ssh restart

В CentOS/Fedora:

sudo service sshd restart

Чтобы подключиться к серверу и пробросить окно приложения, вам необходимо передать опцию -X от клиента при подключении:

ssh -X username@123.45.67.89

После этого графические приложения, запущенные на сервере через этот сеанс, должны отображаться на локальном компьютере. Производительность может быть низкой, но при крайней необходимости это всё равно полезная штука.

Базовые настройки на стороне клиента

В этом разделе сосредоточимся на некоторых изменениях, которые вы можете внести на клиентской стороне соединения.

Как создать алиасы

У себя на локальном компьютере вы можете создать индивидуальные конфигурации для некоторых или всех серверов, к которым вы подключаетесь. Они могут храниться в файле ~/.ssh/config, который ваш SSH-клиент читает при каждом запуске.

Создайте или откройте этот файл в текстовом редакторе на локальном компьютере:

nano ~/.ssh/config

Внутри вы можете создать конфигурации, начиная каждую из них с ключевого слова Host, за которым следует алиас. Под этим ключевым словом, добавив отступ, вы можете указать любую директиву из руководства ssh_config:

man ssh_config

Пример конфигурации:

Host vashdomen
    HostName vashdomen.com
    Port 4444
    User username

При помощи конфигурации из примера вы сможете подключиться к vashdomen.com через 4444 порт от имени пользователя username при помощи команды:

ssh username

Вы также можете использовать вайлдкард, чтобы создать конфигурацию для нескольких хостов сразу. Но имейте в виду, что у более поздних записей приоритет будет выше, чем у более ранних. По этой причине следует размещать наиболее общие совпадения вверху. Например, вы можете запретить проброс X11 по умолчанию, а конкретно для хоста vashdomen разрешить отдельно в его собственном алиасе:

Host *
    ForwardX11 no

Host vashdomen
    HostName vashdomen.com
    ForwardX11 yes
    Port 4444
    User username

Не забудьте сохранить изменения в файле, когда закончите.

Как поддерживать соединение для избежания тайм-аута

Если вы обнаружите, что сеанс SSH слишком быстро прерывается, можете настроить свой клиент так, чтобы он время от времени отправлял на сервер пакет и тем самым поддерживал соединение. Это можно сделать в файле ~/.ssh/config для каждого соединения.

Сначала откройте файл в редакторе:

nano ~/.ssh/config

Создайте алиас со звёздочкой в самом верху файла, если ещё не создали. Добавьте в него директиву ServerAliveInterval со значением «120», чтобы клиент отправлял на сервер пакет раз в две минуты. Этого должно быть достаточно, чтобы сервер не успевал закрыть соединение:

Host *
    ServerAliveInterval 120

Сохраните и закройте файл, когда закончите.

Как отключить проверку аутентичности хоста

По умолчанию каждый раз, когда вы подключаетесь к новому серверу, терминал покажет отпечаток ключа, который принадлежит демону SSH на этом хосте.

The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Так сделано, чтобы вы могли проверить подлинность хоста, к которому подключаетесь, и обнаружить случаи, когда злоумышленник пытается замаскироваться под удалённый хост. Этот функционал можно отключить, но помните, что это угроза для безопасности.

Чтобы отключить проверку, откройте файл ~/.ssh/config на локальном компьютере:

nano ~/.ssh/config

Создайте алиас со звёздочкой в самом верху файла, если ещё не создали. Добавьте в него директиву StrictHostKeyChecking со значением «no», чтобы автоматически добавлять новые хосты в файл known_hosts. Установите для UserKnownHostsFile значение /dev/null, чтобы не предупреждать о новых или изменённых хостах:

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Вы можете включить проверку для конкретных алиасов. Стандартное значение директивы StrictHostKeyCheckingask:

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host vashdomen
    HostName vashdomen.com
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/username/.ssh/known_hosts

Настройка SSH-туннелей

SSH-туннели нужны, чтобы перенаправить трафик с конкретного порта одной машины на конкретный порт другой машины. Это ещё называется «пробросить порт».

С помощью SSH-туннеля можно обойти ограничения файервола и получить доступ к частной сети удалённого сервера с локального компьютера, и наоборот — обеспечить доступ к ресурсам локального компьютера на удалённом сервере. А ещё это отличный способ зашифровать трафик, который изначально был незашифрованным.

В этом разделе рассмотрим несколько основных сценариев, в которых вам может пригодиться SSH-туннель, с примерами их настройки.

Как настроить прямой SSH-туннель

Прямой туннель позволяет подключиться с локального компьютера к другой сети через удалённый хост. Вы подключаетесь к удалённому хосту по SSH и указываете целевой адрес из внутренней или внешней сети. Удалённый хост подключается к указанному сетевому адресу и туннелирует весь трафик с локального порта на этот адрес.

Это часто используется, чтобы обойти ограничения файервола или получить доступ к веб-интерфейсу «только для локального хоста» из удалённого места. Например, провайдеры виртуального хостинга обычно запрещают подключаться к базе данных MySQL извне. Но если создать SSH-туннель, можно безопасно обойти это ограничение и работать с базой с локального компьютера.

Чтобы установить прямой туннель к вашему удалённому серверу, используйте параметр -L при подключении и предоставьте три части дополнительной информации:

  • Порт на локальном компьютере, через который он получит доступ к туннелю.
  • Хост, на который будет направляться трафик (обычно это localhost, если вы подключаетесь к сервису на удалённом сервере).
  • Порт на удалённом компьютере, к которому прокладывается туннель.

Эти детали нужно предоставить в указанном выше порядке (через двоеточия) как аргументы флага -L. Вы также можете использовать флаг -f, чтобы перевести SSH в фоновый режим перед выполнением, и флаг -N, чтобы просто открыть туннель, без возможности выполнять команды на удалённом сервере.

Например, чтобы подключиться к серверу MySQL на вашем удалённом сервере через стандартный порт 3306 и сделать соединение доступным на вашем локальном компьютере через порт 8888, нужно ввести такую команду:

ssh -f -N -L 8888:127.0.0.1:3306 username@123.45.67.89

Более общий синтаксис команды будет выглядеть так:

ssh -L локальный-порт:удалённый-хостнейм-или-IP:удалённый-порт пользователь@сервер

Поскольку соединение находится в фоновом режиме, вам нужно будет найти его PID, чтобы закрыть его. Это можно сделать, выполнив поиск перенаправленного порта:

ps aux | grep 8888
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:127.0.0.1:3306 username@123.45.67.89
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем вы можете завершить процесс, указав PID процесса, который соответствует вашей команде SSH (это число во второй колонке строки):

kill 5965

Другой вариант — запустить соединение без флага -f. В этом случае соединение будет на переднем плане, не позволяя вам использовать окно терминала во время работы туннеля. Но тогда вы можете легко закрыть туннель, нажав CTRL-C.

Как настроить обратный SSH-туннель

Обратный туннель позволяет предоставить доступ к вашему локальному компьютеру из удалённой сети (эффект противоположный прямому туннелю). Вы подключаетесь по SSH к удалённому серверу и указываете порт, на котором откроется туннель к локальному хосту и порту. После этого весь трафик, отправленный на удалённый порт, будет перенаправляться на локальный компьютер.

Это может быть полезно, когда нужно показать кому-то не из вашей сети то, что доступно только на вашем локальном компьютере. Например, если на локальной машине запущено приложение, вы можете создать обратный туннель, чтобы сделать его доступным из интернета и показать заказчику.

Чтобы установить обратный туннель к вашему удалённому серверу, используйте параметр -R при подключении и предоставьте три части дополнительной информации:

  • Порт на удалённом компьютере, через который он получит доступ к туннелю.
  • Хост, на который будет направляться трафик (обычно это localhost).
  • Порт на локальном компьютере, к которому прокладывается туннель.

Эти детали нужно предоставить в указанном выше порядке (через двоеточия) как аргументы флага -R. Вы также можете использовать флаг -f, чтобы перевести SSH в фоновый режим перед выполнением, и флаг -N, чтобы просто открыть туннель, без возможности выполнять команды на удалённом сервере.

Например, чтобы подключиться к vashdomen.com через порт 80 на вашем локальном компьютере и сделать соединение доступным на вашем удалённом хосте через порт 8888, нужно ввести такую команду:

ssh -f -N -R 8888:vashdomen.com:80 username@123.45.67.89

Более общий синтаксис команды будет выглядеть так:

ssh -R удалённый-порт:локальный-хостнейм-или-IP:локальный-порт пользователь@сервер

Поскольку соединение находится в фоновом режиме, вам нужно будет найти его PID, чтобы закрыть его. Это можно сделать, выполнив поиск перенаправленного порта:

ps aux | grep 8888
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -R 8888:vashdomen.com:80 username@123.45.67.89
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем вы можете завершить процесс, указав PID процесса, который соответствует вашей команде SSH (это число во второй колонке строки):

kill 5965

Другой вариант — запустить соединение без флага -f. В этом случае соединение будет на переднем плане, не позволяя вам использовать окно терминала во время работы туннеля. Но тогда вы можете легко закрыть туннель, нажав CTRL-C.

Как настроить динамический туннель (SOCKS-proxy)

Динамический туннель используется для подключения с локального компьютера к другим ресурсам через удалённый сервер. В этом плане он похож на прямой туннель, но для его работы не нужно указывать конечный хост, только локальный порт. Трафик, отправленный на этот порт, будет передаваться на удалённый сервер, а оттуда переадресовываться по адресу, указанному в запросе.

Приложения, которые будут использовать такой туннель (обычно это интернет-браузер), должны поддерживать протокол SOCKS, потому что именно с его помощью пакеты будут перенаправляться на другую сторону. В итоге удалённый сервер будет выступать в роли прокси, а также дополнительно зашифровывать трафик по SSH.

Это может быть пригодиться, чтобы защитить свой трафик в публичных сетях (например, в кафе или торговом центре), а также обойти блокировки, которые могут быть настроены в таких сетях.

Чтобы установить динамический туннель, используйте флаг -D вместе с локальным портом, через который хотите получить доступ к туннелю. Вы также можете использовать флаг -f, чтобы перевести SSH в фоновый режим перед выполнением, и флаг -N, чтобы просто открыть туннель, без возможности выполнять команды на удалённом сервере.

Например, чтобы установить туннель на порту 7777, вы можете ввести:

ssh -f -N -D 8888 username@123.45.67.89

С этого момента вы можете настроить приложение, поддерживающее протокол SOCKS (например, браузер), для подключения к выбранному порту. Приложение отправит свои данные в сокет, связанный с этим портом. 

Способ перенаправления трафика на SOCKS-порт будет отличаться в зависимости от приложения. Например, в Firefox это можно сделать через Настройки > Основные > Настройки сети > Ручная настройка прокси. В Chrome можно запустить приложение с флагом –proxy-server=, используя интерфейс localhost и выбранный порт.

Поскольку соединение находится в фоновом режиме, вам нужно будет найти его PID, чтобы закрыть его. Это можно сделать, выполнив поиск перенаправленного порта:

ps aux | grep 8888
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -D 8888 username@123.45.67.89
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем вы можете завершить процесс, указав PID процесса, который соответствует вашей команде SSH (это число во второй колонке строки):

kill 5965

Другой вариант — запустить соединение без флага -f. В этом случае соединение будет на переднем плане, не позволяя вам использовать окно терминала во время работы туннеля. Но тогда вы можете легко закрыть туннель, нажав CTRL-C.

Что дальше

В этом руководстве мы постарались охватить информацию про SSH, которая пригодится большинству пользователей в повседневной жизни. Если у вас есть другие советы или вы хотите поделиться своими любимыми конфигурациями, оставьте комментарий чуть ниже.

Была ли статья полезной?

Спасибо за отзыв!