Безопасная оболочка (ssh)

Remote port forwarding

Remote port forwarding is the exact opposite of local port forwarding. It forwards traffic coming to a port on your server to your local computer, and then it is sent to a destination. Again, let’s take a look at an example.

Suppose, you’re developing a web application that’s running on port 8000 of your local computer. Other people can’t access it directly because you’re sitting behind a NAT network without a public IP. Now, you would like to show a customer how the application looks like. Fortunately, remote forwarding can help you with this. Type in:

ssh -R 7000:127.0.0.1:8000 

When you run this command, the SSH server binds to the 7000 port on example.com. Any traffic that it receives on this port is sent to the SSH client on your local computer, which in turn forwards it to port 8000 on 127.0.0.1. Now, the customer can open in a browser, and they can use your application!

Again, as with remote port forwarding, you can also use a different destination. Say for example, you want a friend to help you with configuring a router. Since they can’t access your router directly, you can use remote port forwarding like so:

ssh -R 8080:192.168.100.1:8000 

Загрузка ключа на сервер

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

Самый простой способ скопировать ключ на удаленный сервер — это использовать утилиту ssh-copy-id. Она тоже входит в пакет программ OpenSSH. Но для работы этого метода вам нужно иметь пароль доступа к серверу по SSH. Синтаксис команды:

При первом подключении к серверу система может его не распознать, поэтому вам нужно ввести yes. Затем введите ваш пароль пользователя на удаленном сервере. Утилита подключится к удаленному серверу, а затем использует содержимое ключа id.rsa.pub для загрузки его на сервер в файл ~/.ssh/authorized_keys. Дальше вы можете выполнять аутентификацию с помощью этого ключа.

Если такой способ по какой-либо причине для вас не работает, вы можете скопировать ключ по ssh вручную. Мы создадим каталог ~/.ssh, а затем поместим наш ключ в файл authorized_keys с помощью символа >>, это позволит не перезаписывать существующие ключи:

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

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

Как подключиться по SSH

Для подключения по SSH нам необходимо знать такие данные:

  • ip адрес сервера, к которому мы собираемся подключится;
  • порт, на котором ожидает подключения SSH сервер, по умолчанию используется 22, но в целях безопасности порт подключения ssh часто изменяют;
  • имя и пароль пользователя на удаленном сервере.

Больше ничего не нужно, обычно эти данные присылают в письме вместе с описанием VPS. Теперь перейдем к практике.

1. Подключение через SSH в Linux

В Linux подключение по SSH выполняется с помощью утилиты ssh. Мы более подробно рассматривали работу с ней в статье как пользоваться ssh. Для подключения к удаленному компьютеру ее синтаксис будет выглядеть следующим образом:

$ ssh имя_пользователя@айпи_адрес

Это самый простой вариант, если вам также нужно задать порт, используйте опцию -p:

$ ssh имя_пользователя@айпи_адрес -p порт

Чтобы выполнить подключение по SSH Linux нажмите Ctrl+Alt+T для открытия терминала и наберите команду, заменив нужные значения:

Или, с нестандартным портом:

Если ip_адрес и порт правильные, то на следующем шаге программа попросит у вас ввести пароль:

Если пытаетесь подключится через SSH к этому серверу первый раз, то утилита также попросит подтвердить добавление нового устройства в свой список известных устройств, здесь нужно набрать yes и нажать Enter:

Теперь вы подключены, и все вводимые далее команды будут выполнены на удаленном сервере:

Если же произошла ошибка и IP адрес или порт введены неверно, то вы получите ошибку Connection Refused:

Просто убедитесь что порт введен верно. Если это ваш сервер, то, возможно на нем еще нужно разрешить подключение SSH в брандмауэре. В Ubuntu/Debian для этого на удаленном сервере выполните:

А в CentOS/Fedora:

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

Теперь вы знаете как подключиться по ssh linux и решить проблемы с подключением. А теперь перейдем к Windows.

2. Подключение через SSH в Windows

