Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Both sides previous revision Попередня ревізія Наступна ревізія | Попередня ревізія | ||
ssh [2014/03/14 11:43] wombat [SSH-тоннель] Обратный SSH-тоннель |
ssh [2015/11/18 20:11] (поточний) wombat Проблемы: diffie-hellman-group1-sha1 |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
+ | ====== Сервер ====== | ||
+ | Если к серверу необходимо подключаться с компьютеров, находящихся в сети с жёсткими ограничениями (вплоть до закрытия всех портов, кроме HTTP (80) и HTTPS (443), можно настроить SSH-демон на прослушивание порта 443: | ||
+ | |||
+ | <file txt /etc/ssh/sshd_config> | ||
+ | Port 22 | ||
+ | Port 443 | ||
+ | </file> | ||
+ | |||
+ | Однако, этот способ не годится, если параллельно должен работать веб-сервер, выдающий страницы по протоколу HTTPS. В таком случае можно воспользоваться одним из приведённых ниже способов. | ||
+ | ===== SSH через HTTPS ===== | ||
+ | |||
+ | Один из способов - настроить веб-сервер на передачу SSH-трафика (определяемого по какому-либо критерию; например, по заданному URL или доменному имени) SSH-демону, работающему на каком-то другом порту. | ||
+ | |||
+ | [[http://blog.chmd.fr/ssh-over-ssl-episode-3-avoiding-using-a-patched-apache.html | SSH over SSL, episode 3: Avoiding using a patched apache.]] | ||
+ | |||
+ | [[http://dag.wieers.com/howto/ssh-http-tunneling/ | Tunneling SSH over HTTP(S)]] | ||
+ | |||
+ | К сожалению, в настоящее время (осень 2013) только Apache поддерживает метод "CONNECT", необходимый для этой цели. | ||
+ | |||
+ | |||
+ | ===== Несколько сервисов на 443 порту ===== | ||
+ | |||
+ | Можно воспользоваться мультиплексором протоколов [[sslh | sslh]], который слушает порт 443 и сортирует входящий трафик по соответствующим сервисам далее (SSH, веб-сервер, ...) | ||
+ | ===== Web SSH ===== | ||
+ | |||
+ | https://en.wikipedia.org/wiki/Web-based_SSH | ||
+ | |||
+ | [[http://anyterm.org/ | AnyTerm]] in C | ||
+ | |||
+ | [[http://code.google.com/p/shellinabox/wiki/shellinaboxd_man | Shell in a box]] | ||
+ | |||
+ | [[https://github.com/fgallaire/achilterm | Achilterm]] in Python | ||
+ | |||
+ | ===== Перенаправление портов ===== | ||
+ | |||
+ | Чтобы разрешить клиентам перенаправлять подключения к некоторым портам сервера на свои локальные компьютеры, нужно в файле //''/etc/ssh/sshd_config''// разрешить параметр ''GatewayPorts''. Согласно [[http://linux.die.net/man/5/sshd_config | man sshd_config]], этот параметр может иметь три значения: ''no'', ''yes'' и ''clientspecified''. Будем использовать последнее, т.к. оно позволяет клиенту самостоятельно выбрать, разрешать внешним компьютерам использование обратного тоннеля или нет. | ||
+ | |||
+ | <file txt /etc/ssh/sshd_config> | ||
+ | GatewayPorts clientspecified | ||
+ | </file> | ||
+ | |||
+ | |||
+ | ====== Клиент ====== | ||
+ | |||
+ | ===== TCP-тоннель ===== | ||
+ | |||
+ | Необходимо установить программу, создающую TCP-тоннель через прокси-сервер. Например, ''corkscrew''. После этого отредактировать пользовательский файл настроек SSH следующим образом: | ||
+ | |||
+ | <file txt ~/.ssh/config> | ||
+ | Host * | ||
+ | ProxyCommand corkscrew <proxy_server> <proxy_port> %h %p | ||
+ | </file> | ||
+ | |||
+ | Если прокси-сервер требует логина и пароля, то конфигурация SSH-клиента должна выглядеть следующим образом: | ||
+ | |||
+ | <file txt ~/.ssh/config> | ||
+ | Host * | ||
+ | ProxyCommand corkscrew <username:password@proxy_server> <proxy_port> %h %p | ||
+ | </file> | ||
+ | |||
+ | Или так? FIXME | ||
+ | |||
+ | Создаём файл, содержащий имя пользователя и пароль для доступа к прокси-серверу: | ||
+ | |||
+ | <file txt ~/.corkscrew-auth> | ||
+ | username:password | ||
+ | </file> | ||
+ | |||
+ | Затем добавляем путь к этому файлу в файл конфигурации SSH: | ||
+ | |||
+ | <file txt ~/.ssh/config> | ||
+ | Host * | ||
+ | ProxyCommand corkscrew <proxy_server> <proxy_port> %h %p /home/username/.corkscrew-auth | ||
+ | </file> | ||
+ | |||
+ | |||
+ | ===== SSH-тоннель ===== | ||
+ | |||
+ | ssh -f -N -L<local_port>:jabber.od.ua:5222 -p <ssh_server_port> <ssh_server> | ||
+ | |||
+ | ''-f'' уйти в фон | ||
+ | |||
+ | ''-N'' не выполнять никаких команд | ||
+ | |||
+ | ===== Обратный SSH-тоннель ===== | ||
+ | |||
+ | Обратный SSH-тоннель позволяет перенаправлять соединения, устанавливаемые с некоторым портом удалённого сервера, на наш локальный компьютер((рецепт взят с http://www.howtoforge.com/reverse-ssh-tunneling)) | ||
+ | |||
+ | ssh -R 19999:localhost:22 -p <ssh_server_port> <ssh_server_user>@<ssh_server> | ||
+ | |||
+ | после чего станет возможным с удалённого сервера (<ssh_server>) подключаться к локальному компьютеру до тех пор, пока живо вышеустановленное соединение. | ||
+ | |||
+ | ssh localhost -p 19999 | ||
+ | |||
+ | По умолчанию ssh перенаправляет подключения только к локальному сетевому интерфейсу удалённого сервера (его localhost). Это означает, что подключения извне на этом удалённом сервере в указанный порт не принимаются. Если же неообходимо разрешить перенаправление соединений к нашему локальному компьютеру не только непосредственно из консоли удалённого сервера, но и для любых других компьютеров глобальной сети, то устанавливать обратный тоннель следует так: | ||
+ | |||
+ | ssh -R *:19999:localhost:22 -p <ssh_server_port> <ssh_server_user>@<ssh_server> | ||
+ | |||
+ | Здесь звёздочка (''*'') указывает, что "слушать" удалённому серверу надо на всех его сетевых интерфейсов. Вместо неё можно указать и конкретный IP-адрес, на котором слушать. Тогда сервер будет принимать подключения только на указанном сетевом интерфейсе. | ||
+ | |||
+ | Следует отметить, что для реализации последнего варианта необходимо [[ssh#Перенаправление портов|разрешить на сервере параметр ''GatewayPorts'']]. | ||
+ | |||
+ | Теперь любое подключение к серверу <ssh_server> в порт ''19999'' будет перенаправлено на наш локальный компьютер в порт ''22''. Разумеется, номера портов можно менять на любые другие. С тем только исключением, что привелегированные порты использовать может только администратор системы (root). | ||
+ | |||
+ | ===== Подключение по ключу ===== | ||
+ | |||
+ | Для того, чтобы подключаться без пароля, нужно сгенерировать ключ: | ||
+ | |||
+ | ==== OpenSSH ==== | ||
+ | |||
+ | ssh-keygen -t rsa -b 2048 -f id_rsa.key | ||
+ | |||
+ | В результате появятся два файла: секретный ключ -- ''id_rsa.key'' и открытый ключ -- ''id_rsa.key.pub''. Первый из них необходимо оставить на компьютере-клиенте и сделать доступ к нему для посторонних невозможным (поместить в каталог ''/home/taras/.ssh/''). Второй -- открытый -- ключ нужно поместить на сервер в домашний каталог того пользователя, от имени которого будет осуществляться подключение к серверу (**до**писать к файлу ''/home/taras/.ssh/authorized_keys'') | ||
+ | |||
+ | Подключаться с использованием этого ключа следует так: | ||
+ | |||
+ | ssh -i .ssh/id_rsa taras@server.org.ua | ||
+ | |||
+ | ==== Dropbear ==== | ||
+ | |||
+ | dropbearkey -t rsa -s 2048 -f id_rsa.key | ||
+ | |||
+ | В результате закрытый ключ будет записан в файл ''id_rsa.key'', а на экран будут выведены открытый ключ и отпечаток ("fingerprint"): | ||
+ | |||
+ | <file> | ||
+ | Public key portion is: | ||
+ | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCClbPAs9q4i9WEmtIGX/XOArDa6r40bRei/ta6JZA217ucOhzYOabacasYi7HPDEGYqcs95KL5olnMr5UpELUbCyt1THy0W7e0lWbg10NuKkbq4OZAN3Dw59JHBHizWe+p8fsqKfwHrr1YSR6DxiZeKlEv0QWfckBnp3Xq5Y1cWWeMZlOApZTmmWJIvCMdyQwM4SW18nz9UZBkbypfSsZZYxVcht+EjXdBICHehezqwKQZkKnRa3WdTDKP0zKYA0WEQFK4UekPQYrHGS+4kgLiD7jZUS9Wh88sWMJwPcrfo3HgvcIAWTRzKsoUGimWKUYAfK2eMjxAz0GoQAcFYwu7 root@OpenWrt | ||
+ | Fingerprint: md5 60:3f:47:8e:19:99:94:53:29:83:83:3e:84:c7:dd:09 | ||
+ | </file> | ||
+ | |||
+ | В этом случае также надлежит открытый ключ дописать к файлу ''/home/taras/.ssh/authorized_keys'' на сервере, а закрытый поместить в какой-либо защищённый каталог на компьютере, с которого будет происходить подключение. | ||
+ | |||
+ | Подключаться с использованием этого ключа следует так: | ||
+ | |||
+ | ssh -i id_rsa.key taras@server.org.ua | ||
+ | |||
+ | ===== Проблемы ===== | ||
+ | |||
+ | Если при попытке подключения ssh выдаёт ошибку | ||
+ | |||
+ | Unable to negotiate with example.com: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1 | ||
+ | |||
+ | Это обозначает, что сервер предлагает обмен ключей по алгоритму ''diffie-hellman-group1-sha1'', который не рекомендуется, начиная с версии OpenSSH 7. В общем случае это обозначает, что программа-сервер нуждается в обновлении. Временно можно эту ошибку обойти, если в явном виде разрешить своему ssh-клиенту использовать этот алгоритм. Сделать это можно так: | ||
+ | |||
+ | 'ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 user@server | ||
+ | | ||
+ | |||
+ | ====== Ссылки ====== | ||
+ | |||
+ | [[http://habrahabr.ru/post/81607/ | SSH-туннели — пробрасываем порт]] на Хабрахабре | ||
+ | |||
+ | Викикнига [[http://ru.wikibooks.org/wiki/SSH_%D1%82%D1%83%D0%BD%D0%BD%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 | SSH туннелирование]] |