Сегодня в статье рассмотрим примеры использования SSH сессий в операционных системах семейства Linux.
- 1. Установка SSH на Linux
- 2. Синтаксис команды SSH в Linux
- 3. Подключение к удалённому серверу по SSH в Linux
- 4. Копирование файлов по SSH
- 5. SSH socks-прокси сервер и динамическая переадресация портов.
- 6. Создание постоянного туннеля (AUTOSSH)
- 7. Копирование ключа SSH (ssh-copy-id)
- 8. Удалённое выполнение команд (неинтерактивно)
- 9. Удалённый перехват пакетов и просмотр в Wireshark
- 10. Копирование локальной папки на удалённый сервер по SSH
- 11. Удалённые приложения GUI с переадресацией SSH X11
- 12. Удалённое копирование файлов с помощью rsync и SSH
- 13. SSH через сеть Tor
- 14. Редактирование текстовых файлов с помощью vim через ssh/scp
- 15. Монтирование удалённой директории через SSH с SSHFS
- 16. Мультиплексирование SSH с помощью ControlPath
- 17. Потоковое видео по SSH с помощью VLC и SFTP
- 18. Прыжки по хостам с ssh и -J
- 19. Блокировка попыток брутфорса SSH с помощью iptables
- 20. Завершение
SSH (Secure Shell) – это протокол для удаленного доступа к серверу через интернет. Это один из самых распространенных инструментов системного администрирования Linux. В этой статье мы рассмотрим несколько примеров использования SSH, которые помогут вам выйти на новый уровень удаленного системного администрирования.
- 1. Установка SSH на Linux
- 2. Синтаксис команды SSH в Linux
- 3. Подключение к удалённому серверу по SSH в Linux
- 4. Копирование файлов по SSH
- 5. SSH socks-прокси сервер и динамическая переадресация портов.
- 6. Создание постоянного туннеля (AUTOSSH)
- 7. Копирование ключа SSH (ssh-copy-id)
- 8. Удалённое выполнение команд (неинтерактивно)
- 9. Удалённый перехват пакетов и просмотр в Wireshark
- 10. Копирование локальной папки на удалённый сервер по SSH
- 11. Удалённые приложения GUI с переадресацией SSH X11
- 12. Удалённое копирование файлов с помощью rsync и SSH
- 13. SSH через сеть Tor
- 14. Редактирование текстовых файлов с помощью vim через ssh/scp
- 15. Монтирование удалённой директории через SSH с SSHFS
- 16. Мультиплексирование SSH с помощью ControlPath
- 17. Потоковое видео по SSH с помощью VLC и SFTP
- 18. Прыжки по хостам с ssh и -J
- 19. Блокировка попыток брутфорса SSH с помощью iptables
- 20. Завершение
- Удаленный доступ к серверу:
SSH позволяет подключаться к удаленному серверу и работать с ним через командную строку. Это может быть полезно, если вы хотите получить доступ к серверу, находящемуся в другом городе или даже стране. Например, если у вас есть сервер с веб-приложением, которое нужно обновлять, вы можете использовать SSH для обновления сервера удаленно.
- Управление конфигурациями:
SSH также может быть использован для управления конфигурациями сервера. Например, вы можете создать скрипт, который будет автоматически обновлять конфигурации сервера при каждом запуске. Это поможет вам избежать ошибок и упростить процесс обновления.
- Резервное копирование и восстановление:
SSH может использоваться для создания резервных копий сервера и восстановления его после сбоя. Например, вы можете настроить автоматическое копирование файлов на удаленный сервер и восстановление их при необходимости.
- Мониторинг и управление процессами:
SSH можно использовать для мониторинга процессов на сервере и управления ими. Вы можете использовать команды типа «top
» или «ps
» для просмотра состояния процессов и управления ими через SSH.
- Управление пользователями и группами:
SSH также можно использовать для управления пользователями и группами на сервере. Вы можете создавать новых пользователей, изменять их права доступа и удалять их через SSH.
Установка SSH на Linux
Для подключения к удаленному серверу по SSH вам необходимо для начала установить сам клиент.
- Если вы используете Ubuntu или Debian, то вы можете установить его с помощью менеджера пакетов
Apt
:
sudo apt-get install ssh
- Если вы используете CentOS или Red Hat, то вы можете установить SSH-клиент с помощью менеджера пакетов
Yum
:
yum install openssh-clients
Синтаксис команды SSH в Linux
Синтаксис команды SSH выглядит следующим образом:
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
Правда запутанно и ничего не понятно. Давайте разберем классические примеры с использованием команды SSH.
Подключение к удалённому серверу по SSH в Linux
В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверу по SSH
.
Откройте терминал и введите команду:
ssh username@server_ip
- username — это имя пользователя на удаленном сервере
- server_ip — это IP-адрес сервера.
Использование файла конфигурации SSH
Хотя многие знакомы с файлом sshd_config
, есть ещё файл конфигурации клиента для команды ssh
. расположение по умолчанию ~/.ssh/config
, откроем его на редактирование:
nano ~/.ssh/config
Введем следующие данные:
# Alias для подключения
Host myserver
# FQDN-имя или IP-адрес сервера
HostName myserver.com
# Имя юзера на сервера
User user
# Порт для подключения
Port 2222
# Идентификационный файл
IdentityFile /home/user/.ssh/myserver_rsa
В приведённом выше файле конфигурации ssh мы задали для хоста myserver параметры для подключения. Теперь чтобы подключиться к серверу достаточно набрать следующее:
ssh myserver
Данный файл конфигурации может сэкономить много времени на ввод параметров для подключения, позволяя автоматически применять продвинутую конфигурацию к конкретным хостам.
Копирование файлов по SSH
SSH-клиент поставляется с двумя очень удобными инструментами для копирования файлов по зашифрованному ssh-соединению. Обратите внимание, что многие параметры для ssh применяются и в этих командах. Первая команда для копирования файлов по SSH это команда scp
.
scp /home/user/download/myfile.txt user@myserver:/media/share/user/
В этом примере файл myfile.txt
расположенный в директории /home/user/download
скопирован на хост myserver в директорию /media/share/user
.
А вот пример с использованием нестандартного порта для подключения:
scp -P 2222 /home/user/download/myfile.txt user@myserver:/media/share/user/
Если необходимо ещё указать идентификационный файл, то команда примет вид:
scp -i /home/user/.ssh/myserver_rsa -P 2222 /home/user/download/myfile.txt user@myserver:/media/share/user/
Вторая команда для копирования файлов по SSH это команда sftp
. Для тех, кто знаком с консольным ftp
, многие из команд похожи и в sftp
. Вы можете сделать push
, put
и ls
.
sftp user@myserver
Указываем порт и идентификационный файл:
sftp -P 222 -i ~/.ssh/myserver_rsa user@myserver
SSH socks-прокси сервер и динамическая переадресация портов.
SSH socks-proxy server и dynamic port forwarding — это способы обхода блокировок и ограничений на доступ к ресурсам в интернете. Они позволяют обойти ограничения доступа к сайтам, которые могут быть заблокированы провайдером интернета или правительством.
Socks-proxy server — это сервер, который находится за пределами зоны блокировок и перенаправляет запросы на нужные ресурсы через него. Для использования socks-proxy сервера нужно настроить его на локальном компьютере или на VPS-хостинге. Затем нужно настроить SSH-туннель на своем устройстве и указать socks-сервер в качестве прокси.
Dynamic port forwarding — это технология, которая позволяет динамически перенаправлять порты на локальном устройстве. Она работает на основе технологии SSH и позволяет обойти блокировки на уровне портов. Для использования dynamic port forwarding нужно настроить SSH на своем устройстве, а затем использовать специальные команды для перенаправления портов на нужный ресурс.
Оба метода имеют свои преимущества и недостатки, поэтому выбор зависит от конкретной ситуации и целей использования.
Активация socks-прокси через терминал
Клиент ssh может туннелировать трафик через прокси-сервер SOCKS одной простой командой.
ssh -D 8888 user@myserver
Проверим запустился ли наш Socks порт:
netstat -pan | grep 8888
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 2564/ssh
tcp6 0 0 ::1:8888 :::* LISTEN 2564/ssh
Из вывода мы видим что socks-прокси запустился на TCP-порту 8888
, 127.0.0.1
указывает, что служба работает только на localhost
. Мы можем применить немного другую команду для прослушивания всех интерфейсов, включая ethernet и wifi, это позволит другим приложениям (браузерам и т д.) в нашей сети подключаться к прокси-сервису через ssh socks-прокси.
ssh -D 0.0.0.0:8888 user@myserver
Активация socks-прокси в Firefox
Теперь можем настроить браузер для подключения к socks-прокси. В Firefox выберите Настройки | Основные | Параметры соединения. Укажите IP-адрес и порт для подключения.
Обратите внимание на опцию в нижней части формы, чтобы DNS-запросы браузера тоже шли через прокси SOCKS. Если используете прокси-сервер для шифрования веб-трафика в локальной сети, то наверняка захотите выбрать эту опцию.
Активация socks-прокси в Chrome
Запуск Chrome с определёнными параметрами командной строки активирует socks-прокси, а также туннелирование DNS-запросов из браузера. Доверяй, но проверяй. Используйте tcpdump для проверки, что DNS-запросы больше не видны. Для запуска в терминале набираем:
google-chrome --proxy-server="socks5://127.0.0.1:8888"
Туннель SSH (переадресация портов)
Для переадресации локального порта используется ключ -L
. Общий синтаксис команды таков:
ssh -L local_ip:local_port:remote_ip:remote_port user@hostname.com
Проброс удаленного порта на локальную машину
SSH-туннель просто открывает порт в вашей локальной системе, который подключается к другому порту на другом конце туннеля.
ssh -L 4444:127.0.0.1:80 user@myserver
В примере выше мы с удаленного хоста и его локального адреса 127.0.0.1
и порта 80
, пробрасываем туннель на наш localhost
на порт 4444
.
Далее в примере порты прослушивания связываются с другими узлами локальной сети.
ssh -L 0.0.0.0:8080:127.0.0.1:80 user@myserver
Здесь мы подключаемся к порту 80
на удаленном веб-сервере и пробрасываем его на все наши адреса на порт 8080
.
SSH-туннель на сторонний хост
Мы можем использовать те же параметры для подключения туннеля с удалённого сервера к другой службе, запущенной на третьей системе.
ssh -L 0.0.0.0:8080:10.10.10.10:80 user@myserver
Здесь мы пробрасываем туннель к веб-серверу, работающему на 10.10.10.10:80
через myserver
(10.10.10.10
находится за myserver
) на нашу локальную машину на все адреса по порту 8080
. Веб-сервер на 10.10.10.10
будет считать myserver
источником веб-запросов.
Обратный SSH-туннель
Общий синтаксис команды выглядит так:
ssh -R remote_port:local_ip:local_port user@hostname.ru
Здесь настроим прослушивающий порт на удалённом сервере, который будет подключаться обратно к локальному порту на нашем localhost
(или другой системе).
ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.0.2 user@myserver
В этой SSH-сессии устанавливается соединение с порта 1999
на myserver к порту 902
на нашем локальном клиенте.
Проброс локального порта на удаленную машину
ssh -R 8081:10.10.10.10:80 user@myserver
После ввода данной команды на удаленном хосте myserver будет доступ до веб-сервера 10.10.10.10:80
по адресу http://localhost:8081
.
Обратный прокси SSH
В этом случае мы устанавливаем socks-прокси на нашем ssh-соединении, однако прокси слушает на удалённом конце сервера. Подключения к этому удалённому прокси теперь появляются из туннеля как трафик с нашего localhost
.
ssh -v -R 0.0.0.0:1999 192.168.1.100 user@myserver
Создание постоянного туннеля (AUTOSSH)
Для создания туннеля, который будет активен постоянно используется так называемая утилита аutossh
. Единственно требование это необходимость настройки между двумя системами аутентификацию по публичным ключам, чтобы не получать запросы на ввод пароля при каждом обрыве и восстановлении соединения.
Установка autossh
По умолчанию, autossh
не установлен в системе. Чтобы установить эту утилиту введем команду ниже.
sudo apt install autossh
Создание конфигурационного файла
Host myserver.ru
IdentityFile /home/myuser/.ssh/ssh_id
LocalForward 8080 127.0.0.1:80
- Host — имя хоста, к которому мы хотим подключиться (
myserver.ru
в нашем случае) - IdentityFile — путь к нашему SSH-ключу
- LocalForward — номер порта, на который мы будем перенаправлять трафик. В данном случае мы перенаправляем трафик с порта
8080
удаленного хостаmyserver.ru
на локальный адрес127.0.0.1
и порт80
соответственно.
autossh -M 0 -f -N ~/autossh_config
- -M 0 — указывает, что мы не хотим использовать буфер памяти для хранения открытого соединения.
- -f — запускает
autossh
в фоновом режиме. - -N — указывает, что соединение должно быть установлено в режиме “не-сессий”. Это означает, что соединение устанавливается только для выполнения команд, а не для интерактивного взаимодействия с удаленной системой.
- ~/autossh_config — указывает, где находится конфигурационный файл для
autossh
Пример туннеля autossh
Для запуска туннеля давайте наберем такую команду:
autossh -f -N -L 0.0.0.0:8080:10.10.10.10:80 user@myserver
Здесь мы пробрасываем туннель к веб-серверу, работающему на 10.10.10.10:80
через myserver (10.10.10.10
находится за myserver) на нашу локальную машину на все адреса по порту 8080
. Веб-сервер на 10.10.10.10
будет считать myserver источником веб-запросов.
Копирование ключа SSH (ssh-copy-id)
Тут есть несколько способов, но эта команда экономит время, чтобы не копировать файлы вручную. Она просто копирует ~/.ssh/id_rsa.pub
(или ключ по умолчанию) с вашей системы в ~/.ssh/authorized_keys
на удалённом сервере.
ssh-copy-id user@myserver
Удалённое выполнение команд (неинтерактивно)
Команду ssh можно связать с другими командам для обычного удобного интерфейса. Просто добавьте команду, которую хотите запустить на удалённом хосте, в качестве последнего параметра в кавычках.
ssh myserver "cat /var/log/nginx/access.log" | grep badstuff.php
В данном примере grep
выполняется на локальной системе после того, как лог скачался по ssh-каналу. Если файл большой, удобнее запустить grep
на удалённой стороне, просто заключив обе команды в двойные кавычки.
Удалённый перехват пакетов и просмотр в Wireshark
Используем команду ниже для удалённого перехвата пакетов с выдачей результата непосредственно в GUI локального Wireshark.
ssh root@myserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -
Копирование локальной папки на удалённый сервер по SSH
Красивый трюк, который сжимает папку с помощью bzip2
(это параметр -j
в команде tar
), а затем извлекает поток bzip2
на другой стороне, создавая на удалённом сервере дубликат папки.
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
Удалённые приложения GUI с переадресацией SSH X11
Если на клиенте и удалённом сервере установлены «иксы», то можно удалённо выполнить команду GUI, с окном на вашем локальном рабочем столе. Эта функция существует давным давно, но по-прежнему очень полезна. Запустите удалённый веб-браузер или даже консоль VMWawre Workstation, как я делаю в этом примере.
ssh -X user@myserver vmware
Требуется строка X11Forwarding yes
в файле sshd_config
.
Удалённое копирование файлов с помощью rsync и SSH
rsync
во многом удобнее scp
, если требуется периодическое резервное копирование каталога, большого количества файлов или очень больших файлов. Здесь есть функция восстановления после сбоя передачи и копирования только изменённых файлов, что сохраняет трафик и время.
В этом примере используется сжатие gzip
(-z
) и режим архивирования (-a
), который включает рекурсивное копирование.
rsync -az /home/testuser/data myserver:backup/
SSH через сеть Tor
Анонимная сеть Tor может туннелировать SSH-трафик с помощью команды torsocks
. Следующая команда прокинет ssh-прокси через Tor.
torsocks ssh user@myserver
Torsocks будет использовать для прокси порт 9050 на localhost. Как всегда при использовании Tor необходимо серьёзно проверять, какой трафик туннелируется и другие проблемы операционной безопасности (opsec) куда идут ваши DNS-запросы.
Редактирование текстовых файлов с помощью vim через ssh/scp
Для всех любителей vim
этот совет сэкономит немного времени. С помощью vim
файлы редактируются по scp одной командой. Этот метод просто создаёт файл локально в /tmp
, а затем копирует его обратно, как только мы его сохранили из vim
.
vim scp://user@myserver//etc/hosts
Примечание: формат немного отличается от обычного
scp
. После хоста у нас двойной//
. Это ссылка на абсолютный путь. Один слэш будет означать путь относительно домашней папкиusers
.
Монтирование удалённой директории через SSH с SSHFS
SSHFS (SSH Filesystem) – это клиент файловой системы на основе fuse
для монтирования удаленных каталогов по SSH-соединению. SSHFS использует протокол SFTP
, который является подсистемой SSH и включен по умолчанию на большинстве серверов SSH.
При помощи sshfs
мы можем подключить локальный каталог к удалённому серверу со всеми взаимодействиями файлов в зашифрованном сеансе ssh
.
Установка sshfs
На Ubuntu и Debian установим пакет sshfs
sudo apt install sshfs
Монтирования при помощи sshfs
Примонтируем удалённый каталог к нашей системе.
sshfs user@myserver:/media/data ~/data/
- /media/data — директория на удаленном сервере
myserver
. - ~/data/ — директория в домашнем каталоге пользователя.
Чтобы смонтировать удаленный каталог через /etc/fstab
, используйте fuse.sshfs
в качестве типа файловой системы.
sudo nano /etc/fstab
root@myserver:/media/data /home/myuser/data/ fuse.sshfs defaults 0 0
Другой пример с дополнительными опциями:
user@myserver:/media/data /home/myuser/data/ fuse.sshfs defaults,idmap=user,allow_other,reconnect,_netdev,users,port=2222,IdentityFile=/home/myuser/.ssh/id_rsa,allow_other,reconnect 0 0
Размонтирование директории
Размонтировать директорию можно командой:
fusermount -u /home/myuser/data/
Мультиплексирование 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
.
Потоковое видео по SSH с помощью VLC и SFTP
Даже давние пользователи ssh
и vlc
(Video Lan Client) не всегда знают об этой удобной опции, когда очень нужно посмотреть видео по сети. В настройках File | Open Network Stream программы vlc
можно ввести местоположение как sftp://myserver
. Если требуется пароль, появится запрос.
sftp://myserver//media/uploads/myvideo.mkv
Прыжки по хостам с ssh и -J
Если из-за сегментации сети приходится переходить через несколько хостов ssh, чтобы добраться до конечной сети назначения, вам сэкономит время ярлык -J.
ssh -J host1,host2,host3 myuser@myserver
Здесь главное понимать, что это не аналогично команде ssh host1
, затем ssh host2
и т. д. Параметр -J хитро использует переадресацию, чтобы localhost
устанавливал сеанс со следующим хостом в цепочке. Таким образом, в приведённом выше примере наш localhost
аутентифицируется на host4
. То есть используются наши ключи localhost
, а сеанс от localhost
до host4
полностью зашифрован.
Для такой возможности в ssh_config
укажите опцию конфигурации ProxyJump
. Если регулярно приходится переходить через несколько хостов, то автоматизация через конфиг сэкономит массу времени.
Блокировка попыток брутфорса SSH с помощью iptables
Любой, кто управлял сервисом SSH и просматривал логи, знает о количестве попыток брутфорса, которые происходят каждый час каждый день. Быстрый способ уменьшить шум в логах — перенести SSH на нестандартный порт. Внесите изменения в файл sshd_config
с помощью параметра конфигурации Port
.
С помощью iptables
тоже можно легко блокировать попытки подключения к порту по достижении определённого порога. Простой способ сделать это — использовать OSSEC
, поскольку он не только блокирует SSH, но выполняет кучу других мер по обнаружению вторжений на базе имени хоста (HIDS).
Завершение
Эти примеры, советы и команды ssh
должны дать отправную точку; дополнительная информация о каждой из команд и возможностей доступна на справочных страницах (man ssh
, man ssh_config
, man sshd_config
).
[endtxt]
. . . .
- Тест скорости дисков в Linux
- Как запустить команду в фоне в Linux
- Ошибка несоответствие размеров GPT PMBR
- nginx: [warn] protocol options redefined
- Как включить поддержку linux в windows 11