Раньше подключение по SSH из Windows выполнялось только с помощью сторонних утилит, например PuTTY. Но в Windows 10 был добавлен встроенный OpenSSH клиент и работает он точно так же, как и в Linux. По умолчанию этот компонент не активирован. Для его установки откройте Параметры -> Приложения:

Затем выберите Управление дополнительными компонентами:

Здесь нажмите добавить новый компонент и в открывлемся меню выберите OpenSSH Client и нажмите Устанвоить:

Дальше вернитесь назад и дождитесь завершения установки. После того, как SSH клиент будет установлен нужно обязательно перезагрузить компьютер.

После перезагрузки нажмите Win+R чтобы открыть окно запуска команд и наберите в нем cmd:

Далее нажмите Enter. Перед вами откроется командная строка Windows. Здесь можно использовать утилиту ssh. Синтаксис у нее абсолютно такой же, как и для Linux:

ssh имя_пользователя@айпи_адрес -p порт

Например, такой командой можно подключится по SSH к Raspberry Pi, который находится в вашей локальной сети по адресу 192.168.1.5:

Утилита предложит добавить устройство в список известных:

Затем предложит ввести пароль:

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

Теперь подключиться к серверу по ssh из этой операционной системы также просто как и из Linux.

Установка OpenSSH на Windows 10

  1. 1.

    В меню «Пуск» нажмите Параметры:

  2. 2.

    Перейдите в раздел Приложения:

    Настройка SSH

  3. 3.

    Выберите Приложения и возможности и нажмите Дополнительные компоненты:

  4. 4.

    Проверьте, установлен ли компонент «Клиент OpenSSH». Для этого в поисковой строке наберите «OpenSSH». Если компонент уже установлен, переходите к шагу .

    Если компонент ещё не установлен, используйте PowerShell.

Что такое PowerShell

PowerShell — это утилита командной строки в ОС Windows. Она выпущена в составе Windows 7, Windows 8, Windows 8.1 и Windows 10 как неотъемлемая часть системы.
Управлять ОС через PowerShell можно при помощи командлетов — специальных команд. Командлеты работают аналогично с командами в терминале Linux.

Использование командлетов позволяет:

  1. 5.

    Перейдите в меню «Пуск». Правой кнопкой мыши кликните на Windows PowerShell и выберите Запуск от имени администратора:

  2. 6.

    Дайте согласие на запуск программы. Для этого нажмите Да:

  3. 7.

    Введите командлет:

    Вы увидите следующее сообщение:

  4. 8.

    Установите OpenSSH с помощью командлета:

    После установки вы увидите сообщение. Если для параметра «RestartNeeded» указан статус «True», перезагрузите компьютер.

Готово, вы установили OpenSSH на Windows.

Architecture[edit]

Diagram of the SSH-2 binary packet.

