множественные подключения
OpenSSH способен обслуживать множество одновременных соединений с одной и той же машиной.
Обычно пользователи просто запускают команду и ждут ее завершения, чтобы запустить следующую.
К счастью, эту проблему легко обойти путем разделения одного соединения на множество сессий.
Просто добавь в конфиг ssh (~/.ssh/config) следующие строки:
ControlMaster auto
ControlPath ~/.ssh/mux_%h_%p_%r
Ты сможешь создать столько соединений с одним и тем же сервером, сколько посчитаешь нужным,
причем время на повторную аутентификацию тратить будет не нужно.
проксирование соединений
Допустим, ты не можешь создать соединение с SSH-сервером напрямую, но можешь использовать для этого другой хост, к которому ты тоже имеешь SSH-доступ.
Добавь в свой конфиг следующие строки:
ForwardAgent yes
Host host
HostName host.com
ProxyCommand ssh proxy-host.com \
netcat -q 600 %h %p
Команда ssh host создаст соединение с сервером host.com через сервер proxy-host.com.
выход за пределы HTTP-изоляции
Трюк номер три — . Многие организации не просто режут неугодный им трафик, но и принуж дают пользователей выходить в Сеть только с использованием HTTP-протокола.
Такую несправедливость легко обойти с помощью сorkscrew (http://www.agroman.net/corkscrew/), который умеет туннелировать SSH-трафик через HTTP.
Просто установи его на свою машину и добавь в конфиг следующие строки (где proxy.com и 80 — это адрес внешнего HTTP-прокси и его порт):
Host *
ProxyCommand corkscrew proxy.com 80 %h %p
Теперь все соединения пойдут через указанный HTTP-прокси.
тест пропускной способности сети
Чтобы протестировать скорость соединения, необязательно устанавливать специализированное ПО, достаточно утилиты pv и старого доброго SSH:
$ sudo apt-get install pv
$ yes | pv | ssh host.com "cat > /dev/null"
удаленный анализ сетевого трафика
Почтив любой UNIX-системе есть сетевой сниффер tcpdump, однако читать его логи довольно утомительно.
Возможности OpenSSH помогут упростить анализ трафика:
$ ssh root@host.com tcpdump -w – 'port !22' | wireshark -k -i -
Теперь весь трафик, проходящий через host.com, будет виден в графическом окне wireshark на твоей машине.
передача файлов на низкой скорости
Иногда бывает необходимо передать большое количество файлов на удаленную машину, но сделать это так, чтобы процесс не мешал работе с сетью.
В этом случае можно воспользоваться инструментом cstream:
$ sudo apt-get install cstream
$ tar -cj /backup | cstream -t 512k | ssh host 'tar -xj -C /backup'
всегда открытая SSH-сессия
Пользователям ноутбуков, чье соединение с сетью может быть не постоянным, приходится каждый раз заново запускать SSH-клиент в момент, когда сеть появляется, и убивать его при потере соединения.
Избежать этого можно с помощью инструмента autossh, который будет поддерживать иллюзию постоянного соединения с сервером, восстанавливая связь, когда сеть окажется доступной:
$ sudo apt-get install autossh
$ autossh -M50000 -t server.example.com \
'screen -raAd mysession'
запуск команды на нескольких серверах одновременно
Комментарии излишни:
$ echo "uptime" | pee "ssh host1" "ssh host2" \
"ssh host3"
удаленное сравнение файлов
Часто требуется сравнить локальную и удаленную версию какого-либо конфига, однако копировать файлы туда-сюда неудобно и долго.
В этом случае можно воспользоваться следующей командой:
$ ssh user@host cat /путь/к/удаленному/файлу | diff /путь/к/локальному/файлу -
То же самое можно проделать для двух файлов, находящихся на разных серверах:
$ diff <(ssh host1 cat /etc/apt/sources.list) < (ssh host2 cat /etc/apt/sources.list)
одновременный просмотр логов с несколькихмашин
С помощью multitail и SSH можно запросто просматривать логи с двух серверов одновременно:
$ sudo apt-get install multitail
$ multitail -l 'ssh host1 "tail -f \
/var/log/apache2/error.log"' -l 'ssh host2 \
"tail -f /var/log/apache2/error.log"'
копирование файлов с одной удаленной машины на другую через локальную
В случае если две удаленные машины не могут установить связь друг с другом, файлы между ними можно передавать,
используя свой комп в качестве промежуточного звена:
$ ssh root@host1 "cd /каталог && tar -cf – ." |\
ssh root@host2 "cd /каталог && tar -xf -"
копирование вывода удаленной команды в буфер обмена
Часто требуется скопировать вывод удаленной команды в буфер обмена, чтобы вставить его в письмо, сообщение форума и т. д.
Проще всего это сделать с помощью утилиты xclip:
$ ssh user@host cat /файл.txt | xclip
синхронизация времени средствами SSH
В случае, если машина не имеет доступа к NTP-серверу или на ней не установлен NTP-клиент, синхронизировать время между машинами можно так:
# date --set="$(ssh user@server date)"
установка пакетов удаленной машины на локальную
Нередко требуется синхронизировать две машины так, чтобы они имели одинаковый набор установленных пакетов.
Стандартными методами сделать это сложно, но с помощью SSH проще простого:
# ssh remotehost 'dpkg --get-selections' | dpkg --set-selections && dselect install
снимок удаленного экрана
Можно очень легко получить изображение X-сервера с удаленной машины, воспользовавшись стандартным графическим пакетом ImageMagick:
# ssh user@host "DISPLAY=:0.0 import -window \
root -format png -" | display -format png -
Чтобы сохранить его в файле, последнюю команду следует заменить на «> file.png».
ускорение передачи данных
Если машины,с которыми установлено соединение, находятся внутри заведомо безопасной сети (например, офис или дом),
передачу данных средствами SSH можно несколько ускорить, если использовать менее стойкий алгоритм шифрования.
Для этого добавь в конфигурационный файл следующие строки:
Host host.com
Ciphers arcfour256
MACs umac-64@openssh.com
вывод звука с удаленной машины на локальную
Вместе с картинкой рабочего стола удаленной машины иногда хочется получить и звук.
Это делается с помощью банального dd:
$ dd if=/dev/dsp | ssh -c arcfour -C \
user@host dd of=/dev/dsp
запуск локального скрипта на удаленной машине
Нередко требуется запустить скрипт на удаленной машине, однако копировать его туда совсем необязательно, достаточно выполнить следующую простую команду:
$ ssh -T user@host < script.sh
OPENSSL
OpenSSL представляет собой систему защиты и сертификации данных, которая была разработана в ответ на создание протокола безопасных сокетов SSL компанией Netscape.
Вопреки расхожему мнению, OpenSSL вовсе не является инструментом для реализации SSL-протокола и может выполнять множество самых разнообразных функций,
в том числе управлять ключами и сертификатами, рассчитывать хеши и т.д.
Вот лишь неполный список возможностей этого криптографического комбайна:
• создание ключей RSA и DSA и управление ими (команды rsa, dsa, dsaparam);
• создание сертификатов формата x509, формирование запросов на сертификацию, восстановление (команды x509, req, verify, ca, crl, pks12, pks7);
• симметричное и асимметричное шифрование данных (команды enc, rsautl);
• расчет хешей (команда dgst);
• работа с S/MIME (команда s/mime).
Также OpenSSL может быть использован для проверки SSL-серверов и клиентов с помощью специальных команд s_client/s_server и для тестирования скорости работы различных алгоритмов (команда speed).
Мы не раз писали о работе с пакетом OpenSSL, поэтому не будем рассматривать стандартные примеры его использования вроде создания хешей и сертификатов, а сразу перейдем к более серьезным трюкам.
openssl бенчмарк
Одна из интересных особенностей OpenSSL заключается в том, что он может провести бенчмарк используемых алгоритмов и скоростиустановления SSL-соединения.
Для этого предназначена стандартная команда s_time.
Чтобы оценить скорость установки SSL-соединения, нужно применить ее к команде openssl:
$ openssl s_time -connect gmail.com:443 -www /test.html -new
103 connections in 0.75s; 137.33 connections/user sec,bytes read 42436
103 connections in 31 real seconds, 412 bytes read perconnection
То же самое можно проделать с помощью наиболее стойкихалгоритмов:
$ openssl s_time -ssl3 -cipher HIGH -connect gmail.com:443 -www / -new
99 connections in 0.73s; 135.62 connections/user sec,bytes read 40788
99 connections in 31 real seconds, 412 bytes read perconnection
Эти две команды позволяют определить максимальную пропускную способность SSL-сервера.
Но еще более интересный способ заключается в тестировании всех поддерживаемых алгоритмов.
Для этого нам придется прибегнуть к скриптингу:
IFS=":"
for c in $(openssl ciphers -ssl3 RSA); do
echo $c
openssl s_time -connect host:443 -www / -new -time 10 -cipher $c 2>&1 | grep bytes
echo
done
Такая команда позволяет измерить скорость установки SSL-соединения с помощью различных алгоритмов шифрования, что можно использовать, например, для тюнинга SSL-сервера.
Если же SSL-сервера как такового еще нет, его легко эмулировать с помощью самого OpenSSL.
На серверной машине запускаем OpenSSL-сервер:
$ openssl s_server -cert mycert.pem -www
На клиентской выполняем следующую команду:
$ openssl s_time -connect myhost:4433 -www / -new -ssl3
openssl подключение к удаленным серверам
Еще одна интересная команда OpenSSL — это s_client, которая позволяет коннектиться к удаленным SSL-серверам для их тестирования.
Чаще всего я использую эту команду, чтобы проверить дату выдачи сертификата.
Для этого следует просто подключиться к удаленному SSL-серверу, дождаться, покана экране появится информация о сертификате, а затем прогнать его через всё тот же openssl, чтобы вычленить даты.
При использовании одной команды всё это выглядит так:
$ echo | openssl s_client -connect \
http://www.google.com:443 2>/dev/null | \
openssl x509 -dates -noout
notBefore=Oct 26 00:00:00 2011 GMT
notAfter=Sep 30 23:59:59 2013 GMT
Команду s_client можно также применять для тестирования сервера на уязвимость, заключающуюся в использовании нестойких алгоритмов шифрования:
$ openssl s_client -connect http://www.google.com:443 -cipher LOW
CONNECTED(00000003)
140513251690152:error:14077410:SSL routines:SSL23_
GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:658:
Сервер, не поддерживающий нестойкие алгоритмы шифрования, просто откажется устанавливать соединение, как это и произошло в случае с сервером Google.
Команда s_client также довольно удобна для отладки различных протоколов (в этом случае она выступает в виде SSL’ного Telnet).
Например:
$ openssl s_client -starttls smtp -crlf \
-connect smtp.gmail.com:25
openssl шифрование
О шифровании с помощью OpenSSL не писал только ленивый, поэтому мы остановимся не на самих принципах шифрования, а на том, как его можно использовать для вспомогательных задач.
Утилита командной строки openssl удобна тем, что она, как и все остальные команды UNIX, может принимать данные на вход и имеет для них стандартный выход.
В результате с помощью одной простой команды можно обеспечить, например, защищенную передачу файла по сети:
отправляющий$ cat /etc/passwd | openssl \
aes-256-cbc -a -e -pass pass:пароль | \
netcat -l -p 8080
принимающий$ netcat хост:8080 | openssl \
aes-256-cbc -a -d -pass pass:пароль > passwd
Можно также применять и различные скрипты, чтобы автоматизировать шифрование множества файлов (пароль в /tmp/passwd):
$ for f in * ; do [ -f $f ] && \
openssl enc -aes-256-cbc -salt -in $f \
-out $f.enc -pass fi le:/tmp/passwd ; done
Для расшифровки отдельно взятых файлов используем следующую команду:
$ openssl enc -d -aes-256-cbc -salt \
-in файл.enc -out fi lename \
-pass fi le:/path/to/passwd
Для шифрования целого каталога проще, конечно, воспользоваться такой конструкцией:
$ tar c каталог | openssl enc -aes-256-cbc -e \
> secret.tar.enc
OpenSSL удобно использовать для генерирования паролей:
$ openssl rand 8 -base64
O0Hqtv9l0sY=
А сгенерировать хеш для записи в /etc/passwd можно так:
# openssl passwd -1 my-secret-pass
$1$WA7AVhQL$y9VaGwseiKRLSGoJg21TP0
Кстати, кодирование в base64 может пригодиться для отправки файлов, если двоичная передача данных не поддерживается:
$ tar -c каталог | gzip -9 | openssl enc \
-base64 > text-message.txt
Возможность генерирования случайных данных можно использовать для создания фиктивных MAC-адресов:
$ openssl rand -hex 6 | \
sed 's/\(..\)/\1:/g; s/.$//'
f2:9e:56:fd:5a:93
Примеры в файле .ssh/config
Использование ProxyJump
Использование ProxyJump
Host remotehost
HostName remote.example.com
User remoteuser
ProxyJump jumphost
Переадресация порта
Host jumpbox
HostName jump.example.com
User jumpuser
LocalForward 8080 localhost:80
Автоматическое выполнение команды при подключении
Host autoscript
HostName remote.example.com
User username
IdentityFile ~/.ssh/id_rsa
RemoteCommand /path/to/program
RequestTTY yes