Ssh

Содержание:

Параметры безопасности

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

Во-первых, подключение с правами суперпользователя (root) и подключение с пустым паролем должны быть запрещены.

Во-вторых, настоятельно рекомендуется изменить стандартный 22 порт SSH-сервера на любой нестандартный. Также хорошей защитой от злоумышленников является закрытие порта (port knocking) — технология, при которой все порты сервера закрыты для подключения, а доступ осуществляется путем установленной последовательности пересылки IP-пакетов.

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

Этими параметрами настройка безопасного SSH-подключения не ограничивается, здесь приведены лишь базовые сведения. Существует еще множество настроек, предназначенных для того чтобы сделать протокол SSH по-настоящему безопасным методом подключения к удаленному серверу (например, арендованному или размещенному в дата-центре, VPS/VDS, виртуальной машине в облаке и т.п.) через небезопасную среду (Интернет).

Как настроить PuTTY

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

Программа включает в себя 4 основных раздела:

  • Session — основная вкладка, предназначенная для подключения к удаленному компьютеру. Здесь вводятся параметры подключения, порт, адрес, а также вносятся так называемые пресеты, которыми можно воспользоваться, чтобы не вводить каждый раз данные для входа. Достаточно один раз прописать настройки сессии, сохранить ее и использовать при следующем запуске программы.
  • Terminal — необходима для включения или отключения возможностей терминала.
  • Window — здесь производятся все настройки интерфейса: внешний вид окна, цвет, шрифт и кодировка.
  • Connection — настройка параметров подключения, алгоритма шифрования, сжатия, ключей аутентификации и других значений.

Нам потребуется всего две вкладки: Session и SSH. Первым делом перейдем ко второй и убедимся, что версия протокола стоит в значении «2». Как правило, сейчас используется понятие SSH-2, так как первая версия практически не применяется из-за существенных недостатков, например, ошибки в схеме обеспечения безопасности.

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

  1. Первый блок включает в себя основные параметры, необходимые для подключения: окно ввода IP-адреса и порта, строку с выбором типа подключения.
  2. Следующий блок предназначен для создания пресетов, которые можно использовать для быстрого подключения к удаленному компьютеру. В строку «Saved Sessions» вводится название сессии, оно сохраняется с помощью кнопки «Save». Чтобы воспользоваться сохраненным пресетом, достаточно его загрузить с помощью кнопки «Load».
  3. Последний блок – параметры закрытия окна при выходе. Доступные значения: always, never, only on clean exit.

Как видите, в настройках PuTTY нет ничего сложного. Теперь давайте перейдем к подключению по протоколу SSH.

Подключение к серверу через SSH

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

Естественно, перед началом надо арендовать виртуальный хостинг или VDS у одного из доступных провайдеров. У Timeweb, к примеру.

Если у вас macOS или Linux

  • Запускаем программу Terminal.
  • Вводим в консоль команду со следующим синтаксисом ssh имя пользователя@адрес сервера. В моем случае это ssh root@89.223.127.80.
  • Указываем пароль суперпользователя (его отправляет хостинг-провайдер сразу после регистрации).
  • Жмем Enter.

Все. Соединение установлено, можно переходить к работе непосредственно с сервером.

Если у вас Windows

  • Скачиваем и устанавливаем программу PuTTY.
  • В строку IP-адрес вводим адрес своего VDS или виртуального хостинга.
  • Жмем на кнопку Open.
  • Вводим пароль администратора, чтобы получить доступ к управлению.

Управление протоколом SSH

У команды для подключения к удаленному PC по SSH есть две важных опции:

  1. ssh -p номер порта имя пользователя@адрес сервера — заменяет стандартный 22-й порт на иной, что положительно сказывается на безопасности и устойчивости к автоматическим хакерским атакам от ботов.
  2. ssh-copy-id -i путь до файла с ключом имя пользователя@адрес сервера— копирует ключ на сервер, чтобы вход осуществлялся без логина и пароля, а именно через ключ.

Работа с хостингом из командной строки

Получение справочной информации

Для получения справочной информации по интересующей команде command наберите в командной строке:

для завершения работы со справкой нажмите «q».

Краткую справку по команде обычно можно получить, запустив ее с параметром —help или -h:

Перемещение по файловой системе