The SSH-2 protocol has an internal architecture (defined in RFC 4251) with well-separated layers, namely:

  • The transport layer (RFC 4253), which typically runs on top of TCP/IP. This layer handles initial key exchange as well as server authentication, and sets up encryption, compression and integrity verification. It exposes to the upper layer an interface for sending and receiving plaintext packets with sizes of up to 32,768 bytes each (more can be allowed by the implementation). The transport layer also arranges for key re-exchange, usually after 1 GB of data has been transferred or after 1 hour has passed, whichever occurs first.
  • The user authentication layer (RFC 4252). This layer handles client authentication and provides a number of authentication methods. Authentication is client-driven: when one is prompted for a password, it may be the SSH client prompting, not the server. The server merely responds to the client’s authentication requests. Widely used user-authentication methods include the following:
    • password: a method for straightforward password authentication, including a facility allowing a password to be changed. Not all programs implement this method.
    • publickey: a method for public-key-based authentication, usually supporting at least DSA, ECDSA or RSA keypairs, with other implementations also supporting X.509 certificates.
    • keyboard-interactive (RFC 4256): a versatile method where the server sends one or more prompts to enter information and the client displays them and sends back responses keyed-in by the user. Used to provide one-time password authentication such as S/Key or SecurID. Used by some OpenSSH configurations when PAM is the underlying host-authentication provider to effectively provide password authentication, sometimes leading to inability to log in with a client that supports just the plain password authentication method.
    • GSSAPI authentication methods which provide an extensible scheme to perform SSH authentication using external mechanisms such as Kerberos 5 or NTLM, providing single sign-on capability to SSH sessions. These methods are usually implemented by commercial SSH implementations for use in organizations, though OpenSSH does have a working GSSAPI implementation.
  • The connection layer (RFC 4254). This layer defines the concept of channels, channel requests and global requests using which SSH services are provided. A single SSH connection can host multiple channels simultaneously, each transferring data in both directions. Channel requests are used to relay out-of-band channel-specific data, such as the changed size of a terminal window or the exit code of a server-side process. Additionally, each channel performs its own flow control using the receive window size. The SSH client requests a server-side port to be forwarded using a global request. Standard channel types include:
    • shell for terminal shells, SFTP and exec requests (including SCP transfers)
    • direct-tcpip for client-to-server forwarded connections
    • forwarded-tcpip for server-to-client forwarded connections
  • The SSHFP DNS record (RFC 4255) provides the public host key fingerprints in order to aid in verifying the authenticity of the host.

This open architecture provides considerable flexibility, allowing the use of SSH for a variety of purposes beyond a secure shell. The functionality of the transport layer alone is comparable to Transport Layer Security (TLS); the user-authentication layer is highly extensible with custom authentication methods; and the connection layer provides the ability to multiplex many secondary sessions into a single SSH connection, a feature comparable to BEEP and not available in TLS.

Despite popular misconception, SSH is not an implementation of Telnet with cryptography provided by the Secure Sockets Layer (SSL).

Usage[edit]

SSH is typically used to log into a remote machine and execute commands, but it also supports tunneling, forwarding TCP ports and X11 connections; it can transfer files using the associated SSH file transfer (SFTP) or secure copy (SCP) protocols. SSH uses the client–server model.

An SSH client program is typically used for establishing connections to an SSH daemon accepting remote connections. Both are commonly present on most modern operating systems, including macOS, most distributions of Linux, OpenBSD, FreeBSD, NetBSD, Solaris and OpenVMS. Notably, versions of Windows prior to Windows 10 version 1709 do not include SSH by default. Proprietary, freeware and open source (e.g. PuTTY, and the version of OpenSSH which is part of Cygwin) versions of various levels of complexity and completeness exist. File managers for UNIX-like systems (e.g. Konqueror) can use the FISH protocol to provide a split-pane GUI with drag-and-drop. The open source Windows program WinSCP provides similar file management (synchronization, copy, remote delete) capability using PuTTY as a back-end. Both WinSCP and PuTTY are available packaged to run directly off a USB drive, without requiring installation on the client machine. Setting up an SSH server in Windows typically involves enabling a feature in Settings app. In , an official Win32 port of OpenSSH is available.

SSH is important in cloud computing to solve connectivity problems, avoiding the security issues of exposing a cloud-based virtual machine directly on the Internet. An SSH tunnel can provide a secure path over the Internet, through a firewall to a virtual machine.

The IANA has assigned TCP port 22, UDP port 22 and SCTP port 22 for this protocol. IANA had listed the standard TCP port 22 for SSH servers as one of the well-known ports as early as 2001. SSH can also be run using SCTP rather than TCP as the connection oriented transport layer protocol.

Использует [ редактировать ]

Пример туннелирования приложения X11 через SSH: у пользователя josh есть SSHed-соединение с локальной машины foofighter на удаленную машину tengwar для запуска xeyes .

Вход в OpenWrt через SSH с помощью PuTTY, работающего в Windows .

