Практические советы, примеры и туннели SSH / Хабр
Практические примеры SSH, которые выведут на новый уровень ваши навыки удалённого системного администратора. Команды и советы помогут не только использоватьSSH
, но и более грамотно перемещаться по сети.Знание нескольких трюков ssh
полезно любому системному администратору, сетевому инженеру или специалисту по безопасности.
Практические примеры SSH
- SSH socks-прокси
- Туннель SSH (переадресация портов)
- SSH-туннель на третий хост
- Обратный SSH-туннель
- Обратный прокси SSH
- Установка VPN по SSH
- Копирование ключа SSH (ssh-copy-id)
- Удалённое выполнение команд (неинтерактивно)
- Удалённый перехват пакетов и просмотр в Wireshark
- Копирование локальной папки на удалённый сервер по SSH
- Удалённые приложения GUI с переадресацией SSH X11
- Удалённое копирование файлов с помощью rsync и SSH
- SSH к инстансу EC2
- Редактирование текстовых файлов с помощью VIM через ssh/scp
- Монтирование удалённого SSH как локальной папки с SSHFS
- Мультиплексирование SSH с помощью ControlPath
- Потоковое видео по SSH с помощью VLC и SFTP
- Двухфакторная аутентификация
- Прыжки по хостам с SSH и -J
- Блокировка попыток брутфорса SSH с помощью iptables
- SSH Escape для изменения переадресации портов
Разбор командной строки SSH
В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверуSSH
.localhost:~$ ssh -v -p 22 -C neo@remoteserver
-v
: вывод отладочной информации особенно полезен при анализе проблем аутентификации. Можно использовать несколько раз для вывода дополнительной информации.- p 22
: порт для подключения к удалённому серверу SSH. 22 не обязательно указывать, потому что это значение по умолчанию, но если протокол на каком-то другом порту, то указываем его с помощью параметра-p
. Порт прослушивания указывается в файлеsshd_config
в форматеPort 2222
.-C
: сжатие для соединения. Если у вас медленный канал или вы просматриваете много текста, это может ускорить связь.neo@
: строка перед символом @ обозначает имя пользователя для аутентификации на удалённом сервере. Если не указать его, то по умолчанию будет использоваться имя пользователя учётной записи, в которую вы вошли в данный момент (~$ whoami). Пользователя также можно указать параметром-l
.remoteserver
: имя хоста, к которому подключаетсяssh
, это может быть полное доменное имя, IP-адрес или любой хост в локальном файле hosts. Для подключения к хосту, который поддерживает и IPv4, и IPv6, можно добавить в командную строку параметр
или-6
для правильного резолвинга.
remoteserver
.Использование файла конфигурации
Хотя многие знакомы с файломsshd_config
, есть ещё файл конфигурации клиента для команды ssh
. Значение по умолчанию ~/.ssh/config
, но его можно определить как параметр для опции -F
.Host * Port 2222 Host remoteserver HostName remoteserver.thematrix.io User neo Port 2112 IdentityFile /home/test/.ssh/remoteserver.private_keyВ приведённом выше примерном файле конфигурации ssh две записи хоста.
Файл конфигурации может сэкономить много времени на ввод символов, позволяя автоматически применять продвинутую конфигурацию при подключении к конкретным хостам.
Копирование файлов по SSH с помощью SCP
SSH-клиент поставляется с двумя другими очень удобными инструментами для копирования файлов по зашифрованному ssh-соединению. Ниже см. пример стандартного использования команд scp и sftp. Обратите внимание, что многие параметры для ssh применяются и в этих командах.localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.pngВ этом примере файл mypic.png скопирован на remoteserver в папку /media/data и переименован в mypic_2.png.
Не забывайте о разнице в параметре порта. На этом попадаются многие, кто запускает scp
из командной строки. Здесь параметр порта -P
, а не -p
, как в ssh-клиенте! Вы забудете, но не волнуйтесь, все забывают.
Для тех, кто знаком с консольным ftp
, многие из команд похожи в
. Вы можете сделать push, put и ls, как сердце пожелает.
sftp neo@remoteserver
Во многих из этих примеров можно достичь результата разными методами. Как и во всех наших учебниках и примерах, предпочтение отдаётся практическим примерам, которые просто делают своё дело.
1. SSH socks-прокси
Функция SSH Proxy под номером 1 по уважительной причине. Она более мощная, чем многие предполагают, и даёт вам доступ к любой системе, к которой имеет доступ удалённый сервер, используя практически любое приложение. Клиент ssh может туннелировать трафик через прокси-сервер SOCKS одной простой командой. Важно понимать, что трафик к удалённым системам будет исходить от удалённого сервера, так будет указано в логах веб-сервера.localhost:~$ ssh -D 8888 user@remoteserver localhost:~$ netstat -pan | grep 8888 tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/sshЗдесь мы запускаем socks-прокси на TCP-порту 8888, вторая команда проверяет, что порт активен в режиме прослушивания. 127.0.0.1 указывает, что служба работает только на localhost. Мы можем применить немного другую команду для прослушивания всех интерфейсов, включая ethernet или wifi, это позволит другим приложениям (браузерам и т д.) в нашей сети подключаться к прокси-сервису через ssh socks-прокси.
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserverТеперь можем настроить браузер для подключения к socks-прокси. В Firefox выберите Настройки | Основные | Параметры сети. Укажите IP-адрес и порт для подключения.
Обратите внимание на опцию в нижней части формы, чтобы DNS-запросы браузера тоже шли через прокси SOCKS. Если используете прокси-сервер для шифрования веб-трафика в локальной сети, то наверняка захотите выбрать эту опцию, чтобы DNS-запросы туннелировались через SSH-соединение.
Активация socks-прокси в Chrome
Запуск Chrome с определёнными параметрами командной строки активирует socks-прокси, а также туннелирование DNS-запросов из браузера. Доверяй, но проверяй. Используйте tcpdump для проверки, что DNS-запросы больше не видны.localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"
Использование других приложений с прокси
Имейте в виду, что многие другие приложения тоже могут использовать socks-прокси. Веб-браузер просто самое популярное из них. У некоторых приложений есть параметры конфигурации для активации прокси-сервера. Другим нужно немного помочь вспомогательной программой. Например, proxychains позволяет запустить через socks-прокси Microsoft RDP и др.localhost:~$ proxychains rdesktop $RemoteWindowsServerПараметры конфигурации socks-прокси задаются в файле конфигурации proxychains.
Подсказка: если используете удалённый рабочий стол из Linux на Windows? Попробуйте клиент FreeRDP. Это более современная реализация, чем rdesktop
, с гораздо более плавным взаимодействием.
Вариант использования SSH через socks-прокси
Вы сидите в кафе или гостинице — и вынуждены использовать довольно ненадёжный WiFi. С ноутбука локально запускаем ssh-прокси и устанавливаем ssh-туннель в домашнюю сеть на локальный Rasberry Pi. Используя браузер или другие приложения, настроенные для socks-прокси, мы можем получить доступ к любым сетевым службам в нашей домашней сети или выйти в интернет через домашнее подключение. Всё между вашим ноутбуком и домашним сервером (через Wi-Fi и интернет до дома) зашифровано в туннеле SSH.2. Туннель SSH (переадресация портов)
В простейшей форме SSH-туннель просто открывает порт в вашей локальной системе, который подключается к другому порту на другом конце туннеля.localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserverРазберём параметр
-L
. Его можно представить как локальную сторону прослушивания. Таким образом, в примере выше порт 9999 прослушивается на стороне localhost и переадресуется через порт 80 на remoteserver. Обратите внимание, что 127.0.0.1 относится к localhost на удалённом сервере!Поднимемся на ступеньку. В следующем примере порты прослушивания связываются с другими узлами локальной сети.
localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserverВ этих примерах мы подключаемся к порту на веб-сервере, но это может быть прокси-сервер или любая другая служба TCP.
3. SSH-туннель на сторонний хост
Мы можем использовать те же параметры для подключения туннеля с удалённого сервера к другой службе, запущенной на третьей системе.localhost:~$ ssh -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserverВ данном примере мы перенаправляем туннель от remoteserver к веб-серверу, работающему на 10.10.10.10. Трафик с remoteserver к 10.10.10.10 уже не в SSH-туннеле. Веб-сервер на 10.10.10.10 будет считать remoteserver источником веб-запросов.
4. Обратный SSH-туннель
Здесь настроим прослушивающий порт на удалённом сервере, который будет подключаться обратно к локальному порту на нашем localhost (или другой системе).localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserverВ этой SSH-сессии устанавливается соединение с порта 1999 на remoteserver к порту 902 на нашем локальном клиенте.
5. Обратный прокси SSH
В этом случае мы устанавливаем socks-прокси на нашем ssh-соединении, однако прокси слушает на удалённом конце сервера. Подключения к этому удалённому прокси теперь появляются из туннеля как трафик с нашего localhost.localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver
Устранение проблем с удалёнными SSH-туннелями
Если у вас возникли проблемы с работой удалённых опций SSH, проверьте с помощьюnetstat
, к каким ещё интерфейсам подключён порт прослушивания. Хотя мы в примерах указали 0.0.0. 0, но если значение GatewayPorts в sshd_config установлено в значение no, то листенер будет привязан только к localhost (127.0.0.1).Предупреждение безопасности
Обратите внимание, что при открытии туннелей и socks-прокси внутренние сетевые ресурсы могут быть доступны ненадёжным сетям (например, интернету!). Это может быть серьёзной угрозой безопасности, поэтому убедитесь, что вы понимаете, что представляет собой слушатель и к чему у него есть доступ.
6. Установка VPN по SSH
Общий термин среди спецов по методам атаки (пентестеры и проч.) — это «точка опоры в сети». После установления соединения в одной системе эта система становится шлюзом для дальнейшего доступа к сети. Точка опоры, которая позволяет двигаться вширь.Для такой точки опоры мы можем использовать SSH-прокси и proxychains, однако есть некоторые ограничения. Например, не получится работать напрямую с сокетами, поэтому мы не сможем сканировать порты внутри сети через Nmap SYN
.
Используя этот более продвинутый вариант VPN, подключение снижается до уровня 3. Затем мы можем просто направить трафик через туннель, используя стандартную сетевую маршрутизацию.
Метод использует ssh
, iptables
, tun interfaces
и маршрутизацию.
Сначала нужно задать эти параметры в sshd_config
. Поскольку мы вносим изменения в интерфейсы и удалённой, и клиентской системы, нам нужны права root с обеих сторон.
PermitRootLogin yes PermitTunnel yesЗатем установим ssh-соединение, используя параметр, который запрашивает инициализацию tun-устройств.
localhost:~# ssh -v -w any root@remoteserverТеперь у нас должно быть устройство tun при показе интерфейсов (
# ip a
). Следующий шаг добавит IP-адреса к туннельным интерфейсам.Сторона клиента SSH:
localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0 localhost:~# ip tun0 upСторона сервера SSH:
remoteserver:~# ip addr add 10. 10.10.10/32 peer 10.10.10.2 dev tun0 remoteserver:~# ip tun0 upТеперь у нас прямой маршрут к другому хосту (
route -n
и ping 10.10.10.10
).Можно маршрутизировать любую подсеть через хост на другой стороне.
localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0На удалённой стороне необходимо включить
ip_forward
и iptables
.remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADEБум! VPN через туннель SSH на сетевом уровне 3. Вот это уже победа.
Если возникают какие-то проблемы, используйте tcpdump и ping
, чтобы установить причину. Поскольку мы играем на уровне 3, то наши пакеты icmp пойдут через этот туннель.
7. Копирование ключа SSH (ssh-copy-id)
Тут есть несколько способов, но эта команда экономит время, чтобы не копировать файлы вручную. Она просто копирует ~/.ssh/id_rsa.pub (или ключ по умолчанию) с вашей системы в~/.ssh/authorized_keys
на удалённом сервере.localhost:~$ ssh-copy-id user@remoteserver
8. Удалённое выполнение команд (неинтерактивно)
Командуssh
можно связать с другими командам для обычного удобного интерфейса. Просто добавьте команду, которую хотите запустить на удалённом хосте, в качестве последнего параметра в кавычках.localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.phpВ данном примере
grep
выполняется на локальной системе после того, как лог скачался по ssh-каналу. Если файл большой, удобнее запустить grep
на удалённой стороне, просто заключив обе команды в двойные кавычки.Другой пример выполняет ту же самую функцию, что и ssh-copy-id
из примера 7.
localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'
9.
Удалённый перехват пакетов и просмотр в Wireshark Я взял один из наших примеров по tcpdump. Используйте его для удалённого перехвата пакетов с выдачей результата непосредственно в GUI локального Wireshark.:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -
10. Копирование локальной папки на удалённый сервер по SSH
Красивый трюк, который сжимает папку с помощьюbzip2
(это параметр -j в команде tar
), а затем извлекает поток bzip2
на другой стороне, создавая на удалённом сервере дубликат папки.localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
11. Удалённые приложения GUI с переадресацией SSH X11
Если на клиенте и удалённом сервере установлены «иксы», то можно удалённо выполнить команду GUI, с окном на вашем локальном рабочем столе. Эта функция существует давным давно, но по-прежнему очень полезна. Запустите удалённый веб-браузер или даже консоль VMWawre Workstation, как я делаю в этом примере.localhost:~$ ssh -X remoteserver vmwareТребуется строка
X11Forwarding yes
в файле sshd_config
.12. Удалённое копирование файлов с помощью rsync и SSH
rsync
во многом удобнее scp
, если требуется периодическое резервное копирование каталога, большого количества файлов или очень больших файлов. Здесь есть функция восстановления после сбоя передачи и копирования только изменённых файлов, что сохраняет трафик и время.В этом примере используется сжатие gzip
(-z) и режим архивирования (-a), который включает рекурсивное копирование.
:~$ rsync -az /home/testuser/data remoteserver:backup/
13. SSH через сеть Tor
Анонимная сеть Tor может туннелировать SSH-трафик с помощью командыtorsocks
. Следующая команда прокинет ssh-прокси через Tor.localhost:~$ torsocks ssh myuntracableuser@remoteserverTorsocks будет использовать для прокси порт 9050 на localhost. Как всегда при использовании Tor необходимо серьёзно проверять, какой трафик туннелируется и другие проблемы операционной безопасности (opsec). Куда идут ваши DNS-запросы?
14. SSH к инстансу EC2
Для подключения к инстансу EC2 необходим закрытый ключ. Скачайте его (расширение .pem) из панели управления Amazon EC2 и измените разрешения (chmod 400 my-ec2-ssh-key.pem
). Храните ключ в надёжном месте или поместите его в свою папку ~/.ssh/
.localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-publicПараметр -i просто указывает ssh-клиенту использовать этот ключ. Файл
~/.ssh/config
идеально подходит для автоматической настройки использования ключа при подключении к хосту ec2.Host my-ec2-public Hostname ec2???.compute-1.amazonaws.com User ubuntu IdentityFile ~/.ssh/my-ec2-key.pem
15. Редактирование текстовых файлов с помощью VIM через ssh/scp
Для всех любителейvim
этот совет сэкономит немного времени. С помощью vim
файлы редактируются по scp одной командой. Этот метод просто создаёт файл локально в /tmp
, а затем копирует его обратно, как только мы его сохранили из vim
.localhost:~$ vim scp://user@remoteserver//etc/hostsПримечание: формат немного отличается от обычного
scp
. После хоста у нас двойной //
. Это ссылка на абсолютный путь. Один слэш будет означать путь относительно домашней папки users
.**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])Если увидите такую ошибку, дважды проверьте формат команды. Обычно это означает синтаксическую ошибку.
16. Монтирование удалённого SSH как локальной папки с SSHFS
При помощиsshfs
— клиента файловой системы ssh
— мы можем подключить локальный каталог к удалённому местоположению со всеми взаимодействиями файлов в зашифрованном сеансе ssh
.localhost:~$ apt install sshfsНа Ubuntu и Debian установим пакет
sshfs
, а затем просто приимонтируем удалённое расположение к нашей системе.localhost:~$ sshfs user@remoteserver:/media/data ~/data/
17. Мультиплексирование SSH с помощью ControlPath
По умолчанию при наличии существующего подключения к удалённому серверу с помощьюssh
второе подключение с помощью ssh
или scp
устанавливает новый сеанс с дополнительной аутентификацией. Опция ControlPath
позволяет использовать существующий сеанс для всех последующих соединений. Это значительно ускорит процесс: эффект заметен даже в локальной сети, а тем более при подключении к удалённым ресурсам.Host remoteserver HostName remoteserver.example.org ControlMaster auto ControlPath ~/.ssh/control/%r@%h:%p ControlPersist 10mControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии
ssh
. Последняя опция означает, что даже после выхода из консоли существующий сеанс останется открытым 10 минут, так что в течение этого времени вы сможете повторно подключиться по существующему сокету. Для дополнительной информации смотрите справку ssh_config man
.18. Потоковое видео по SSH с помощью VLC и SFTP
Даже давние пользователиssh
и vlc
(Video Lan Client) не всегда знают об этой удобной опции, когда очень нужно посмотреть видео по сети. В настройках File | Open Network Stream программы vlc
можно ввести местоположение как sftp://
. Если требуется пароль, появится запрос.sftp://remoteserver//media/uploads/myvideo.mkv
19. Двухфакторная аутентификация
Такая же двухфакторная аутентификация, как у вашего банковского счёта или учётной записи Google, применима к сервису SSH.Конечно, ssh
изначально имеет функцию двухфакторной аутентификации, под которой подразумеваются пароль и ключ SSH. Преимущество аппаратного токена или приложения Google Authenticator заключается в том, что это обычно другое физическое устройство.
См. наше 8-минутное руководство по использованию Google Authenticator и SSH.
20. Прыжки по хостам с ssh и -J
Если из-за сегментации сети приходится переходить через несколько хостов ssh, чтобы добраться до конечной сети назначения, вам сэкономит время ярлык -J.localhost:~$ ssh -J host1,host2,host3 [email protected]Здесь главное понимать, что это не аналогично команде
ssh host1
, затем user@host1:~$ ssh host2
и т. д. Параметр -J хитро использует переадресацию, чтобы localhost устанавливал сеанс со следующим хостом в цепочке. Таким образом, в приведённом выше примере наш localhost аутентифицируется на host4. То есть используются наши ключи localhost, а сеанс от localhost до host4 полностью зашифрован.Для такой возможности в ssh_config
укажите опцию конфигурации ProxyJump. Если регулярно приходится переходить через несколько хостов, то автоматизация через конфиг сэкономит массу времени.
21. Блокировка попыток брутфорса SSH с помощью iptables
Любой, кто управлял сервисом SSH и просматривал логи, знает о количестве попыток брутфорса, которые происходят каждый час каждый день. Быстрый способ уменьшить шум в логах — перенести SSH на нестандартный порт. Внесите изменения в файлsshd_config
с помощью параметра конфигурации Port##.С помощью iptables
тоже можно легко блокировать попытки подключения к порту по достижении определённого порога. Простой способ сделать это — использовать OSSEC, поскольку он не только блокирует SSH, но выполняет кучу других мер по обнаружению вторжений на базе имени хоста (HIDS).
22. SSH Escape для изменения переадресации портов
И наш последний примерssh
предназначен для изменения переадресации портов на лету в рамках существующего сеанса ssh
. Представьте такой сценарий. Вы глубоко в сети; возможно, прыгнули через полдюжины хостов и вам нужен локальный порт на рабочей станции, который перенаправлен на Microsoft SMB старой системы Windows 2003 (кто-нибудь помнит ms08-67?).Нажав enter
, попробуйте ввести в консоли ~C
. Это управляющая последовательность в сессии, позволяющая вносить изменения в существующее соединение.
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.Здесь вы можете увидеть, что мы переадресовали наш локальный порт 1445 на хост Windows 2003, который нашли во внутренней сети. Теперь просто запустите
msfconsole
, и можно идти дальше (предполагая, что вы планируете использовать этот хост).
Эти примеры, советы и команды ssh
должны дать отправную точку; дополнительная информация о каждой из команд и возможностей доступна на справочных страницах (man ssh
, man ssh_config
, man sshd_config
).Меня всегда очаровывала возможность обращаться к системам и выполнять команды в любой точке мира. Развивая свои навыки по работе с инструментами вроде ssh
вы станете более эффективным в любой игре, в какую играете.
Практические советы, примеры и туннели SSH / Хабр
Практические примеры SSH, которые выведут на новый уровень ваши навыки удалённого системного администратора. Команды и советы помогут не только использоватьSSH
, но и более грамотно перемещаться по сети.Знание нескольких трюков ssh
полезно любому системному администратору, сетевому инженеру или специалисту по безопасности.
Практические примеры SSH
- SSH socks-прокси
- Туннель SSH (переадресация портов)
- SSH-туннель на третий хост
- Обратный SSH-туннель
- Обратный прокси SSH
- Установка VPN по SSH
- Копирование ключа SSH (ssh-copy-id)
- Удалённое выполнение команд (неинтерактивно)
- Удалённый перехват пакетов и просмотр в Wireshark
- Копирование локальной папки на удалённый сервер по SSH
- Удалённые приложения GUI с переадресацией SSH X11
- Удалённое копирование файлов с помощью rsync и SSH
- SSH через сеть Tor
- SSH к инстансу EC2
- Редактирование текстовых файлов с помощью VIM через ssh/scp
- Монтирование удалённого SSH как локальной папки с SSHFS
- Мультиплексирование SSH с помощью ControlPath
- Потоковое видео по SSH с помощью VLC и SFTP
- Двухфакторная аутентификация
- Прыжки по хостам с SSH и -J
- Блокировка попыток брутфорса SSH с помощью iptables
- SSH Escape для изменения переадресации портов
Разбор командной строки SSH
В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверуSSH
.localhost:~$ ssh -v -p 22 -C neo@remoteserver
-v
: вывод отладочной информации особенно полезен при анализе проблем аутентификации. Можно использовать несколько раз для вывода дополнительной информации.- p 22
: порт для подключения к удалённому серверу SSH. 22 не обязательно указывать, потому что это значение по умолчанию, но если протокол на каком-то другом порту, то указываем его с помощью параметра-p
. Порт прослушивания указывается в файлеsshd_config
в форматеPort 2222
.-C
: сжатие для соединения. Если у вас медленный канал или вы просматриваете много текста, это может ускорить связь.neo@
: строка перед символом @ обозначает имя пользователя для аутентификации на удалённом сервере. Если не указать его, то по умолчанию будет использоваться имя пользователя учётной записи, в которую вы вошли в данный момент (~$ whoami). Пользователя также можно указать параметром-l
.remoteserver
: имя хоста, к которому подключаетсяssh
, это может быть полное доменное имя, IP-адрес или любой хост в локальном файле hosts. Для подключения к хосту, который поддерживает и IPv4, и IPv6, можно добавить в командную строку параметр-4
или-6
для правильного резолвинга.
remoteserver
.Использование файла конфигурации
Хотя многие знакомы с файломsshd_config
, есть ещё файл конфигурации клиента для команды ssh
. Значение по умолчанию ~/.ssh/config
, но его можно определить как параметр для опции -F
.Host * Port 2222 Host remoteserver HostName remoteserver.thematrix.io User neo Port 2112 IdentityFile /home/test/.ssh/remoteserver.private_keyВ приведённом выше примерном файле конфигурации ssh две записи хоста. Первая обозначает все хосты, для всех применяется параметр конфигурации Port 2222. Вторая говорит, что для хоста remoteserver следует использовать другое имя пользователя, порт, FQDN и IdentityFile.
Файл конфигурации может сэкономить много времени на ввод символов, позволяя автоматически применять продвинутую конфигурацию при подключении к конкретным хостам.
Копирование файлов по SSH с помощью SCP
SSH-клиент поставляется с двумя другими очень удобными инструментами для копирования файлов по зашифрованному ssh-соединению. Ниже см. пример стандартного использования команд scp и sftp. Обратите внимание, что многие параметры для ssh применяются и в этих командах.localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.pngВ этом примере файл mypic.png скопирован на remoteserver в папку /media/data и переименован в mypic_2.png.
Не забывайте о разнице в параметре порта. На этом попадаются многие, кто запускает scp
из командной строки. Здесь параметр порта -P
, а не -p
, как в ssh-клиенте! Вы забудете, но не волнуйтесь, все забывают.
Для тех, кто знаком с консольным ftp
, многие из команд похожи в sftp
. Вы можете сделать push, put и ls, как сердце пожелает.
sftp neo@remoteserver
Во многих из этих примеров можно достичь результата разными методами. Как и во всех наших учебниках и примерах, предпочтение отдаётся практическим примерам, которые просто делают своё дело.
1. SSH socks-прокси
Функция SSH Proxy под номером 1 по уважительной причине. Она более мощная, чем многие предполагают, и даёт вам доступ к любой системе, к которой имеет доступ удалённый сервер, используя практически любое приложение. Клиент ssh может туннелировать трафик через прокси-сервер SOCKS одной простой командой. Важно понимать, что трафик к удалённым системам будет исходить от удалённого сервера, так будет указано в логах веб-сервера.localhost:~$ ssh -D 8888 user@remoteserver localhost:~$ netstat -pan | grep 8888 tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/sshЗдесь мы запускаем socks-прокси на TCP-порту 8888, вторая команда проверяет, что порт активен в режиме прослушивания. 127.0.0.1 указывает, что служба работает только на localhost. Мы можем применить немного другую команду для прослушивания всех интерфейсов, включая ethernet или wifi, это позволит другим приложениям (браузерам и т д.) в нашей сети подключаться к прокси-сервису через ssh socks-прокси.
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserverТеперь можем настроить браузер для подключения к socks-прокси. В Firefox выберите Настройки | Основные | Параметры сети. Укажите IP-адрес и порт для подключения.
Обратите внимание на опцию в нижней части формы, чтобы DNS-запросы браузера тоже шли через прокси SOCKS. Если используете прокси-сервер для шифрования веб-трафика в локальной сети, то наверняка захотите выбрать эту опцию, чтобы DNS-запросы туннелировались через SSH-соединение.
Активация socks-прокси в Chrome
Запуск Chrome с определёнными параметрами командной строки активирует socks-прокси, а также туннелирование DNS-запросов из браузера. Доверяй, но проверяй. Используйте tcpdump для проверки, что DNS-запросы больше не видны.localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"
Использование других приложений с прокси
Имейте в виду, что многие другие приложения тоже могут использовать socks-прокси. Веб-браузер просто самое популярное из них. У некоторых приложений есть параметры конфигурации для активации прокси-сервера. Другим нужно немного помочь вспомогательной программой. Например, proxychains позволяет запустить через socks-прокси Microsoft RDP и др.localhost:~$ proxychains rdesktop $RemoteWindowsServerПараметры конфигурации socks-прокси задаются в файле конфигурации proxychains.
Подсказка: если используете удалённый рабочий стол из Linux на Windows? Попробуйте клиент FreeRDP. Это более современная реализация, чем rdesktop
, с гораздо более плавным взаимодействием.
Вариант использования SSH через socks-прокси
Вы сидите в кафе или гостинице — и вынуждены использовать довольно ненадёжный WiFi. С ноутбука локально запускаем ssh-прокси и устанавливаем ssh-туннель в домашнюю сеть на локальный Rasberry Pi. Используя браузер или другие приложения, настроенные для socks-прокси, мы можем получить доступ к любым сетевым службам в нашей домашней сети или выйти в интернет через домашнее подключение. Всё между вашим ноутбуком и домашним сервером (через Wi-Fi и интернет до дома) зашифровано в туннеле SSH.2. Туннель SSH (переадресация портов)
В простейшей форме SSH-туннель просто открывает порт в вашей локальной системе, который подключается к другому порту на другом конце туннеля.localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserverРазберём параметр
-L
. Его можно представить как локальную сторону прослушивания. Таким образом, в примере выше порт 9999 прослушивается на стороне localhost и переадресуется через порт 80 на remoteserver. Обратите внимание, что 127.0.0.1 относится к localhost на удалённом сервере!Поднимемся на ступеньку. В следующем примере порты прослушивания связываются с другими узлами локальной сети.
localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserverВ этих примерах мы подключаемся к порту на веб-сервере, но это может быть прокси-сервер или любая другая служба TCP.
3. SSH-туннель на сторонний хост
Мы можем использовать те же параметры для подключения туннеля с удалённого сервера к другой службе, запущенной на третьей системе.localhost:~$ ssh -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserverВ данном примере мы перенаправляем туннель от remoteserver к веб-серверу, работающему на 10.10.10.10. Трафик с remoteserver к 10.10.10.10 уже не в SSH-туннеле. Веб-сервер на 10.10.10.10 будет считать remoteserver источником веб-запросов.
4. Обратный SSH-туннель
Здесь настроим прослушивающий порт на удалённом сервере, который будет подключаться обратно к локальному порту на нашем localhost (или другой системе).localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserverВ этой SSH-сессии устанавливается соединение с порта 1999 на remoteserver к порту 902 на нашем локальном клиенте.
5. Обратный прокси SSH
В этом случае мы устанавливаем socks-прокси на нашем ssh-соединении, однако прокси слушает на удалённом конце сервера. Подключения к этому удалённому прокси теперь появляются из туннеля как трафик с нашего localhost.localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver
Устранение проблем с удалёнными SSH-туннелями
Если у вас возникли проблемы с работой удалённых опций SSH, проверьте с помощьюnetstat
, к каким ещё интерфейсам подключён порт прослушивания. Хотя мы в примерах указали 0.0.0. 0, но если значение GatewayPorts в sshd_config установлено в значение no, то листенер будет привязан только к localhost (127.0.0.1).Предупреждение безопасности
Обратите внимание, что при открытии туннелей и socks-прокси внутренние сетевые ресурсы могут быть доступны ненадёжным сетям (например, интернету!). Это может быть серьёзной угрозой безопасности, поэтому убедитесь, что вы понимаете, что представляет собой слушатель и к чему у него есть доступ.
6. Установка VPN по SSH
Общий термин среди спецов по методам атаки (пентестеры и проч.) — это «точка опоры в сети». После установления соединения в одной системе эта система становится шлюзом для дальнейшего доступа к сети. Точка опоры, которая позволяет двигаться вширь.Для такой точки опоры мы можем использовать SSH-прокси и proxychains, однако есть некоторые ограничения. Например, не получится работать напрямую с сокетами, поэтому мы не сможем сканировать порты внутри сети через Nmap SYN
.
Используя этот более продвинутый вариант VPN, подключение снижается до уровня 3. Затем мы можем просто направить трафик через туннель, используя стандартную сетевую маршрутизацию.
Метод использует ssh
, iptables
, tun interfaces
и маршрутизацию.
Сначала нужно задать эти параметры в sshd_config
. Поскольку мы вносим изменения в интерфейсы и удалённой, и клиентской системы, нам нужны права root с обеих сторон.
PermitRootLogin yes PermitTunnel yesЗатем установим ssh-соединение, используя параметр, который запрашивает инициализацию tun-устройств.
localhost:~# ssh -v -w any root@remoteserverТеперь у нас должно быть устройство tun при показе интерфейсов (
# ip a
). Следующий шаг добавит IP-адреса к туннельным интерфейсам.Сторона клиента SSH:
localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0 localhost:~# ip tun0 upСторона сервера SSH:
remoteserver:~# ip addr add 10. 10.10.10/32 peer 10.10.10.2 dev tun0 remoteserver:~# ip tun0 upТеперь у нас прямой маршрут к другому хосту (
route -n
и ping 10.10.10.10
).Можно маршрутизировать любую подсеть через хост на другой стороне.
localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0На удалённой стороне необходимо включить
ip_forward
и iptables
.remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADEБум! VPN через туннель SSH на сетевом уровне 3. Вот это уже победа.
Если возникают какие-то проблемы, используйте tcpdump и ping
, чтобы установить причину. Поскольку мы играем на уровне 3, то наши пакеты icmp пойдут через этот туннель.
7. Копирование ключа SSH (ssh-copy-id)
Тут есть несколько способов, но эта команда экономит время, чтобы не копировать файлы вручную. Она просто копирует ~/.ssh/id_rsa.pub (или ключ по умолчанию) с вашей системы в~/.ssh/authorized_keys
на удалённом сервере.localhost:~$ ssh-copy-id user@remoteserver
8. Удалённое выполнение команд (неинтерактивно)
Командуssh
можно связать с другими командам для обычного удобного интерфейса. Просто добавьте команду, которую хотите запустить на удалённом хосте, в качестве последнего параметра в кавычках.localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.phpВ данном примере
grep
выполняется на локальной системе после того, как лог скачался по ssh-каналу. Если файл большой, удобнее запустить grep
на удалённой стороне, просто заключив обе команды в двойные кавычки.Другой пример выполняет ту же самую функцию, что и ssh-copy-id
из примера 7.
localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'
9.
Удалённый перехват пакетов и просмотр в Wireshark Я взял один из наших примеров по tcpdump. Используйте его для удалённого перехвата пакетов с выдачей результата непосредственно в GUI локального Wireshark.:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -
10. Копирование локальной папки на удалённый сервер по SSH
Красивый трюк, который сжимает папку с помощьюbzip2
(это параметр -j в команде tar
), а затем извлекает поток bzip2
на другой стороне, создавая на удалённом сервере дубликат папки.localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
11. Удалённые приложения GUI с переадресацией SSH X11
Если на клиенте и удалённом сервере установлены «иксы», то можно удалённо выполнить команду GUI, с окном на вашем локальном рабочем столе. Эта функция существует давным давно, но по-прежнему очень полезна. Запустите удалённый веб-браузер или даже консоль VMWawre Workstation, как я делаю в этом примере.localhost:~$ ssh -X remoteserver vmwareТребуется строка
X11Forwarding yes
в файле sshd_config
.12. Удалённое копирование файлов с помощью rsync и SSH
rsync
во многом удобнее scp
, если требуется периодическое резервное копирование каталога, большого количества файлов или очень больших файлов. Здесь есть функция восстановления после сбоя передачи и копирования только изменённых файлов, что сохраняет трафик и время.В этом примере используется сжатие gzip
(-z) и режим архивирования (-a), который включает рекурсивное копирование.
:~$ rsync -az /home/testuser/data remoteserver:backup/
13. SSH через сеть Tor
Анонимная сеть Tor может туннелировать SSH-трафик с помощью командыtorsocks
. Следующая команда прокинет ssh-прокси через Tor.localhost:~$ torsocks ssh myuntracableuser@remoteserverTorsocks будет использовать для прокси порт 9050 на localhost. Как всегда при использовании Tor необходимо серьёзно проверять, какой трафик туннелируется и другие проблемы операционной безопасности (opsec). Куда идут ваши DNS-запросы?
14. SSH к инстансу EC2
Для подключения к инстансу EC2 необходим закрытый ключ. Скачайте его (расширение .pem) из панели управления Amazon EC2 и измените разрешения (chmod 400 my-ec2-ssh-key.pem
). Храните ключ в надёжном месте или поместите его в свою папку ~/.ssh/
.localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-publicПараметр -i просто указывает ssh-клиенту использовать этот ключ. Файл
~/.ssh/config
идеально подходит для автоматической настройки использования ключа при подключении к хосту ec2.Host my-ec2-public Hostname ec2???.compute-1.amazonaws.com User ubuntu IdentityFile ~/.ssh/my-ec2-key.pem
15. Редактирование текстовых файлов с помощью VIM через ssh/scp
Для всех любителейvim
этот совет сэкономит немного времени. С помощью vim
файлы редактируются по scp одной командой. Этот метод просто создаёт файл локально в /tmp
, а затем копирует его обратно, как только мы его сохранили из vim
.localhost:~$ vim scp://user@remoteserver//etc/hostsПримечание: формат немного отличается от обычного
scp
. После хоста у нас двойной //
. Это ссылка на абсолютный путь. Один слэш будет означать путь относительно домашней папки users
.**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])Если увидите такую ошибку, дважды проверьте формат команды. Обычно это означает синтаксическую ошибку.
16. Монтирование удалённого SSH как локальной папки с SSHFS
При помощиsshfs
— клиента файловой системы ssh
— мы можем подключить локальный каталог к удалённому местоположению со всеми взаимодействиями файлов в зашифрованном сеансе ssh
.localhost:~$ apt install sshfsНа Ubuntu и Debian установим пакет
sshfs
, а затем просто приимонтируем удалённое расположение к нашей системе.localhost:~$ sshfs user@remoteserver:/media/data ~/data/
17. Мультиплексирование SSH с помощью ControlPath
По умолчанию при наличии существующего подключения к удалённому серверу с помощьюssh
второе подключение с помощью ssh
или scp
устанавливает новый сеанс с дополнительной аутентификацией. Опция ControlPath
позволяет использовать существующий сеанс для всех последующих соединений. Это значительно ускорит процесс: эффект заметен даже в локальной сети, а тем более при подключении к удалённым ресурсам.Host remoteserver HostName remoteserver.example.org ControlMaster auto ControlPath ~/.ssh/control/%r@%h:%p ControlPersist 10mControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии
ssh
. Последняя опция означает, что даже после выхода из консоли существующий сеанс останется открытым 10 минут, так что в течение этого времени вы сможете повторно подключиться по существующему сокету. Для дополнительной информации смотрите справку ssh_config man
.18. Потоковое видео по SSH с помощью VLC и SFTP
Даже давние пользователиssh
и vlc
(Video Lan Client) не всегда знают об этой удобной опции, когда очень нужно посмотреть видео по сети. В настройках File | Open Network Stream программы vlc
можно ввести местоположение как sftp://
. Если требуется пароль, появится запрос.sftp://remoteserver//media/uploads/myvideo.mkv
19. Двухфакторная аутентификация
Такая же двухфакторная аутентификация, как у вашего банковского счёта или учётной записи Google, применима к сервису SSH.Конечно, ssh
изначально имеет функцию двухфакторной аутентификации, под которой подразумеваются пароль и ключ SSH. Преимущество аппаратного токена или приложения Google Authenticator заключается в том, что это обычно другое физическое устройство.
См. наше 8-минутное руководство по использованию Google Authenticator и SSH.
20. Прыжки по хостам с ssh и -J
Если из-за сегментации сети приходится переходить через несколько хостов ssh, чтобы добраться до конечной сети назначения, вам сэкономит время ярлык -J.localhost:~$ ssh -J host1,host2,host3 [email protected]Здесь главное понимать, что это не аналогично команде
ssh host1
, затем user@host1:~$ ssh host2
и т. д. Параметр -J хитро использует переадресацию, чтобы localhost устанавливал сеанс со следующим хостом в цепочке. Таким образом, в приведённом выше примере наш localhost аутентифицируется на host4. То есть используются наши ключи localhost, а сеанс от localhost до host4 полностью зашифрован.Для такой возможности в ssh_config
укажите опцию конфигурации ProxyJump. Если регулярно приходится переходить через несколько хостов, то автоматизация через конфиг сэкономит массу времени.
21. Блокировка попыток брутфорса SSH с помощью iptables
Любой, кто управлял сервисом SSH и просматривал логи, знает о количестве попыток брутфорса, которые происходят каждый час каждый день. Быстрый способ уменьшить шум в логах — перенести SSH на нестандартный порт. Внесите изменения в файлsshd_config
с помощью параметра конфигурации Port##.С помощью iptables
тоже можно легко блокировать попытки подключения к порту по достижении определённого порога. Простой способ сделать это — использовать OSSEC, поскольку он не только блокирует SSH, но выполняет кучу других мер по обнаружению вторжений на базе имени хоста (HIDS).
22. SSH Escape для изменения переадресации портов
И наш последний примерssh
предназначен для изменения переадресации портов на лету в рамках существующего сеанса ssh
. Представьте такой сценарий. Вы глубоко в сети; возможно, прыгнули через полдюжины хостов и вам нужен локальный порт на рабочей станции, который перенаправлен на Microsoft SMB старой системы Windows 2003 (кто-нибудь помнит ms08-67?).Нажав enter
, попробуйте ввести в консоли ~C
. Это управляющая последовательность в сессии, позволяющая вносить изменения в существующее соединение.
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.Здесь вы можете увидеть, что мы переадресовали наш локальный порт 1445 на хост Windows 2003, который нашли во внутренней сети. Теперь просто запустите
msfconsole
, и можно идти дальше (предполагая, что вы планируете использовать этот хост).
Эти примеры, советы и команды ssh
должны дать отправную точку; дополнительная информация о каждой из команд и возможностей доступна на справочных страницах (man ssh
, man ssh_config
, man sshd_config
).Меня всегда очаровывала возможность обращаться к системам и выполнять команды в любой точке мира. Развивая свои навыки по работе с инструментами вроде ssh
вы станете более эффективным в любой игре, в какую играете.
Обратное SSH-туннелирование: от начала до конца
Поскольку доступ к компьютерам становится все более важным в бизнесе, особенно с появлением облачных приложений, пользователи привыкли иметь полный или ограниченный удаленный доступ, что делает удаленный доступ к компьютерам абсолютно необходимым.
Возникновение продолжающейся пандемии Covid-19 высветило необходимость удаленного доступа, поскольку предприятиям пришлось децентрализовать свои операции и адаптироваться к удаленной рабочей среде. По этой причине как корпорации, так и частные лица используют различные доступные им методы локализации.
В этой статье представлено пошаговое руководство по настройке и использованию обратного туннелирования SSH в средах на базе Linux. В частности, в статье представлена концепция туннелирования SSH, включая его определение, использование и недостатки перед переходом к обратному туннелированию SSH.
Туннелирование SSH
SSH — это криптографический сетевой протокол, работающий на порту 22 и позволяющий подключаться к оболочке удаленной машины. С другой стороны, туннелирование/переадресация портов SSH — это механизм, который создает безопасное соединение SSH между локальным и удаленным компьютером. Из-за его зашифрованного характера вы можете использовать туннелирование SHH для передачи сообщений, использующих незашифрованные протоколы, такие как IMAP, VNC или IRC.
Существует три типа переадресации портов:
- Локальная переадресация портов
Это соединение позволяет получить доступ к другому серверу с локального компьютера. Однако вам необходимо знать два номера порта и сервер назначения. Например, если вам нужен удаленный доступ к www.HackerOne.com, ваш туннель SSH будет выглядеть так:
ssh -L 8080:www.HackerOne.com:80
имя ноутбука, а параметр -L указывает переадресацию локального порта. Вы можете использовать любой номер исходного порта (см. список номеров портов TCP и UDP в Википедии). Даже в этом случае номера портов меньше 1024 или больше 49151 зарезервированы для системы и могут работать только с определенными исходными портами.
- Переадресация удаленного порта
В отличие от переадресации локальных портов, переадресация удаленных портов позволяет подключаться с удаленного SSH-сервера к удаленной сетевой службе, расположенной на стороне клиента туннеля. Для этого введите в терминале следующую команду:
SSH -R 5900:localhost:5900 guest@janes-pc
Параметр -R определяет переадресацию удаленного порта, позволяя Джейн получить доступ к вашему ноутбуку (localhost) подключив клиент VNC к порту 5900.
Удаленная переадресация полезна, когда кому-то за пределами организации необходимо получить доступ к внутреннему веб-серверу или когда необходимо использовать внутреннее веб-приложение в общедоступном Интернете.
- Динамическая переадресация портов
Это туннелирование SSH делает клиента прокси-сервером SOCKS. В результате все программы прокси-сервера требуют настройки и повторной настройки, когда вы закончите с ними.
Как показано ниже, используйте параметр -D, чтобы задать динамическую переадресацию портов.
SSH -C -D 1080 ноутбук.
Вы также можете использовать любой номер для соединения. Однако стандартный порт SOCKS — 1080, и некоторые программы могут не работать, если используются другие порты.
Риски, связанные с туннелированием SSH
Протокол SSH восприимчив к различным вредоносным программам, чтобы скрыть утечку данных и каналы источников атак. Злоумышленно полученные ключи SSH также использовались для сетевых атак. Например, вместе с неуправляемыми ключами SSH туннелирование SSH позволяет злоумышленникам использовать украденные ключи SSH для частной сети из общедоступных каналов.
Согласно SSH Academy, эти атаки могут служить укрытием для источника атаки, когда хакеры перенаправляют атаки с систем и устройств. В свою очередь, злоумышленники могут искать и использовать уязвимости, не будучи обнаруженными.
Среди часто выполняемых вредоносных действий — попытка использовать различные учетные данные для входа в систему и запуск инструментов для атаки на электронную почту и веб-протокол. Следовательно, важно, чтобы методы туннелирования обеспечивали как безопасный удаленный доступ, так и контроль и безопасность в сети, к которой осуществляется доступ.
Обратный SSH-туннель
Брандмауэр на маршрутизаторе отклоняет все запросы на подключение или запросы на передачу, которые не имеют исходящих запросов, от достижения удаленной машины. В результате разрешены только соединения, запрошенные удаленной машиной, что создает проблему: брандмауэр отклоняет SSH-соединения, инициированные клиентом, и отменяет ваш доступ к удаленной машине, если она находится за NAT.
Обратный SSH решает эту проблему, имитируя SSH на удаленный сервер. В этом случае удаленная машина прослушивает сетевой порт локального компьютера. Он ретранслирует запросы SSH-подключения к этому порту обратно к себе, что устанавливает новое соединение между локальным и удаленным компьютерами. Другими словами, вы используете туннель внутри туннеля для соединения сервера, удаленной машины и вашей машины (см. рис. 1).
Чтобы создать обратный туннель SSH, рассматриваемая машина сначала должна открыть соединение SSH за пределами брандмауэра, а затем включить туннель -R в порт подключения удаленной машины. На справочной странице описание SSH -R: -R [bind_address:]port:host:hostport.
Указывает, что данный порт на удаленном (серверном) хосте нуждается в переадресации на данный хост и порт на локальной стороне. Это работает путем выделения сокета для прослушивания порта на удаленной стороне. Всякий раз, когда соединение идет к этому порту, соединение происходит по безопасному каналу, и соединение проходит через порт хоста с локальной машины.
Пошаговое руководство по созданию обратного туннеля SSH в Linux
Перед установкой соединения убедитесь, что вы уже установили SSH на свой компьютер с Linux/Ubuntu. Если это не так, выполните следующие шаги, чтобы включить SSH:
- Выполните следующую команду на терминале, чтобы установить пакет OpenSSH-сервера:
$ sudo apt install OpenSSH-server
При появлении запроса введите пароль и Y, чтобы продолжить установку.
- Служба SSH запустится автоматически после завершения установки. Однако вам необходимо убедиться, что установка прошла успешно и служба действительно работает. Для этого запустите
$ sudo systemctl status SSH
Отобразится Active: active (работает), если установка прошла успешно и служба запущена. Нажмите q, чтобы вернуться к приглашению командной строки.
- Если вы используете компьютер с Ubuntu, убедитесь, что вы открываете порт SSH с помощью следующей команды
$ sudo UWF разрешает SSH.
В системах на базе Linux и macOS предварительно установлены клиенты SSH. Однако, если вы хотите подключиться с компьютера с Windows, используйте SSH-клиент среды, например PuTTY.
Если локальный компьютер никогда раньше не принимал подключения SSH, запустите демон SSH (sshd), выполнив на терминале следующую команду:
$ sudo systemctl start sshd
Чтобы демон запускался при каждой загрузке компьютера , выполните следующую команду
$ sudo systemctl enable sshd
Как это работает?
- Подключение к удаленному серверу
Чтобы подключиться к удаленному серверу, используйте команду ssh
$ ssh [ваш-аккаунт-логин]@[сервер-ip]
- Создать обратный туннель SSH
После того, как вы установите соединение, человек, например, системный администратор, на стороне удаленного сервера должен выполнить на своем компьютере следующую команду:
ssh -fN -R 7010:localhost:23 имя пользователя@yourMachine-ipaddress.
Этот запрос на подключение гарантирует, что запросы SSH-подключения для порта 7010 на вашем компьютере переместятся на порт 23 удаленного сервера.
- Отправьте запрос на подключение SSH с вашей машины на вашу машину
На этом шаге вы установите соединение через порт 7000.
ssh username@localhost -p 7000
Затем ваш запрос попадет на удаленный хост. Таким образом, используйте имя пользователя своей учетной записи на удаленном сервере и пароль, когда будет предложено ввести эти данные.
Вы также можете настроить ключи SSH, чтобы сделать более безопасным подключение с удаленного компьютера к локальному компьютеру. На удаленном компьютере введите следующую команду:
$ ssh-keygen
, которая запросит у вас парольную фразу.
Рекомендуется использовать четыре слова, разделенные символами, чтобы создать надежную парольную фразу и гарантировать, что только те, у кого есть эта фраза, могут создать SSH-соединение с вашим компьютером без запроса пароля. Дополнительно необходимо передать сгенерированный ключ на локальный компьютер с помощью команды ssh-copy-id username@localhost.
Заключение
Преобразование сетевых адресов (NAT) скрывает законные IP-адреса, задействуя необнаруживаемые секретные IP-сети, которые полагаются на незарегистрированные IP-адреса, доступные в Интернете. Таким образом, NAT, объединяющий две сети, расположен на маршрутизаторе и может быть настроен на глобальное объявление только одного адреса для всей сети.
Обратное туннелирование SSH позволяет получить доступ к удаленным компьютерам за NAT. Например, вы можете получить доступ к своему офису из дома. Таким образом, обратное туннелирование SSH — это метод, который позволяет вам подключить SSH к вашей системе на базе Linux, не имеющей общедоступного IP-адреса.
Подключитесь сегодня к JFrog Подключайтесь и получайте доступ ко всем своим удаленным устройствам легко в течение нескольких секунд с помощью безопасного и надежного соединения.
Поддерживаются все ОС на базе Linux, а также все доступные SBC, такие как: Raspberry Pi, Beaglebone, Jetson Nano и другие.
сеть — Как работает обратное туннелирование SSH?
Мне нравится объяснять такие вещи с помощью визуализации. 🙂
Думайте о своих соединениях SSH как о трубах. Большие трубы. Обычно через эти каналы вы можете запустить оболочку на удаленном компьютере. Оболочка работает в виртуальном терминале (tty) через эту трубку. Но вы уже знаете эту часть.
Думайте о своем туннеле как о еще одной трубе внутри трубы. У вас по-прежнему есть большое SSH-соединение, но опция -L или -R позволяет установить внутри него меньшую трубку.
Ваша удаленная оболочка ssh фактически связывается с вами, используя одну из этих меньших встроенных трубок, подключенных к stdio.
У каждой трубы есть начало и конец. Большая труба, ваше SSH-соединение, начинается с вашего SSH-клиента и заканчивается на SSH-сервере, к которому вы подключились. Все меньшие трубки имеют одинаковые конечные точки, за исключением того, что роль «начала» или «конца» определяется тем, использовали ли вы -L
или -R
(соответственно) для их создания.
(Вы не сказали, но я предполагаю, что упомянутая вами «удаленная» машина, находящаяся за брандмауэром, может получить доступ в Интернет с помощью преобразования сетевых адресов (NAT). Это очень важно. , поэтому исправьте, пожалуйста, это предположение, если оно неверно.)
При создании туннеля вы указываете адрес и порт, на который он будет отвечать (или «привязываться»), а также адрес и порт, на который он будет доставляться. 9Параметр 0217 -L сообщает туннелю о привязке к локальной стороне туннеля (хосту, на котором запущен ваш клиент). Параметр -R
сообщает туннелю о привязке к удаленной стороне (серверу SSH).
Итак… Чтобы иметь возможность подключиться по SSH из Интернета к хосту за брандмауэром, вам нужно, чтобы целевой хост открыл SSH-соединение с хостом снаружи и включил туннель -R
, чей «вход точка — это «удаленная» сторона его соединения.
Из двух моделей, показанных выше, вам нужна правая.
С хоста , защищенного брандмауэром :
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Это говорит клиенту на целевом хосте установить туннель с точкой входа -R
emote. Все, что подключается к порту 22222 на дальнем конце туннеля, фактически достигнет «порта 22 локального хоста», где «локальный хост» — это точка выхода из туннеля (т. е. ваш клиент ssh в данном случае на целевом хосте). ).
Другие варианты:
-
-f
указывает ssh перейти в фоновый режим после аутентификации, поэтому вам не нужно сидеть и запускать что-то вродеsleep
на удаленном сервере, чтобы туннель оставался в живых. -
-N
говорит, что вам нужно SSH-соединение, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, — это туннель, то включение этого параметра экономит ресурсы. -
-T
отключает выделение псевдотерминала, что уместно, поскольку вы не пытаетесь создать интерактивную оболочку.
Если вы не настроили ключ для входа в систему без пароля, будет запрашиваться пароль.
(Обратите внимание, что если вы намерены оставить соединение открытым в течение длительного времени, без присмотра, возможно, автоматически обновляя соединение, когда оно выходит из строя (путем разбора ssh -O check
), я рекомендую использовать отдельный, уникальный Ключ SSH для этого, который вы настроили только для этого туннеля/клиента/сервера, особенно если вы используете RemoteForward. Не доверяйте никому.)
Теперь, когда сервисный туннель -R активен, вы можете подключиться к нему с yourpublichost , установить соединение с хостом, защищенным брандмауэром, через туннель:
ssh -p 22222 username@localhost
Вы получите вызов ключа хоста, так как вы, вероятно, никогда раньше не подключались к этому хосту. Затем вы получите запрос пароля для учетной записи с именем пользователя
(если вы не настроили ключи для входа без пароля).
Если вы собираетесь получать доступ к этому хосту на регулярной основе, вы также можете упростить доступ, добавив несколько строк в свои ~/.ssh/config
файл на yourpublichost
:
host firewalledhost Пользователь firewalleduser имя хоста Порт 22222
Настройте firewalledhost
и firewalleduser
в соответствии с требованиями. Поле firewalleduser
должно совпадать с вашим именем пользователя на удаленном сервере, но firewalledhost
может быть любым именем, которое вам подходит, имя не должно совпадать с каким-либо разрешимым именем, так как ваше соединение регулируется Hostname
и Порт
.
В качестве альтернативы, если вы хотите получить доступ к этому из другого места в Интернете, вы можете добавить следующее к вашему ~/.ssh/config
:
host firewalledhost ProxyCommand ssh -fWlocalhost:22222 ваш публичный хост
Параметр -W
используется для открытия соединения с удаленным хостом для продолжения сеанса SSH.