Вывести текущий каталог:

Перейти в домашний каталог пользователя:

Перейти в каталог tmp, размещенный в текущем каталоге:

Перейти в каталог по полному пути /home/login/sitename.ru/docs (корневой каталог сайта sitename.ru):

Перейти в родительский каталог (на уровень выше):

Перейти в предыдущий каталог:

Создание и удаление файлов и каталогов

Создать новый каталог foo в текущем каталоге:

Создать структуру каталогов foo/bar/baz в текущем каталоге:

Удалить каталог foo в текущем каталоге. Каталог должен быть пуст:

Удалить каталог foo со всеми файлами и подкаталогами:

Создать пустой файл foo:

Удалить файл foo:

Просмотр и редактирование содержимого файлов

Просмотреть содержимое текстового файла (лог-файла сайта) (Для выхода нажмите «q»):

Открыть файл foo в текстовом редакторе:

Копирование и перемещение файлов

Копировать файл foo в файл bar:

Скопировать содержимое каталога old в каталог new:

Переименовать файл foo в файл bar:

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

Изменение прав доступа

Рекомендуемые права доступа на хостинге для файлов 644 (rw-rw-rw-), для каталогов 755 (rwxr-xr-x).

Сделать файл foo исполняемым:

Сделать файл foo доступным только для чтения:

Изменение прав доступа для всех каталогов, вложенных в каталог foo на 755:

Изменение прав доступа для всех вложенных в каталог foo файлов на 644:

Управление процессами

Показать информацию о процессах в реальном времени (Для выхода нажмите «q»):

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

Завершить работу процесса по его идентификатору процесса (PID) 1234:

Завершить работу процесса по его имени:

Работа с архивами

Создать архив каталога docs:

Распаковать архив archive.tar.gz:

Распаковать архив archive.zip:

Распаковать архив archive.rar:

Распаковать архив archive.gz:

Поиск файлов

Найти среди файлов сайта содержащие текст «login.mysql» (адрес сервера для доступа к базе данных):

Найти в текущем каталоге и подкаталогах файлы с именем index.php:

Локальное перенаправление портов (SSH port forwarding): получаем доступ по SSH к удалённым ресурсам на локальной системе

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

Чтобы сделать это, вы устанавливаете SSH-соединение с SSH-сервером и говорите клиенту передать трафик с указанного порта на локальном ПК. Например, с порта 1234 на адрес сервера базы данных и его порт внутри офисной сети. Когда вы пытаетесь получить доступ к БД через порт 1234 на вашем ПК («localhost») трафик автоматически «туннелируется» по SSH-соединению и отправляется на сервер БД.

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

Чтобы использовать локальное перенаправление, подключитесь к SSH-серверу с использованием вспомогательного аргумента -L. Синтаксис для туннелирования трафика будет следующим:

ssh -L local_port:remote_address:remote_port username@server.com

Предположим, что офисный сервер находится по адресу 192.168.1.111. У вас есть доступ к SSH-серверу через адрес ssh.youroffice.com, и имя вашего аккаунта на SSH-сервере — bob. В таком случае необходимая команда будет выглядеть следующим образом:

ssh -L 8888:192.168.1.111:1234 bob@ssh.youroffice.com

Запустив эту команду, вы попадете на офисный сервер баз данных через порт 8888 на localhost. Если у СУБД есть веб-интерфейс, можно вписать в адресную строку браузера http://localhost:8888. Если у вас инструмент командной строки, которому необходим сетевой адрес базы данных, то направьте его на localhost:8888. Весь трафик, отправленный на порт 8888 на ПК, будет перенаправлен на 192.168.1.111:1234 внутри офисной сети:

Это слегка сбивает с толку, если надо подключиться к серверному приложению, запущенному в той же системе, где и сам SSH-сервер. К примеру, есть SSH-сервер, работающий на порте 22 на офисном ПК. Но у вас также есть сервер баз данных, работающий на порте 1234 в той же системе по тому же адресу. Вам нужно подключиться к БД из дома, но система принимает только подключение через SSH (через 22 порт), и сетевой экран не пропускает любые внешние подключения. В таком случае можно запустить следующую команду:

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