SSH — это протокол, который можно использовать для многих приложений на многих платформах, включая большинство вариантов Unix ( Linux , BSD, включая MacOS от Apple и Solaris ), а также Microsoft Windows . Для некоторых из перечисленных ниже приложений могут потребоваться функции, которые доступны только или совместимы с определенными клиентами или серверами SSH. Например, использование протокола SSH для реализации VPN возможно, но в настоящее время только с сервером OpenSSH и реализацией клиента.

Для входа в оболочку на удаленном хосте (заменяет Telnet и rlogin )

Для выполнения одной команды на удаленном хосте (замена rsh )

Для настройки автоматического (без пароля) входа на удаленный сервер (например, с помощью OpenSSH )

В сочетании с rsync для эффективного и безопасного резервного копирования, копирования и зеркалирования файлов

Для переадресации порта

Для туннелирования (не путать с VPN , которая маршрутизирует пакеты между разными сетями или соединяет два широковещательных домена в один).

Для использования в качестве полноценного зашифрованного VPN

Обратите внимание, что только сервер и клиент OpenSSH поддерживают эту функцию.

Для пересылки X с удаленного хоста (возможно через несколько промежуточных хостов)

Для просмотра веб-страниц через зашифрованное прокси-соединение с SSH-клиентами, поддерживающими протокол SOCKS .

Для безопасного монтирования каталога на удаленном сервере в качестве файловой системы на локальном компьютере с использованием SSHFS .

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

Протоколы передачи файлов править

Протоколы Secure Shell используются в нескольких механизмах передачи файлов.

  • Безопасное копирование (SCP), эволюционировавшее из протокола RCP поверх SSH.
  • rsync , более эффективный, чем SCP. Обычно работает через SSH-соединение.
  • Протокол передачи файлов SSH (SFTP), безопасная альтернатива FTP (не путать с FTP через SSH или FTPS )
  • Файлы, передаваемые по протоколу оболочки (он же FISH), выпущенному в 1998 году, который эволюционировал из команд оболочки Unix по SSH.
  • Протокол Fast and Secure Protocol (FASP), также известный как Aspera , использует SSH для управления и порты UDP для передачи данных.

Устранение неполадок

Сброс ключей известных хостов

Ключи хоста обычно хранятся в файле ~/.ssh/known_hosts клиента OpenSSH. PuTTY обычно хранит их в реестре Windows (HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys).

В PuTTY можно использовать диалоговое окно, чтобы разрешить подключение и обновить реестр (просто выберите Yes). Кроме того, вы можете удалить запись вручную.

На клиенте OpenSSH вы можете найти записи хоста в файле ~/.ssh/known_hosts и удалить их вручную. Также можно использовать команду ssh-keygen.

Команда попытается получить доступ и очистить соответствующую запись хоста в файле known_hosts:

После этого попробуйте снова подключиться к серверу.

Проверка и генерирование SSH-ключей

Если у хоста SSH нет собственного закрытого ключа и он не может сгенерировать общий секретный ключ, соединение будет сброшено. Откройте каталог /etc/ssh и попробуйте найти в нём группу файлов с именами sshd_host_*_key. Среди них должен быть файлы с расширением .pub.

Если таких файлов нет, сгенерируйте их с помощью команды ssh-keygen.

Команда выведет сгенерированные ключи:

Теперь попробуйте снова подключиться к серверу.

Настройка поддерживаемых шифров SSH

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

В OpenSSH поддержку SHA1 можно настроить с помощью опции KexAlgorithms. Введите в командную строку:

Клиент PuTTY должен поддерживать группу Диффи-Хеллмана (Connection → SSH → Kex).

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

OpenSSHPuTTYSSH

Обратный SSH-туннель: выставляем ресурсы в Интернет

Обратный SSH-туннель применяется для того, чтобы на удаленном хосте (ssh-сервере) открыть сокет и перенаправлять соединения, устанавливаемые с этим сокетом, на порт локального хоста (ssh-клиента).

Практический пример:

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

