Практические советы, примеры и туннели 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
В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверу
.
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 две записи хоста. Первая обозначает все хосты, для всех применяется параметр конфигурации Port 2222. Вторая говорит, что для хоста remoteserver следует использовать другое имя пользователя, порт, FQDN и IdentityFile.
Файл конфигурации может сэкономить много времени на ввод символов, позволяя автоматически применять продвинутую конфигурацию при подключении к конкретным хостам.
Копирование файлов по SSH с помощью SCP
SSH-клиент поставляется с двумя другими очень удобными инструментами для копирования файлов по
localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png
В этом примере файл mypic.png скопирован на remoteserver в папку /media/data и переименован в mypic_2.png.
Не забывайте о разнице в параметре порта. На этом попадаются многие, кто запускает scp
из командной строки. Здесь параметр порта
, а не -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-прокси. Веб-браузер просто самое популярное из них. У некоторых приложений есть параметры конфигурации для активации прокси-сервера. Другим нужно немного помочь вспомогательной программой.
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@remoteserver
Torsocks будет использовать для прокси порт 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 10m
ControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии 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@remoteserver
Torsocks будет использовать для прокси порт 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 10m
ControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии 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@remoteserver
Torsocks будет использовать для прокси порт 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 10m
ControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии 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 через прокси-сервер
Я понятия не имею, что я здесь делаю, поэтому, пожалуйста, имейте это в виду, если вы можете мне помочь!
Я пытаюсь подключиться к своему виртуальному серверу через прокси, но не могу подключиться, просто зависает. Я предполагаю, что это потому, что он не проходит через наш прокси.
Точно так же пробовал дома, работает отлично. Я на OSX, используя Терминал для подключения.
Может ли кто-нибудь посоветовать мне, как я могу пройти через прокси с помощью SSH?
- ssh
- прокси
- терминал
5
Вот как сделать ответ Ричарда Кристенсена в виде одной строки, редактирование файла не требуется (замените заглавными буквами ваши собственные настройки, PROXYPORT часто имеет значение 80):
ssh USER@FINAL_DEST -o "ProxyCommand=nc -X connect -x ПРОКСИХОСТ:ПРОКСИПОРТ %h %p"
Вы также можете использовать ту же опцию -o ...
для scp , см. мой ответ суперпользователя.
Если вы получите это в OS X :
nc: недопустимая опция -- X Попробуйте `nc --help' для получения дополнительной информации.
возможно, вы случайно используете доморощенную версию netcat (вы можете увидеть, выполнив , которая -команда nc
— /usr/bin/nc
должна быть указана первой). Если их два, то одним из обходных путей является указание полного пути к нужному NC, например ProxyCommand=/usr/bin/nc
…
Для CentOS nc
имеет ту же проблему, что и недопустимая опция --X
. connect-proxy
является альтернативой, легко устанавливается с помощью yum
и работает —
ssh -o ProxyCommand="connect-proxy -S PROXYHOST:PROXYPORT %h %p" USER@FINAL_DEST
14
Если ваше прокси-соединение SSH будет использоваться часто, вам не нужно каждый раз передавать их в качестве параметров. вы можете добавить следующие строки в ~/.ssh/config
Хост foobar.example.com ProxyCommand nc -X connect -x proxyhost:proxyport %h %p Серверживинтервал 10
, затем для подключения используйте
ssh foobar.example.com
Источник здесь
4
Я использую -o "ProxyCommand=nc -X 5 -x proxyhost:proxyport %h %p"
параметр ssh для подключения через прокси socks5 на OSX.
2
Просто замечание к ответу @rogerdpack: для платформы Windows очень сложно найти nc.exe с -X(http_proxy)
, однако я обнаружил, что nc можно заменить на ncat , полный пример выглядит следующим образом:
Host github.com Имя хоста github.com #ProxyCommand nc -X connect -x 127.0.0.1:1080 %h %p ProxyCommand ncat --proxy 127.0.0.1:1080 %h %p Пользователь git Порт 22 IdentityFile D:\Пользователи\Администратор\.ssh\github_key
и ncat с --proxy
могут работать отлично.
1
Для Windows параметры @shoaly мне не подошли полностью. Я получал эту ошибку:
NCAT DEBUG: прокси-сервер вернул код состояния 501. Ncat: прокси вернул код состояния 501. ssh_exchange_identification: соединение закрыто удаленным хостом
Я хотел подключиться по ssh к УДАЛЕННОМУ СЕРВЕРУ, но порт SSH был закрыт в моей сети. Я нашел два решения, но второе лучше.
Для решения проблемы с помощью Ncat:
- Скачал Tor Browser, запускаю и жду подключения.
- Я получил Ncat из дистрибутива Nmap и извлек
ncat.exe
в текущий каталог. SSH с использованием Ncat в качестве ProxyCommand в Git Bash с добавлением
--proxy-type socks4
параметр:ssh -o "ProxyCommand=./ncat --proxy-type socks4 --proxy 127.0.0.1:9150 %h %p" USERNAME@REMOTESERVER
Обратите внимание, что эта реализация Ncat не поддерживает socks5.
ЛУЧШЕЕ РЕШЕНИЕ :
- Выполните предыдущий шаг 1.
SSH с использованием connect.c в качестве ProxyCommand в Git Bash:
ssh -o "ProxyCommand=connect -a none -S 127.0.0.1:9150 %h %p"
Обратите внимание, что connect.c поддерживает версии socks 4/4a/5.
Для использования прокси-сервера в git
команд с использованием ssh (например, при использовании GitHub) — при условии, что вы установили Git Bash в C:\Program Files\Git\
— откройте ~/. ssh/config
и добавьте эту запись:
host github.com пользователь git имя хоста github.com порт 22 proxycommand "/c/Program Files/Git/mingw64/bin/connect.exe" -a none -S 127.0.0.1:9150 %h %p
2
$ который не используется /бин/нк $ об/мин -qf /bin/nc nmap-ncat-7.40-7.fc26.x86_64 $ ssh -o "ProxyCommand nc --proxy%h %p" USER@HOST $ ssh -o "ProxyCommand nc --proxy --proxy-type --proxy-auth %h %p" USER@HOST
2
ProxyCommand nc -proxy xxx.com:8080 %h %p
удалить -X подключить
и вместо этого использовать -proxy
.
У меня сработало.
Вот как я решил эту проблему, надеясь помочь другим позже.
Моя система — Debian 10 и минимальная установка.
У меня тоже такая проблема.
git clone [email protected]:ничего/ничего. git Клонирование в «ничто»… nc: недопустимая опция -- 'x' nc -h для помощи ssh_exchange_identification: соединение закрыто удаленным хостом фатальный: Не удалось прочитать из удаленного репозитория. Пожалуйста, убедитесь, что у вас есть правильные права доступа и репозиторий существует.
Или
git clone [email protected]:nothing/nothing.git Клонирование в «ничто»… /usr/bin/nc: неверный параметр -- 'X' nc -h для помощи ssh_exchange_identification: соединение закрыто удаленным хостом фатальный: Не удалось прочитать из удаленного репозитория. Пожалуйста, убедитесь, что у вас есть правильные права доступа и репозиторий существует.
Итак, я знаю, что nc имеет разные версии, такие как openbsd-netcat
и GNU-netcat
, вы можете изменить nc в debian на версию openbsd, но я решил изменить программное обеспечение, например штопор
, потому что имена двух версий nc в системе одинаковые, и многие люди плохо их понимают. Мой подход заключается в следующем.
sudo apt установить штопор
Тогда.
ВИМ ~/.ssh/config
Измените этот файл следующим образом.
Хост github.com Пользователь git Штопор ProxyCommand 192.168.1.22 8118 %h %p
192.168.1.22
и 8118
— это адрес и порт моего прокси-сервера, вы должны изменить его в соответствии с адресом вашего сервера.
Работает нормально.
Спасибо, @han.
1
Я использую proxychains ssh user@host
; от proxychains-ng.
По умолчанию используется прокси socks4 по адресу 127.0.0.1:9050
, но его можно изменить в файле конфигурации /etc/proxychains.conf
или указать другой файл конфигурации, например: proxychains -f custom .конф
1
Я использовал следующие строки в моем .ssh/config
(который можно заменить подходящими параметрами командной строки) в Ubuntu
Host remhost Имя хоста my. host.com Пользователь myuser ProxyCommand nc -v -X 5 -x proxy-ip:1080 %h %p 2> ssh-err.log Серверживеинтервал 30 ФорвардX11 да
При использовании с Msys2 после установки gnu-netcat
файл ssh-err.log
показал, что опция -X
не существует. nc --help
подтвердил это и, похоже, показал, что нет альтернативного варианта для работы с прокси.
Итак, я установил openbsd-netcat
( pacman
удалил gnu-netcat
после запроса, так как он конфликтовал с openbsd-netcat
). На первый взгляд и проверка соответствующих справочных страниц, openbsd-netcat
и Ubuntu netcat
кажутся очень похожими, в частности, в отношении параметров -X
и -x
.
С этим я подключился без проблем.
1
После OpenSSH 7.3 это проще всего сделать с помощью ProxyJump:
ssh ИМЯ ПОЛЬЗОВАТЕЛЯ@ИМЯ ХОСТА -J ИМЯ ХОСТА ПРОКСИ
, что является сокращением для приведенной ниже команды ProxyCommand (которая работает на старых клиентах):
ssh ИМЯ ПОЛЬЗОВАТЕЛЯ@ИМЯ ХОСТА -o "ProxyCommand=ssh ИМЯ ХОСТА ПРОКСИ -W %h:%p"
Или в файле конфигурации ssh ($HOME/. ssh/config):
HostNAME HOSTNAME ИМЯ ПОЛЬЗОВАТЕЛЯ ProxyCommand ssh PROXYHOSTNAME -W %h:%p
Самые старые клиенты требуют использования netcat. YMMV в зависимости от версии netcat и поддерживаемых опций (см. другие ответы).
В моем случае, поскольку у меня был хост перехода или хост-бастион на пути, и поскольку подписи на этих узлах-бастионах изменились с тех пор, как они были импортированы в файл known_hosts, мне просто нужно было удалить эти записи/строки из следующего файла:
/Пользователи/а.абди-келишами/.ssh/known_hosts
Из приведенного выше файла удалите те строки, которые относятся к хостам-бастионам.
Попробуйте -o "ProxyCommand=nc --proxy HOST:PORT %h %p"
для рассматриваемой команды. Он работал на OEL6, но его необходимо изменить, как указано для OEL7.
Если кто-нибудь на CentOS / RHEL получит
nc: недопустимая опция -- 'X'
использовать эту ProxyCommand
ProxyCommand nc --proxy HOST:PORT --proxy-type http %h %p
1
Твой ответ
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
SSH через прокси
Связанные страницы: SSHThroughHTTPProxy
SSH через или через прокси-сервер
В сегодняшнем жестоком сетевом мире нам слишком часто мешают (зло) прокси-серверы компании, которые ограничивают использование Интернета на работе, в у клиентов или даже в некоторых случаях дома или у друзей.
Прокси ограничивают не только то, что вы можете делать, какие протоколы принимаются, какие сайты можно посещать и какие TCP-порты пропущены, это также позволяет вашей компании или другу регистрировать и контролировать вас.
Обратите внимание , что даже при использовании HTTPS через прокси сервер имя открыто, поэтому прокси-сервер ведения журнала будет видеть, к каким HTTPS-серверам вы подключаетесь к.
Я покажу вам несколько простых шагов, которые помогут вам обойти ограничения большинства настройки прокси, а также даст вам больше свободы и предотвратит просмотр глаза, чтобы исследовать ваши привычки просмотра!
Что вам нужно
Вам необходимо программное обеспечение, установленное и работающее вне места, где вы находятся. В этом документе я называю это место «домом».
Место, куда вы хотите выйти из , это то, что я называю «работой» в этом документ. На «работе» вы стоите за злым прокси.
Дома
Вам нужен прокси-сервер HTTP с запущенным , и он вам действительно нужен только для принимать подключения к прокси с локального хоста. Многие люди уже имеют Apache работает и заставляет его загружать прокси-модуль и настраивать его для localhost очень легко и быстро делается. Конечно, вы можете выбрать другой прокси-программное обеспечение, такое как squid, если вы предпочитаете это. В этом примере мы предполагаем что прокси-сервер работает на порту 80 — так же, как и при обычной установке apache.
Возможно, вы захотите включить HTTPS, FTP и другие протоколы в прокси-сервере. конфиг.
Вам нужен sshd, работающий на порту 443 . Почти у всех уже есть sshd уже запущен, вам просто нужно заставить его также прослушивать соединения на порт 443. 443 обычно используется для HTTPS, и именно поэтому мы используем его — большинство прокси настроены на подключение к 443, так как компании хотят позволить своим сотрудникам использовать банки и другие веб-сервисы HTTPS на сеть.
Возможно, излишне говорить, но вы должны убедиться, что ваш Apache или другой Сервер httpd не использует порт 443 для HTTPS.
На работе
Вам нужен SSH-клиент , который может отправлять запросы CONNECT через корпоративный HTTP-прокси. Если вы работаете в Windows, используйте Putty. он имеет встроенную поддержку туннелирования через прокси-сервер HTTP. Если ты на unix/linux (или cywgin) вы можете использовать openssh с штопором для прохождения через прокси к порту 443 вашего домашнего компьютера.
Если вы используете openssh, вы должны добавить следующую строку в ваш ~/.ssh/файл конфигурации:
ProxyCommand /usr/local/bin/corkscrew proxy.work.com 80 %h %p
Вы настраиваете ssh-клиент на порт — перенаправляете локальный порт , скажем, 8080, на удаленный локальный хост: 80. Теперь у вас есть канал, установленный в вашем доме компьютеру через надежно зашифрованное соединение. Конечно, вы также получаете SSH войдите в систему, и вы сможете запускать свои X-программы из дома, чтобы появляться на работе и т. д.
Командная строка openssh для подключения и перенаправления портов прокси-сервера может выглядеть следующим образом:
ssh -L 8080:localhost:80 user@server. at.home -p 443
Настройте свой браузер на работе для использования «localhost:8080» в качестве прокси, для все протоколы, которые вы включили в своем домашнем прокси.
Все последующие запросы браузера затем отправляются через соединение SSH, через прокси, на ssh сервер дома и оттуда на ваш прокси, и в мире…
Прокси SOCKS
Вместо того, чтобы запускать HTTP-прокси дома для выхода в Интернет, вы можете использовать туннель в качестве SOCKS-прокси. Это в основном позволяет вам ничего не запускать у всех дома кроме сервера ssh.
Если у вас есть openssh на обоих концах, вы можете использовать этот более простой подход. Это позволяет вам запустить туннель к вашей домашней машине и использовать этот туннель в качестве SOCKS-прокси вместо использования HTTP-прокси на другом конце туннеля. Этот Кстати, вам не нужно запускать дома какое-либо другое программное обеспечение, кроме ssh-сервера. сам.
Вы можете запустить туннель/прокси SOCKS с рабочей стороны, отправив команда типа:
ssh -D 8080 пользователь@server. at.home -p 443
Вам все еще может понадобиться строка «ProxyCommand», упомянутая выше, чтобы убедиться, что ваш ssh-клиент может подключиться к вашему ssh-серверу дома.
Впоследствии вам необходимо настроить рабочий браузер для использования прокси-сервера SOCKS. теперь работает на локальном порту 8080.
Без ПОДКЛЮЧЕНИЯ
В случаях, когда CONNECT не разрешен к порту 443 вашего домашнего компьютера, вы можно, конечно, попробовать другой порт — если они вообще разрешены, и тогда вы можете нужно переместить ваш прокси/веб-сервер с 80, если это единственный способ для вас.
Если вы не можете найти ни одного полезного порта или если CONNECT вообще не разрешен, вам нужно установить туннель, используя обычный HTTP, используя, например, httptunnel. httptunnel — это клиент-серверное приложение, и вы хотите, чтобы сервер («hts») запускаете на домашнем компе, слушаете 80 порт, и запускаете клиент («htc») на рабочем компьютере, настраивающем туннель.
Дома берем входящее соединение на 80 порт и пробрасываем на 22 порт (ssh):
hts -F локальный: 22 80
На работе подключитесь к дому через прокси-сервер компании и переадресуйте локальный порт (8022 в этом примере) к SSH, чтобы вернуться домой:
htc -P proxy. corp.com:80 -F 8022 server.at.home:80
Дополнительные комментарии
Для других протоколов вы, конечно, можете просто убедиться, что ваш work-ssh сеанс перенаправляет больше портов на вашу домашнюю машину. Затем он различается между протоколы, как заставить их работать. Если вы хотите IRC на работе через это установка, вам нужен «IRC-вышибала» (например, muh) работает на вашем домашнем компьютере, так как иначе IRC не может работать должным образом.
В случаях, когда ваша работа на самом деле не блокирует вас за прокси-сервером, вы можете по-прежнему использовать этот подход (хотя вы можете пропустить часть с выполнением CONNECT и ваш домашний компьютер не должен запускать ssh через порт 443), чтобы предотвратить вашу работу администраторам от слежения за вашим сетевым трафиком.
Список изменений: я добавил информацию о прокси-сервере SOCKS в июне 2010 года.
Обновлено: 3 сентября 2021 г., 15:12 (Центральная Европа, Стокгольм, Швеция)
Как использовать SSH ProxyJump и SSH ProxyCommand
OpenSSH ProxyJump и Директивы ProxyCommand сообщают SSH-клиенту, как подключиться к удаленному серверу через промежуточный сервер, который часто называют хостом перехода, сервером перехода или сервером-бастионом.
Если вы новичок в работе с серверами переходов, прочтите наше руководство по настройке сервера переходов и узнайте о некоторых передовых методах их защиты.
ProxyCommand по сравнению с ProxyJump
ProxyJump — это самый простой и рекомендуемый способ перехода между хостами, поскольку он гарантирует, что трафик, проходящий через промежуточные хосты, всегда зашифрован от начала до конца. Но ProxyJump доступен только начиная с версии OpenSSH 7.5, и эта функция требует поддержки переадресации портов промежуточными хостами. До того, как был выпущен ProxyJump , ProxyCommand был способом перехода к хостам. ProxyCommand работает путем пересылки стандартных входных и выходных данных (stdio) через промежуточный хост. Внутри ProxyJump оборачивает ProxyCommand в безопасную и простую директиву.
Ниже приведен пример использования Команда ProxyJump . Обратите внимание на сокращение -J
.
$ ssh -J <сервер перехода> <удаленный сервер>
Ниже приведен пример использования команды ProxyJump для перехода между несколькими хостами.
$ ssh -J <сервер перехода 1>, <сервер перехода 2>, <сервер перехода 3> <удаленный сервер>
Ниже приведен пример использования команды ProxyCommand .
$ ssh -o ProxyCommand="ssh -W %h:%p <сервер перехода>" <удаленный сервер>
Если вы используете OpenSSH на компьютере с Windows, вы должны указать полный путь к файлу SSH в директиве ProxyCommand . Это должно выглядеть примерно так:
ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p
Настройка ProxyJump и ProxyCommand в файле конфигурации клиента SSH
Настраивать маршруты перехода между каждым новым SSH-соединением может быть утомительно. К счастью, OpenSSH позволяет настроить ProxyJump или ProxyCommand через файл конфигурации клиента SSH (обычно ~/. ssh/config
).
В приведенном ниже примере мы настроим файл конфигурации SSH для перехода на сервер с одним промежуточным звеном (в данном случае — «jumpserver») и авторизуемся на хосте с именем «удаленный сервер» через порт «2048» как пользователь с именем « разработчик».
На рабочей станции, где вы хотите инициировать SSH-соединение, откройте файл конфигурации клиента OpenSSH ( ~/.ssh/config
) с помощью выбранного вами текстового редактора и добавьте следующий код:
Удаленный сервер хоста Имя хоста 192.168.200.200 Разработчик пользователя IdentityFile ~/.ssh/Порт 2048 ## образец для ProxyJump ProxyJump [электронная почта защищена] ## образец для ProxyCommand ProxyCommand ssh -W %h:%p <сервер перехода>
Теперь мы можем просто использовать имя хоста «remoteserver» без проблем с настройкой маршрута перехода каждый раз, когда вы обращаетесь к «remoteserver».
$ удаленный сервер ssh
Для получения дополнительной информации об использовании файлов конфигурации клиента вы можете обратиться к нашему сообщению в блоге о том, как использовать файлы конфигурации клиента SSH.
Условный переход с использованием
Match exec
Иногда нам могут понадобиться две разные клиентские конфигурации для одного и того же хоста; например, чтобы перейти через один промежуточный сервер при работе из офиса и через два промежуточных сервера при работе из дома. Это требование также очень распространено в домашней лаборатории, где владельцам лаборатории нужен прямой доступ, когда они используют SSH из дома, но им необходимо перейти через промежуточный сервер, когда они получают доступ из-за пределов домашней сети.
OpenSSH поддерживает директивы Match exec
, которые можно использовать для настройки решений перехода на основе заданных критериев. В следующем примере показано использование !exec
для проверки того, является ли IP-адрес в сетевом интерфейсе en0
192. 168.100.10
. Если grep
вернет строку, эта команда завершится успешно, и SSH будет использовать ProxyJump — в противном случае он проигнорирует этот блок конфигурации.
Соответствие хост-серверу1 !exec "ifconfig en0 | grep 192.168.100.10" ProxyJump [электронная почта защищена]<сервер перехода> Хост-сервер1 Имя хоста 192.168.100.20
Сообщения в блогах о кибербезопасности Teleport и технические новости
Каждые две недели мы будем рассылать информационный бюллетень с последними новостями о кибербезопасности и обновлениями Teleport.
Адрес электронной почтыЭтот сайт защищен reCAPTCHA, к нему применяются Политика конфиденциальности и Условия обслуживания Google.
Заключение
В этом посте показано, как использовать ProxyJump и ProxyCommand и объяснил различия между ними. Таким образом, ProxyJump является современной и более простой альтернативой ProxyCommand , но ProxyCommand обеспечивает большую гибкость конфигурации маршрута.