При попытке подключиться к БД через 8888 порт на вашем ПК, трафик будет передаваться с помощью SSH-подключения. Когда он достигнет системы, в которой работает SSH, SSH-сервер отправит его на порт 1234 на «localhost», принадлежащий тому же ПК, на котором запущен SSH-сервер. То есть, «localhost» в приведённой выше команде означает «localhost» с перспективы удалённого сервера:

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

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

Навигация

Вывод текущей рабочей директории

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

Пример использования:

username@server:~$ pwd
/home/u/username

Вывод содержимого директории

Чтобы посмотреть содержимое директории, воспользуйтесь командой ls.

Вывод содержимого текущей директории в несколько колонок (только имена файлов и директорий):

ls .

Вывод содержимого текущей директории в одну колонку (только имена файлов и директорий):

ls -1

Вывод подробной информации о содержимом текущей директории, включая скрытые файлы (имя которых начинается с точки):

ls -la

Вывод содержимого конкретной директории:

ls имя_директории

Пример использования:

username@server:~$ ls -la
total 16
drwx------  4 username customers 4096 Mar 10 12:56 .
drwx------ 14 username customers 4096 Mar 10 12:55 ..
-rw-------  1 username customers    0 Mar 10 12:56 .htaccess
drwx------  2 username customers 4096 Mar 10 12:55 test
drwx------  2 username customers 4096 Mar 10 12:55 test1
-rw-------  1 username customers    0 Mar 10 12:55 test.txt
где "." - текущий каталог, а ".." - родительский каталог.

Перемещение между директориями

Команда cd позволяет выполнить переход в другую директорию.

Основные способы применения:

Перейти в директорию, которая находится в текущей директории:

cd dirname

Перейти в родительский каталог (на уровень выше):

cd ..

Перейти в домашний каталог:

cd
 
# Либо:
 
cd ~

Перейти в домашний каталог по абсолютному пути (начиная с корня):

cd /home/u/username

Перейти в предыдущий каталог:

cd -

Примеры использования:

# Текущая директория отображается после двоеточия и до символа "$".
 
# Перейти в каталог media
username@server:~$ cd /home/u/username/public_html/media
 
# Перейти в каталог cms
username@server:~/public_html/media$ cd cms
 
# Перейти в домашний каталог
username@server:~/public_html/media/cms$ cd
 
# Перейти в предыдущий каталог
username@server:~$ cd -
/home/u/username/public_html/media/cms
 
# Перейти на уровень выше
username@server:~/public_html/media/cms$ cd ..
username@server:~/public_html/media$

How Does SSH Work with These Encryption Techniques

The way SSH works is by making use of a client-server model to allow for authentication of two remote systems and encryption of the data that passes between them.

SSH operates on TCP port 22 by default (though this can be changed if needed). The host (server) listens on port 22 (or any other SSH assigned port) for incoming connections. It organizes the secure connection by authenticating the client and opening the correct shell environment if the verification is successful.

The client must begin the SSH connection by initiating the TCP handshake with the server, ensuring a secured symmetric connection, verifying whether the identity displayed by the server match previous records (typically recorded in an RSA key store file), and presenting the required user credentials to authenticate the connection.

There are two stages to establishing a connection: first both the systems must agree upon encryption standards to protect future communications, and second, the user must authenticate themselves. If the credentials match, then the user is granted access.

Session Encryption Negotiation

When a client tries to connect to the server via TCP, the server presents the encryption protocols and respective versions that it supports. If the client has a similar matching pair of protocol and version, an agreement is reached and the connection is started with the accepted protocol. The server also uses an asymmetric public key which the client can use to verify the authenticity of the host.

Once this is established, the two parties use what is known as a Diffie-Hellman Key Exchange Algorithm to create a symmetrical key. This algorithm allows both the client and the server to arrive at a shared encryption key which will be used henceforth to encrypt the entire communication session.