Вы устанавливаете соединение с ssh-сервером корпоративного роутера (публичный ip 1.1.1.1) и задаете правило обратной трансляции с помощью аргумента -R (remote port). Затем указываете точку входа, находящуюся на удаленном хосте (ssh-cервере), 172.16.0.1:8080 и адрес трансляции на порт локального хоста (ssh-клиента) 127.0.0.1:

Что происходит с пакетом отправленным по обратному SSH-туннелю:

1. Источник с адресом192.168.0.200 отправляет пакет с адресом назначения 192.168.0.1:8080, который поступив на ssh-сервер попадает в сокет, открытый процессом sshd;

2. Процесс sshd переписывает адрес и порт назначения с 192.168.0.1:8080 на 127.0.0.1:80 и отправляет и отправляет его по SSH туннелю стороне инициатору сеанса;

3. На хосте процесс ssh смотрит адрес назначения полученного пакета и переписывает адрес отправителя с 192.168.0.200 на адрес своего loopback, затем отправляет его в локальный сокет 127.0.0.1:80, открытый процессом веб-сервера.

Conclusion

Gaining an in-depth understanding of the underlying how SSH works can help users understand the security aspects of this technology. Most people consider this process to be extremely complex and un-understandable, but it is much simpler than most people think. If you’re wondering how long it takes for a computer to calculate a hash and authenticate a user, well, it happens in less than a second. In fact, the maximum amount of time is spent in transferring data across the Internet.

Hopefully, this SSH tutorial has helped you see the way different technologies can be clubbed together to create a robust system in which each mechanism has a very important role to play. Also, now you know why Telnet became a thing of the past as soon as SSH came up.

For more Linux tutorials, be sure to check out our VPS tutorials section.

Как работают ключи SSH?

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

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

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

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

Authentication: OpenSSH key management[edit]

On Unix-like systems, the list of authorized public keys is typically stored in the home directory of the user that is allowed to log in remotely, in the file ~/.ssh/authorized_keys. This file is respected by SSH only if it is not writable by anything apart from the owner and root. When the public key is present on the remote end and the matching private key is present on the local end, typing in the password is no longer required. However, for additional security the private key itself can be locked with a passphrase.

The private key can also be looked for in standard places, and its full path can be specified as a command line setting (the option -i for ssh). The ssh-keygen utility produces the public and private keys, always in pairs.

SSH also supports password-based authentication that is encrypted by automatically generated keys. In this case, the attacker could imitate the legitimate server side, ask for the password, and obtain it (man-in-the-middle attack). However, this is possible only if the two sides have never authenticated before, as SSH remembers the key that the server side previously used. The SSH client raises a warning before accepting the key of a new, previously unknown server. Password authentication can be disabled from the server side.

Клиенты для ОС Windows

WinSCP

Загрузка программы с официального сайта: https://winscp.net/eng/download.php.

Графический мультиязычный клиент, распространяется бесплатно. Предлагает на выбор два интерфейса: как в проводнике Windows и классика в стиле Norton Commander. WinSCP может:

  • Заливать и качать файлы с сервера.
  • Создавать, переименовывать и удалять файлы и папки.
  • Поддерживает синхронизацию, несколько типов авторизации: Kerberos, открытый ключ или по паролю.
  • Позволяет автоматизировать действия с помощью скриптов и командной строки.
  • В утилиту встроен текстовый редактор и куча других полезностей.

Домены в популярных национальных и международных зонах со скидкой — домены России в зоне .RU, и .РФ, международные домены .COM, .NET, .BIZ, .ORG, .ME.

CoreFTP

Подробнее о клиенте: http://www.coreftp.com/.

Поставляется в двух вариантах. Версия LE по функционалу заметно уступает конкурентам, но бесплатна. Может загружать файлы с/на сервер одновременно, восстанавливать соединение, когда связь прерывается. CoreFTP Pro оснащен вагоном дополнительных плюшек и стоит 25 y.e.

  • Сжимает, шифрует и дешифрует файлы.
  • Увеличивает скорость закачки за счет многослойных загрузок.
  • Можно настроить шаблоны для повторяемых задач.
  • В клиент установлены утилиты Ping и TraceRoute.
  • Безлимитная тех. поддержка продукта и многое другое.

