ТОП-20 трюков и советов для работы с SSH-туннелями

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

Конфигурационные файлы

Клиентский конфиг располагается по пути: ~/.ssh / config и может выглядеть так:

Host *
     Port 2222

Host proglibserver
     HostName proglibserver.dev.io
     User author
     Port 2112
     IdentityFile /home/test/.ssh/ proglibserver.private_key

В данном примере две директивы:

  • одна сообщает, что на все хосты ходим через порт 2222;
  • а вторая – что нужно использовать конкретное имя пользователя, порт и ключ для узла proglibserver.

Основы

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

ssh -v -p 2200 -C author@proglibserver
  • - C: использование компрессии. Если ожидается большой текст, этот ключ может улучшить ситуацию, сжимая данные на лету.
  • proglibserver: имя удаленного сервера.
  • author@: – это логин. При попытке подключиться без логина, система подставит учетку, под которой вы находитесь на родительской машине.
  • - p 2200: порт удаленной машины (22 обычно не используется, т. к. это дефолтное значение). Для подключения к другому порту используется ключ -p.
  • - v: вывод на экран дебага (пригодится при сбоях аутентификации). Можно совмещать с другими ключами для получения нужного эффекта.

 Все параметры, кроме имени хоста, являются необязательными.

Примеры работы с SSH-туннелями

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

Копирование публичного ключа

Эта команда выполняет то, что вы обычно делаете вручную – копирование ~/.ssh/id_rsa.pub из вашей системы в ~/.ssh/authorized_keys на proglib-сервере:

localhost:~$ ssh-copy-id user@proglibserver

Удаленное выполнение команд

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

localhost:~$ ssh proglibserver "cat /var/log/nginx/access.log" | grep script.php

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

Ниже пример другого способа копирования ключа на удаленный сервер:

localhost:~$ cat ~/.ssh/id_rsa.pub | ssh proglibserver 'cat >> .ssh/authorized_keys'

Проброс портов

В процессе проброса открывается порт в локальной ОС и подключается к порту на другом конце туннеля.

localhost:~$ ssh  -L 7777:127.0.0.1:90 user@proglibserver

Порт 7777 слушается на localhost и пробрасывается на 90 порт proglibserver. 127.0.0.1 – это localhost удаленного сервера.

Локальная папка на удаленной машине

Используя sshfs, можно примонтировать локальный каталог на удаленную машину:

localhost:~$ sshfs user@proglibserver:/media/data ~/data/

Динамическая настройка проброса портов

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

localhost:~$ ~C
ssh> -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward
ssh> -L 1445:remote-win2k3:445
Forwarding port.

Обратный прокси в работе с SSH-туннелями

В данном примере устанавливается SOCKS прокси (весь трафик в туннеле будет идти от нашего localhost).

localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@proglibserver

Траблшутинг

Если в процессе создания туннеля возникают трудности, используйте netstat для проверки привязки порта к интерфейсу. В нашем примере указано 0.0.0.0, но в случае, если не указан параметр GatewayPorts в sshd_config, все будет слушаться на 127.0.0.1.

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

Проксирование трафика SSH-туннелями через SOCKS

SSH Proxy – очень мощный и интересный инструмент. Но есть небольшой побочный эффект – источником трафика будет выступать машина, на которой запускается прокси. Например:

localhost:~$ ssh -D 8888 user@proglibserver

localhost:~$ netstat -pan | grep 8888

tcp        0      0 127.0.0.1:8888       0.0.0.0:*               LISTEN      23880/ssh

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

localhost:~$ ssh -D 0.0.0.0:8888 user@proglibserver

Чтобы проксирование заработало в браузере Chrome, выполните следующие шаги:

  • перейдите в Настройки -> Дополнительные -> Система -> Настройки прокси-сервера;
  • укажите IP и порт.

Разбираемся с SSH-туннелями

Вы можете это сделать одной строкой:

localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"

Использование других приложений с прокси-сервером

Существует много приложений, использующих SOCKS. Браузер – простой и самый популярный пример. Некоторые приложения придется "по хитрому" настроить для использования прокси-сервера, а другим может быть необходима "вспомогательная" программа, работающая по протоколу SOCKS. Примером этого является proxychains. С помощью этого инструмента можно использовать Microsoft RDP через SOCKS.

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Копирование файлов через SCP

Для копирования в SSH-клиенте есть два инструмента: scp и sftp.

localhost:~$ scp image.png author@proglibserver:/home/santa/image _2.png

После выполнения команды копируется файл image.png в папку /home/santa и переименовывается в image _2.png.

sftp author@proglibserver

Удаленный tcpdump и просмотр в Wireshark

Эта команда пригодится для удаленного графического анализа дампа:

localhost:~$ ssh root@ proglibserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k –i

Удаленный запуск GUI-приложения

Существует возможность запускать GUI-приложения удаленно. Это реально при наличии установленного пакета X11 и YES для X11Forwarding в файле sshd_config. Запустить можно любой софт. В примере используется консоль VMware:

localhost:~$ ssh -X proglibserver vmware

rsync и копирование файлов

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

localhost:~$ rsync -az /home/testuser/data proglibserver:backup/

SSH через Tor

Команда из примера ниже проксирует SSH-сессию при помощи инструмента torsocks через сеть Tor (9050 порт):

localhost:~$ torsocks ssh user@proglibserver

К применению tor, как и обратного прокси, стоит подходить со всей ответственностью, понимая, какие проблемы безопасности ОС могут всплывать и предоставлять пути движения трафика.

Двойной проброс портов

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

localhost:~ $ ssh-L 0.0.0.0:8888:20.20.20.20:70 user@proglibserver

Эта команда перенаправляет трафик с proglib-сервера на 20.20.20.20 (proglib-сервер будет выступать источником всего трафика).

Потоковое видео с использованием VLC + SFTP

Используйте опцию VLC Медиа | Открыть URL, чтобы указать адрес файла sftp: / / location. Если установлена защита, то появится запрос на ввод сведений для проверки подлинности.

sftp://proglibserver //media/uploads/myvideo.mkv

SSH на образ EC2

Чтобы подключаться к вашему EC2-образу Amazon (ключ -i), необходимо использовать приватный ключ. Скачайте его в админке Amazon и поменяйте права (chmod 400 key.pem). Держите этот ключ в надежном месте или положите его в ~/.ssh/.

localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public

"Прыжки" через хосты

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

localhost:~$ ssh -J host1,host2,host3 user@host4.internal

Использовать эту возможность можно после установки "YES" для параметра ProxyJump в ssh_config.

Reverse-SSH туннель

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

localhost:~$ ssh-v-R 0.0.0.0:1999:127.0.0.1: 902 192.168.1.100 user@ proglibserver

Установленное соединение с proglibserver по порту 1999 перенаправится в порт 902 нашего клиента.

Копирование папки

Данная команда сжимает папку (ключ -j) и извлекает ее, создавая дубликат:

localhost:~$ tar -cvj /datafolder | ssh proglibserver "tar -xj -C /datafolder"

Редактирование файлов через SCP

В локальной системе во время выполнения команды в папке /tmp создается файл, а затем копируется на сервер, как только редактирование завершилось:

localhost:~$ vim scp://user@proglibserver //etc/hosts

Оригинал

Другие материалы по теме:

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