Here is how the algorithm works at a very basic level:

  1. Both the client and the server agree on a very large prime number, which of course does not have any factor in common. This prime number value is also known as the seed value.
  2. Next, the two parties agree on a common encryption mechanism to generate another set of values by manipulating the seed values in a specific algorithmic manner. These mechanisms, also known as encryption generators, perform large operations on the seed. An example of such a generator is AES (Advanced Encryption Standard).
  3. Both the parties independently generate another prime number. This is used as a secret private key for the interaction.
  4. This newly generated private key, with the shared number and encryption algorithm (e.g. AES), is used to compute a public key which is distributed to the other computer.
  5. The parties then use their personal private key, the other machine’s shared public key and the original prime number to create a final shared key. This key is independently computed by both computers but will create the same encryption key on both sides.
  6. Now that both sides have a shared key, they can symmetrically encrypt the entire SSH session. The same key can be used to encrypt and decrypt messages (read: section on symmetrical encryption).

Now that the secured symmetrically encrypted session has been established, the user must be authenticated.

Authenticating the User

The final stage before the user is granted access to the server is authenticating his/her credentials. For this, most SSH users use a password. The user is asked to enter the username, followed by the password. These credentials securely pass through the symmetrically encrypted tunnel, so there is no chance of them being captured by a third party.

Although passwords are encrypted, it is still not recommended to use passwords for secure connections. This is because many bots can simply brute force easy or default passwords and gain access to your account. Instead, the recommended alternative is SSH Key Pairs.

These are a set of asymmetric keys used to authenticate the user without the need of inputting any password.

Работа с содержимым файлов

Конкатенация содержимого файлов

Команда cat позволяет выполнить конкатенацию (объединение) содержимого файлов и печать его в стандартный поток вывода. Данная команда зачастую используется просто для просмотра содержимого файла.

Примеры использования:

username@server:~/test_home$ cat test.txt
1
2
3
4
5
username@server:~/test_home$

Данную команду можно использовать в сочетании с командами head и tail для вывода определённого количества строк от начала или конца файла соответственно.

Примеры использования:

username@server:~/test_home$ cat test.txt | head -2
1
2
username@server:~/test_home$ cat test.txt | tail -1
5

Данные команды позволяют вывести 2 первых строки и 1 последнюю строку файла  test.txt.

Поиск по содержимому файла

grep — это популярная команда, позволяющая найти содержимое файлов.

Например, у нас есть файл test1.txt, который имеет следующее содержимое:

username@server:~/test_home$ cat test1.txt

1 first string
2 second string
3 another example of a string
4 something in here
5 andalsohere

Примеры использования grep:

username@server:~/test_home$ grep 'string' test1.txt
1 first string
2 second string
3 another example of a string
username@server:~/test_home$ grep 'th' test1.txt
3 another example of a string
4 something in here
username@server:~/test_home$ grep 'here' test1.txt
4 something in here
5 andalsohere

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

Linux, MacOS, Windows 10

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

Запустите терминал или Windows PowerShell на вашем компьютере и выполните команду:

ssh-keygen

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

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

Нажмите Enter — ключ будет сохранен в указанную директорию по умолчанию.

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

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

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

Копирование ключей на сервер

  1. Выполните в терминале следующую команду, указав вместо user имя пользователя, созданного на сервере, а вместо server — IP-адрес вашего сервера:

    ssh-copy-id user@server
     
    #Например:
    ssh-copy-id admin@2.59.43.145
    
  2. В результате содержимое файла с публичным ключом id_rsa.pub будет скопировано в файл ~/.ssh/authorized_keys на сервере, и в дальнейшем вы сможете устанавливать соединение с сервером, используя команду:

    ssh user@server
     
    #Например:
    ssh admin@2.59.43.145

Пример. Скрипт. Копирование файла с удаленного компьютера.

Задача. На удаленном компьютере Anacron запускает один раз в сутки. Нужно создать скрипт который будет копировать удаленные backup-копии на локальный сервер бекапов. Скрипт запустим при помощи Использование планировщика cron в Linux.

$ ssh-keygen -t dsa
$ ls
id_dsa  id_dsa.pub
$ chmod 600 id_dsa

Поместим публичный ключ файл ~/.ssh/authorized_keys на удаленном компьютере.

$ ssh-copy-id -i id_dsa.pub USER@HOST

Скрипт:

#!/bin/bash
 
# Copy PostgreSQL
 
SFTP='/usr/bin/sftp'
DIR='/home/backups_mbill_sql/'
HOST='user@host:/home/backups_mbill_sql/'
FILES="psql-`date +%d.%m.%Y`*.sql"
 
$SFTP $HOST$FILES $DIR

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