FreeFTP

Скачать: http://www.coffeecup.com/free-ftp/.

Стандартный клиент. Умеет работать через протоколы HTTP/HTTPS. Может все то же, что и другие SFTP-менеджеры. Русской локализации нет, но интерфейс упрощен и понятен интуитивно. Компьютер сильно не нагружает, быстро включается и работает.

Выполнение входа через SSH с использованием ключей

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

Как работает аутентификация с помощью ключей?

Аутентификация с помощью ключей реализуется путем создания пары ключей: приватного ключа и публичного ключа.

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

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

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

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

Весь этот процесс выполняется в автоматическом режиме после того, как вы настроите ключи.

Создание ключей SSH

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

Введите следующую команду в командной строке:

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

Перейдите в каталог с помощью следующей команды:

Просмотрите данные о разрешениях для файлов:

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

В то же время файл может использоваться совместно и имеет соответствующие разрешения для данной деятельности.

Как передать ваш публичный ключ на сервер

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

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

Дистанционное перенаправление портов: открываем доступ к локальным ресурсам на удалённой системе

«Дистанционное перенаправление портов» — ситуация, противоположная локальному перенаправлению, и используется не так часто. Она позволяет открывать доступ к ресурсам на локальном ПК через SSH-сервер. Предположим, что на локальном ПК настроен веб-сервер. Но ваш ПК защищён сетевым экраном, который не пропускает входящий трафик на сервер.

Если есть доступ к удалённому SSH-серверу, можно подключиться к этому SSH-серверу и использовать дистанционное перенаправление портов. Ваш SSH-клиент укажет серверу перенаправлять трафик с определённого порта – скажем, 1234 – на SSH-сервере на указанный адрес и порт на вашем ПК или внутри локальной сети. Когда кто-то подключается к порту 1234 на SSH-сервере, этот трафик автоматически «туннелируется» по SSH-соединению. Любой, кто подключается к SSH-серверу, сможет получить доступ к серверу, запущенному на вашем ПК. Это достаточно эффективный способ обхода фаерволов.

Чтобы воспользоваться дистанционным туннелированием IP, используйте ssh-команду с аргументом —R. Синтаксис здесь будет практически таким же, как и в случае с локальным перенаправлением:

ssh -R remote_port:local_address:local_port username@server.com

Предположим, что нужно создать серверное приложение, прослушивающее порт 1234 на вашем ПК. Оно доступно через порт 8888 на удалённом SSH-сервере. Адрес SSH-сервера ssh.youroffice.com, а ваше имя пользователя на SSH-сервере bob. Значит, команда будет следующей:

ssh -R 8888:localhost:1234 bob@ssh.youroffice.com

Затем кто-то может подключиться к SSH-серверу через порт 8888, и это подключение будет туннелировано на серверное приложение, запущенное на порте 1234 ПК, с которого вы подключались:

Чтобы сделать это в PuTTY для Windows, выберите опцию Connection > SSH > Tunnels. Далее – опцию «Remote». В поле «Source Port» укажите удалённый порт. В поле «Destination» введите целевой адрес и порт в формате локальный_адрес:локальный_порт.

Например, если нужно настроить SSH-тоннель, как это сделано выше, то укажите 8888 в качестве порта-источника и localhost:1234 в качестве целевого адреса. После этого нажмите «Add» и затем «Open», чтобы открыть SSH-подключение. До подключения нужно будет ввести адрес и порт самого SSH-сервера в разделе «Session».

После этого пользователи смогут подключаться к порту 8888 на SSH-сервере и их трафик будет передаваться на порт 1234 на вашей локальной системе:

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

Нужно включить опцию «GatewayPorts» в sshd_config на удалённом SSH-сервере, если хотите изменить эти настройки.

