В этой статье будем разбирать практические примеры работы с SSH-туннелями.
Конфигурационные файлы
Клиентский конфиг располагается по пути: ~/.ssh / config и может выглядеть так:
1
2
3
4
5
6
7
8
|
Host *
Port 2222
Host proglibserver
HostName proglibserver.dev.io
User author
Port 2112
IdentityFile /home/test/.ssh/ proglibserver.private_key
|
В данном примере две директивы:
- одна сообщает, что на все хосты ходим через порт 2222;
- а вторая – что нужно использовать конкретное имя пользователя, порт и ключ для узла proglibserver.
Основы
В примере ниже используются основные параметры, часто применяемые при коннекте к удаленному серверу. Все нюансы настраиваются в файле sshd_config.
1
|
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-сервере:
1
|
localhost:~$ ssh–copy–id user@proglibserver
|
Удаленное выполнение команд
При подключении просто добавьте в конце команду, которую нужно выполнить на удаленном хосте:
1
|
localhost:~$ ssh proglibserver “cat /var/log/nginx/access.log” | grep script.php
|
После того, как файл будет получен, grep выполнится на локальной машине. Запустите grep на удаленной стороне, если ожидается много информации.
Ниже пример другого способа копирования ключа на удаленный сервер:
1
|
localhost:~$ cat ~/.ssh/id_rsa.pub | ssh proglibserver ‘cat >> .ssh/authorized_keys’
|
Проброс портов
В процессе проброса открывается порт в локальной ОС и подключается к порту на другом конце туннеля.
1
|
localhost:~$ ssh –L 7777:127.0.0.1:90 user@proglibserver
|
Порт 7777 слушается на localhost и пробрасывается на 90 порт proglibserver. 127.0.0.1 – это localhost удаленного сервера.
Локальная папка на удаленной машине
Используя sshfs, можно примонтировать локальный каталог на удаленную машину:
1
|
localhost:~$ sshfs user@proglibserver:/media/data ~/data/
|
Динамическая настройка проброса портов
Вы глубоко «закопались» в сети, манипулируя SSH-туннелями, логинились полдюжины раз, и вам нужно получить порт на рабочем ПК, проброшенный с удаленной машины в рамках текущей сессии? Как это сделать, смотрите на примере ниже:
1
2
3
4
5
6
7
8
9
10
11
|
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).
1
|
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 – очень мощный и интересный инструмент. Но есть небольшой побочный эффект – источником трафика будет выступать машина, на которой запускается прокси. Например:
1
2
3
4
5
|
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, а второй командой проверяем, слушается ли порт. Немного изменив команду, мы даем возможность другим приложениям подключаться к нашему прокси:
1
|
localhost:~$ ssh –D 0.0.0.0:8888 user@proglibserver
|
Чтобы проксирование заработало в браузере Chrome, выполните следующие шаги:
- перейдите в Настройки -> Дополнительные -> Система -> Настройки прокси-сервера;
- укажите IP и порт.
Вы можете это сделать одной строкой:
1
|
localhost:~$ google–chrome —proxy–server=“socks5://192.168.1.10:8888”
|
Использование других приложений с прокси-сервером
Существует много приложений, использующих SOCKS. Браузер – простой и самый популярный пример. Некоторые приложения придется «по хитрому» настроить для использования прокси-сервера, а другим может быть необходима «вспомогательная» программа, работающая по протоколу SOCKS. Примером этого является proxychains. С помощью этого инструмента можно использовать Microsoft RDP через SOCKS.
1
|
localhost:~$ proxychains rdesktop $RemoteWindowsServer
|
Копирование файлов через SCP
Для копирования в SSH-клиенте есть два инструмента: scp и sftp.
1
|
localhost:~$ scp image.png author@proglibserver:/home/santa/image _2.png
|
После выполнения команды копируется файл image.png в папку /home/santa и переименовывается в image _2.png.
1
|
sftp author@proglibserver
|
Удаленный tcpdump и просмотр в Wireshark
Эта команда пригодится для удаленного графического анализа дампа:
1
|
localhost:~$ ssh root@ proglibserver ‘tcpdump -c 1000 -nn -w – not port 22’ | wireshark –k –i
|
Удаленный запуск GUI-приложения
Существует возможность запускать GUI-приложения удаленно. Это реально при наличии установленного пакета X11 и YES для X11Forwarding в файле sshd_config. Запустить можно любой софт. В примере используется консоль VMware:
1
|
localhost:~$ ssh –X proglibserver vmware
|
rsync и копирование файлов
Если вам часто нужно делать бекапы больших папок и файлов, то rsync будет удачным выбором. Этот инструмент умеет восстанавливать неудачный сеанс передачи и копировать только отличия между двумя временными точками:
1
|
localhost:~$ rsync –az /home/testuser/data proglibserver:backup/
|
SSH через Tor
Команда из примера ниже проксирует SSH-сессию при помощи инструмента torsocks через сеть Tor (9050 порт):
1
|
localhost:~$ torsocks ssh user@proglibserver
|
К применению tor, как и обратного прокси, стоит подходить со всей ответственностью, понимая, какие проблемы безопасности ОС могут всплывать и предоставлять пути движения трафика.
Двойной проброс портов
Можно пробрасывать порт на удаленный сервер через свою машину:
1
|
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. Если установлена защита, то появится запрос на ввод сведений для проверки подлинности.
1
|
sftp://proglibserver //media/uploads/myvideo.mkv
|
SSH на образ EC2
Чтобы подключаться к вашему EC2-образу Amazon (ключ -i), необходимо использовать приватный ключ. Скачайте его в админке Amazon и поменяйте права (chmod 400 key.pem). Держите этот ключ в надежном месте или положите его в ~/.ssh/.
1
|
localhost:~$ ssh –i ~/.ssh/my–ec2–key.pem ubuntu@my–ec2–public
|
«Прыжки» через хосты
Иногда для того, чтобы попасть на конкретный хост, приходится переходить из узла в узел. Данный трюк облегчит вашу жизнь:
1
|
localhost:~$ ssh –J host1,host2,host3 user@host4.internal
|
Использовать эту возможность можно после установки «YES» для параметра ProxyJump в ssh_config.
Reverse-SSH туннель
В этом примере рассматривается создание порта на удаленном сервере, который подключается обратно к локальному порту на нашем localhost (или другой ОС).
1
|
localhost:~$ ssh–v–R 0.0.0.0:1999:127.0.0.1: 902 192.168.1.100 user@ proglibserver
|
Установленное соединение с proglibserver по порту 1999 перенаправится в порт 902 нашего клиента.
Копирование папки
Данная команда сжимает папку (ключ -j) и извлекает ее, создавая дубликат:
1
|
localhost:~$ tar –cvj /datafolder | ssh proglibserver “tar -xj -C /datafolder”
|
Редактирование файлов через SCP
В локальной системе во время выполнения команды в папке /tmp создается файл, а затем копируется на сервер, как только редактирование завершилось:
1
|
localhost:~$ vim scp://user@proglibserver //etc/hosts
|