«Дистанционное перенаправление портов» — ситуация, противоположная локальному перенаправлению, и используется не так часто. Она позволяет открывать доступ к ресурсам на локальном ПК через 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-сервере, если хотите изменить эти настройки.

SSH против Telnet

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

SSH и Telnet функционально похожи, но основное различие между ними — SSH использует криптосистему с открытым ключом. Так он аутентифицирует конечные точки при настройке сеанса терминала и шифрует команды сеанса и вывода.

Telnet в основном используется для эмуляции терминала, но и SSH может использоваться для этого. Ещё он может удалённо выдавать команды, как с rsh, передавать файлы с использованием протокола передачи файлов SSH (SFTP) и туннелировать другие приложения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1: Local Port Forwarding

  • This allows you to forward a port from your localhost server () to a port on target remote server ()
  • The basic syntax would be
  • Here the first field would be the localhost using on which you will enable the Port Forward
  • The second field is using which you will connect to the and
  • The third field is the i.e. the server to which you want to forward the request. You can also put localhost in this field (as it is the localhost of )
  • The fourth field is the section i.e. the port to which the request has to be forwarded
  • Lastly provide the server () to which you want to create the secure SSH Tunnel

From the man page of SSH:

-f	Requests ssh to go to background just before command execution. 
-N      Do not execute a remote command.  This is useful for just forwarding ports

-L local_socket:remote_socket

       Specifies that connections to the given TCP port or Unix socket on the local (client) host are to be forwarded to the
       given host and port, or Unix socket, on the remote side.  This works by allocating a socket to listen to either a TCP
       port on the local side, optionally bound to the specified bind_address, or to a Unix socket.  Whenever a connection is
       made to the local port or socket, the connection is forwarded over the secure channel, and a connection is made to
       either host port hostport, or the Unix socket remote_socket, from the remote machine.

3: Dynamic Port Forwarding

  • Let’s say we need a quick way to exit our network bypassing the firewall settings.
  • Our normally has access to HTTP server running on
  • But due to recent firewall policy we can reach host, to access the web server
  • To overcome this problem we can use Dynamic Port Forwarding or SOCKS Forwarding SOCKS is a small protocol, defined in RFC-1928.
  • A SOCKS client connects via TCP, and indicates via the protocol the remote socket it wants to reach; the SOCKS server makes the connection, then gets out of the way, transparently passing data back and forth.
  • Thereafter, it is just as if the client had connected directly to the remote socket.

From the man page of SSH

-D port

             Specifies a local “dynamic” application-level port forwarding.  This works by allocating a socket to lis‐
             ten to port on the local side, optionally bound to the specified bind_address.  Whenever a connection is
             made to this port, the connection is forwarded over the secure channel, and the application protocol is
             then used to determine where to connect to from the remote machine.  Currently the SOCKS4 and SOCKS5 pro‐
             tocols are supported, and ssh will act as a SOCKS server.  Only root can forward privileged ports.
             Dynamic port forwardings can also be specified in the configuration file.

The syntax to use Dynamic Port Forwarding would be:

ssh -f -N -D port connectToHost
  • Here in the first field there is no need to explicitly mention the , just provide the local port to be forwarded in the second field
  • That’s because the is determined dynamically, and can be different for each connection.
  • Replace with the server towards which you want to create the secure tunnel

3.1: Create SSH Tunnel

Before we create SSH Tunnel, let me show you was by default allowed to connect to apache server on using

# curl http://server3:80
My test site

But then we introduce iptables rule to block port 80 in the chain on

# iptables -A OUTPUT -p tcp --dport 80 -j DROP

Now if we try to access the apache server from , curl will time out while trying to establish the connection

# curl --connect-timeout 5 http://server3:80
curl: (28) Connection timed out after 5000 milliseconds

So we create Dynamic Port Forwarding SSH Tunnel from to using a random port . You can choose any other port of your choice.

# ssh -f -N -D 8080 root@server3

Verify the SSH process from this command

# ps -ef | grep ssh
root      1170     1  0 10:20 ?        00:00:00 /usr/sbin/sshd -D
root      1426  1170  0 10:21 ?        00:00:01 sshd: root@pts/1
root      2242  1170  0 12:31 ?        00:00:00 sshd: root@pts/0
root      2611     1  0 16:24 ?        00:00:00 ssh -f -N -D 8080 root@server3
root      2613  1430  0 16:25 pts/1    00:00:00 grep --color=auto ssh

