В этой статье будем разбирать практические примеры работы с 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 и порт.
Вы можете это сделать одной строкой:
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
Комментарии