Standards documentation[edit]

The following RFC publications by the IETF «secsh» working group document SSH-2 as a proposed Internet standard.

  • RFC  – The Secure Shell (SSH) Protocol Assigned Numbers
  • RFC  – The Secure Shell (SSH) Protocol Architecture
  • RFC  – The Secure Shell (SSH) Authentication Protocol
  • RFC  – The Secure Shell (SSH) Transport Layer Protocol
  • RFC  – The Secure Shell (SSH) Connection Protocol
  • RFC  – Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints
  • RFC  – Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)
  • RFC  – The Secure Shell (SSH) Session Channel Break Extension
  • RFC  – The Secure Shell (SSH) Transport Layer Encryption Modes
  • RFC  – Improved Arcfour Modes for the Secure Shell (SSH) Transport Layer Protocol

It was later modified and expanded by the following publications.

  • RFC  – Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol (March 2006)
  • RFC  – RSA Key Exchange for the Secure Shell (SSH) Transport Layer Protocol (March 2006)
  • RFC  – Generic Security Service Application Program Interface (GSS-API) Authentication and Key Exchange for the Secure Shell (SSH) Protocol (May 2006)
  • RFC  – The Secure Shell (SSH) Public Key File Format (November 2006)
  • RFC  – Secure Shell Public Key Subsystem (March 2007)
  • RFC  – AES Galois Counter Mode for the Secure Shell Transport Layer Protocol (August 2009)
  • RFC  – Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer (December 2009)
  • RFC  – X.509v3 Certificates for Secure Shell Authentication (March 2011)
  • RFC  – Suite B Cryptographic Suites for Secure Shell (SSH) (May 2011)
  • RFC  – Use of the SHA-256 Algorithm with RSA, Digital Signature Algorithm (DSA), and Elliptic Curve DSA (ECDSA) in SSHFP Resource Records (April 2012)
  • RFC  – SHA-2 Data Integrity Verification for the Secure Shell (SSH) Transport Layer Protocol (July 2012)
  • RFC  – Ed25519 SSHFP Resource Records (March 2015)
  • RFC  – Secure Shell Transport Model for the Simple Network Management Protocol (SNMP) (June 2009)
  • RFC  – Using the NETCONF Protocol over Secure Shell (SSH) (June 2011)
  • draft-gerhards-syslog-transport-ssh-00 – SSH transport mapping for SYSLOG (July 2006)
  • draft-ietf-secsh-filexfer-13 – SSH File Transfer Protocol (July 2006)

In addition, the OpenSSH project includes several vendor protocol specifications/extensions:

Командная строка

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

Когда вы работаете за компьютером, вы обычно видите окна, кнопки, страницы и всё подобное. Это называется графическим интерфейсом.

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

Или, например, ваш браузер. Если у вас Chrome, то вы видите окно с веб-страницей. А есть версия Headless Chrome, которая может выплёвывать любые страницы в виде картинок прямо на ваш жёсткий диск. У этого «Хрома» нет графического интерфейса со страницей (но есть небольшой интерфейс для настройки).

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

Командная строка — это текстовый интерфейс программы. Вы вводите в эту строку команду, программа может в ответ что-то вас спросить текстом, вы ей текстом ответите, и программа сделает свою работу. Мы уже сталкивались с командной строкой, когда собирали своё приложение в электроне или объясняли, как устроен интернет:

Здесь в командной строке пользователь maximilyakhov на компьютере iMac-Maxim выполнил команду ping для адреса thecode.media — то есть проверил, откликается ли сервер с нашим сайтом. Это видно из второй строки. Программа Ping стала показывать статистику: получили пакеты по 64 байта за 79 мс. Пользователь удовлетворился результатом, вышел из программы клавишей Ctrl+C и получил итоговую статистику. Сейчас командная строка готова к новым командам

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

Может быть интерфейс в виде чата. Вместо того чтобы давать текстовые команды в командной строке, вы пишете команды чат-боту.

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