3.2: Verify SSH Tunnel setup

Verify the SSH Tunnel setup Now we will try to use SOCKS proxy to connect to the apache server from using

# curl --proxy socks5h://localhost:8080  http://server3:80
My test site

The curl connection was successful with SOCKS proxy

The tcpdump output on shows that the curl connection happened within the secure SSH Tunnel over port 22

# tcpdump -i enp0s8 port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
16:27:04.659233 IP server1.53544 > server3.ssh: Flags , seq 2051346850:2051346934, ack 679515067, win 349, options , length 84
16:27:04.659249 IP server3.ssh > server1.53544: Flags , ack 84, win 295, options , length 0
16:27:04.659651 IP server3.ssh > server1.53544: Flags , seq 1:45, ack 84, win 295, options , length 44
16:27:04.660067 IP server1.53544 > server3.ssh: Flags , seq 84:192, ack 45, win 349, options , length 108
16:27:04.660454 IP server3.ssh > server1.53544: Flags , seq 45:337, ack 192, win 295, options , length 292
16:27:04.661356 IP server1.53544 > server3.ssh: Flags , seq 192:228, ack 337, win 369, options , length 36
16:27:04.661590 IP server3.ssh > server1.53544: Flags , seq 337:409, ack 228, win 295, options , length 72
16:27:04.661957 IP server1.53544 > server3.ssh: Flags , seq 228:264, ack 409, win 369, options , length 36
16:27:04.702875 IP server3.ssh > server1.53544: Flags , ack 264, win 295, options , length 0

You can also configure your Mozilla Firefox to use SOCKS Proxy by modifying the Proxy configuration under Network Settings

3.3: Close SSH Tunnel

To close the Dynamic Port Forwarding SSH Tunnel we must kill the SSH process which we created earlier on

# ps -ef | grep ssh
root      2611     1  0 16:24 ?        00:00:00 ssh -f -N -D 8080 root@server3
root      2613  1430  0 16:25 pts/1    00:00:00 grep --color=auto ssh

In this case, kill the process PID 2611 to close the tunnel

# kill -9 2611

Авторизация SSH по ключам

Намного безопаснее, удобнее и правильнее будет настроить ssh авторизацию без пароля. Для этого будет использоваться авторизация по ключу.

Для настройки нам понадобится файловый менеджер, например, Far Manager с плагином WinSCP, и Putty

Итак, вот инструкция:

  1. Распаковываем архив, открываем PUTTYGEN:

    Открываем PUTTYGEN (PuTTY Key Generator)

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

    Генерируем ключи

  3. Теперь нужно заполнить (это пароль для доступа к приватному ключу). Заполнять не обязательно, но его наличие повысит безопасность, так как любой, кто имеет доступ к приватному ключу, сможет с его помощью авторизоваться на сервере по ssh:

    Сохраняем ключи

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

    В целях безопасности нежелательно работать под рутом, но я покажу пример команд для root, а вы уже скорректируете под своё имя пользователя

    Итак, копируем файл в .
    Далее нужно импортировать данные в файл

    ssh-keygen -i -f /root/.ssh/sheensay.ru.pub >> /root/.ssh/authorized_keys

    После можно удалить

  6. Осталось настроить подключение. Я пользуюсь Far Manager в связке с плагином WinSCP.

    имеет встроенный NetBox, последователя WinSCP, так что, ничего дополнительно устанавливать не придётся.

    Открываем Far Manager, Alt + F1, выбираем , далее Shift + F4 и настроим наше подключение. Допустим, мы сохранили приватный файл в
    При настройке нужно будет указать IP или доменное имя на нём для доступа к серверу, порт, на котором висит SSH, имя пользователя и путь к приватному файлу-ключу

    Настройка подключения по SSH

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

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

Отключить авторизацию по паролю

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

PasswordAuthentication no

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

Удаленный сервер подключается с использованием IP-адреса или имени хоста. Чтобы подключить ssh с использованием IP-адреса, используйте следующую команду:

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

Например, для подключения к удаленному хосту с использованием IP-адреса 192.168.239.133 команда будет следующей.

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector