Прямое SSH туннелирование
Что имеется ввиду под «Прямое SSH туннелирование»? Прямое SSH туннелирование это когда SSH клиент запускается в режиме sock-proxy (опция -D) и соединившись с удалённой машиной по SSH протоколу передает через неё (удалённую машину) TCP трафик, например сессия прямого SSH туннеля с удалённой машиной через консольный SSH клиент (OpenSSH) в Windows:
C:\OpenSSH\bin>ssh -D 4444 -p 28666 [email protected] The authenticity of host 'remotehost.com (96.172.128.114)' cant be establishe d. RSA key fingerprint is 5e:ea:62:5f:fc:3b:b2:38:d6:ba:6b:aa:65:3f:d4:35. Are you sure you want to continue connecting (yesno)? y Please type 'yes' or 'no': yes Warning: Permanently added 'remotehost.com,96.172.128.114' (RSA) to the list o f known hosts. [email protected] password: Last login: Thu Feb 7 03:34:45 2013 from 108.95.46.202 user@remotehost ~$
Запуская SSH клиент с опцией -D 4444 мы повелеваем ему после запуска прослушивать локальный порт 4444 и после подключения к удалённому хосту remotehost.com, на удалённый порт -p 28666 и с именем пользователя user, отправлять наш TCP трафик к месту назначения от своего имени — т.е. от имени remotehost.com с ИП 96.172.128.114.
Настроить SSH-туннелирование в Windows
-
Запустите Putty и введите IP-адрес SSH-сервера в поле .
-
В меню « разверните и выберите « . Установите переключатель для настройки локального, для удаленного и для динамической переадресации портов.
- При настройке локальной переадресации введите локальный порт пересылки в поле « а в поле « введите хост и IP-адрес назначения, например .
- Для перенаправления удаленного порта введите порт перенаправления удаленного SSH-сервера в поле а в поле введите целевой хост и IP-адрес, например .
- При настройке динамической пересылки введите только локальный порт SOCKS в поле .
-
Нажмите кнопку « , как показано на изображении ниже.
-
Вернитесь на страницу чтобы сохранить настройки, чтобы не вводить их каждый раз. Введите имя сеанса в поле « и нажмите кнопку « .
-
Выберите сохраненный сеанс и войдите на удаленный сервер, нажав кнопку « .
Появится новое окно с запросом вашего имени пользователя и пароля. После того, как вы введете свое имя пользователя и пароль, вы войдете на свой сервер, и будет запущен туннель SSH.
Настройка аутентификации с открытым ключом позволяет вам подключаться к вашему серверу без ввода пароля.
Как работает туннелирование
Туннелирование работает путем создания «трубы» или «туннеля» от хоста сервера к клиенту, эффективно экспортируя трафик от хоста к клиенту. По сути, создается ощущение, будто вы сидите прямо перед сервером, используя его подключение к Интернету, а не компьютер, на котором вы находитесь.
Туннель стал возможным благодаря протоколу Secure Shell: SSH. SSH-туннелирование не требует наличия какого-либо домашнего сервера. Это связано с тем, что запуск SSH-сервера, возможно, является одной из самых легких программ. Черт возьми, вы даже могли бы запустить его на мобильном телефоне, если бы у вас была мотивация.
Проброс порта через SSH туннель на порт удалённой машины
В этом случае, после подключения по SSH протоколу с удалённой машиной [email protected], данные с локального порта через SSH туннель удаленной машины будут переданы будут переданы дальше на некий порт некой удалённой машины, например прокси-серверу. Выглядит это примерно так:
ssh -L bind_address:port:host:hostport -p 28666 [email protected]
Аналогично предыдущему примеру с той лишь разницей, что конечной точкой пересылающей/принимающей наш TCP трафик будет не [email protected], а некий host:hostport
Есть также вариант проброса TCP трафик с удалённого порта удалённой машины [email protected] на локальный порт локальной машины или ещё куда-нибудь.
ssh -R bind_address:port:host:hostport -p 28666 [email protected]
Как подключиться по SSH
Для подключения по SSH нам необходимо знать такие данные:
- ip адрес сервера, к которому мы собираемся подключится;
- порт, на котором ожидает подключения SSH сервер, по умолчанию используется 22, но в целях безопасности порт подключения ssh часто изменяют;
- имя и пароль пользователя на удаленном сервере.
Больше ничего не нужно, обычно эти данные присылают в письме вместе с описанием VPS. Теперь перейдем к практике.
1. Подключение через SSH в Linux
В Linux подключение по SSH выполняется с помощью утилиты ssh. Мы более подробно рассматривали работу с ней в статье как пользоваться ssh. Для подключения к удаленному компьютеру ее синтаксис будет выглядеть следующим образом:
$ ssh имя_пользователя@айпи_адрес
Это самый простой вариант, если вам также нужно задать порт, используйте опцию -p:
$ ssh имя_пользователя@айпи_адрес -p порт
Чтобы выполнить подключение по SSH Linux нажмите Ctrl+Alt+T для открытия терминала и наберите команду, заменив нужные значения:
Или, с нестандартным портом:
Если ip_адрес и порт правильные, то на следующем шаге программа попросит у вас ввести пароль:
Если пытаетесь подключится через SSH к этому серверу первый раз, то утилита также попросит подтвердить добавление нового устройства в свой список известных устройств, здесь нужно набрать yes и нажать Enter:
Теперь вы подключены, и все вводимые далее команды будут выполнены на удаленном сервере:
Если же произошла ошибка и IP адрес или порт введены неверно, то вы получите ошибку Connection Refused:
Просто убедитесь что порт введен верно. Если это ваш сервер, то, возможно на нем еще нужно разрешить подключение SSH в брандмауэре. В Ubuntu/Debian для этого на удаленном сервере выполните:
А в CentOS/Fedora:
Если вы используете другой порт для SSH, то замените 22 на свой порт. Для удобства подключения по SSH в дальнейшем можно настроить авторизацию по ключу ssh, чтобы не вводить каждый раз пароль.
Теперь вы знаете как подключиться по ssh linux и решить проблемы с подключением. А теперь перейдем к Windows.
2. Подключение через SSH в Windows
Раньше подключение по SSH из Windows выполнялось только с помощью сторонних утилит, например PuTTY. Но в Windows 10 был добавлен встроенный OpenSSH клиент и работает он точно так же, как и в Linux. По умолчанию этот компонент не активирован. Для его установки откройте Параметры -> Приложения:
Затем выберите Управление дополнительными компонентами:
Здесь нажмите добавить новый компонент и в открывлемся меню выберите OpenSSH Client и нажмите Устанвоить:
Дальше вернитесь назад и дождитесь завершения установки. После того, как SSH клиент будет установлен нужно обязательно перезагрузить компьютер.
После перезагрузки нажмите Win+R чтобы открыть окно запуска команд и наберите в нем cmd:
Далее нажмите Enter. Перед вами откроется командная строка Windows. Здесь можно использовать утилиту ssh. Синтаксис у нее абсолютно такой же, как и для Linux:
ssh имя_пользователя@айпи_адрес -p порт
Например, такой командой можно подключится по SSH к Raspberry Pi, который находится в вашей локальной сети по адресу 192.168.1.5:
Утилита предложит добавить устройство в список известных:
Затем предложит ввести пароль:
Все следующие команды будут выполняться уже на Raspberry Pi или другой удаленной машине, к которой вы подключились.
Теперь подключиться к серверу по ssh из этой операционной системы также просто как и из Linux.
Что можно делать с помощью SSH
Всё, что можно было бы делать, если бы вы сидели за компьютером, открыв командную строку:
- настраивать сервер;
- программировать;
- устанавливать Вордпресс;
- чинить неисправности на сайте;
- запускать и останавливать программы, в том числе намертво зависшие;
- копировать файлы;
- управлять настройками безопасности;
- заставить компьютер перезагрузиться;
- отформатировать какой-нибудь диск;
- забрать файл с удалённого компьютера или закинуть туда свой файл;
- выполнить этот закинутый файл удалённо на другом компьютере;
- делать ещё сотню вещей, для которых достаточно командной строки.
Вот несколько примеров из реальной жизни:
У вас намертво завис процесс веб-сервера на удалённом компьютере, и никакие внутренние службы не могут с ним ничего сделать. Подключаетесь по SSH, находите зависший процесс и убиваете его. А то и говорите машине перезагрузиться.
В офис вашей компании ворвались бойцы в масках. Пока они идут в серверную, вы набираете команду стереть все жёсткие диски. Команда по SSH долетает до сервера, и вуаля. Господа в масках останутся не при делах.
Вы написали телеграм-бота и хотите, чтобы он работал на удалённом сервере. Вы арендуете ячейку на Digital Ocean, подключаетесь к ней по SSH, загружаете вашего бота туда и активируете. Теперь программа, которая отвечает за бота, крутится на удалённом сервере, а ваш компьютер можно безопасно выключить.
Вы уже ушли с работы, как вдруг вспомнили, что забыли скинуть в общий проект свои последние изменения. Пока вы ждёте метро, вы с телефона заходите по SSH на рабочий компьютер и пишете команды, чтобы последние изменения долетели до коллег.
У вашей девушки (или парня) сегодня день рождения. Вы подключаетесь к её компьютеру дистанционно, загружаете приложение с поздравлением и удалённо запускаете. Это очень крипово, не делайте так никогда.
У вас в офисе есть кофемашина, которая поддерживает SSH. Вы подключаетесь к ней и заказываете кофе. К моменту, как вы доходите до кофепойнта, ваш кофе готов. Но кто подставит кружку?
Вопросы ET Réponses
Вопрос: Если SSH-сервер выйдет из строя или если мы случайно отключим ssh-клиент, окажемся ли мы без защиты, не осознавая этого?
Ответ: Нет, потому что Firefox отобразит ошибку о том, что прокси-сервер не отвечает и не сможет загружать какие-либо веб-сайты.
Вопрос: Что безопаснее, это или создать VPN, как в руководстве?
Ответ: VPN, потому что он шифрует абсолютно все, когда вы меняете маршрутизацию оборудования, сначала может показаться тяжелее, но когда у вас настроен VPN, очень удобно дважды щелкнуть и все.
Мы надеемся, что с помощью этого руководства вы сможете безопасно просматривать веб-страницы, создав туннель SSH для вашего NAS, маршрутизатора или другого сервера, на котором у вас есть SSH.
Удаленное перенаправление портов SSH
Удаленная переадресация портов позволяет вам подключиться с удаленного компьютера к локальному компьютеру. По умолчанию SSH не разрешает удаленное перенаправление портов. Вы можете включить это с помощью директивы GatewayPorts в главном файле конфигурации SSHD: /etc/ssh/sshd_config на удаленном хосте.
Откройте файл для редактирования, используя ваш любимый редактор командной строки.
$ sudo vim/etc/ssh/sshd_config
Найдите требуемую директиву, раскомментируйте ее и установите ее значение , как показано на скриншоте.
GatewayPorts yes
Включение удаленного перенаправления портов SSH
Сохраните изменения и выйдите. Затем вам необходимо перезапустить sshd, чтобы применить последнее изменение, которое вы сделали.
$ sudo systemctl restart sshd OR $ sudo service sshd restart
Затем запустите следующую команду для перенаправления порта 5000 на удаленном компьютере на порт 3000 на локальном компьютере.
$ ssh -f -N [email protected] -R 5000:localhost:3000
Как только вы поймете этот метод туннелирования, вы можете легко и безопасно выявить локальный сервер разработки, особенно за NAT и брандмауэрами в Интернете по защищенным туннелям. Аналогичным образом работают туннели, такие как Ngrok, pagekite, localtunnel и многие другие.
Настройка ssh клиента
В Debian настройки клиентской части ssh делятся на глобальные и пользовательские. Глобальные клиентские настройки находятся в файле /etc/ssh/ssh_config и применяются ко всем пользователям. Пользовательские настройки могут находиться в домашнем каталоге пользователя, в ~/.ssh/config и применяются к одному пользователю. Файл пользовательских настроек не создаётся автоматически в отличие от файла глобальных настроек клиентской части ssh. Для большинства выполняемых задач подойдут настройки по умолчанию, но для удобства использования, так сказать для тюнинга или для выполнения нестандартных задач клиентские настройки изменяются. Рассмотрим вкратце некоторые из этих настроек. Полезно помнить о приоритетах настроек: высший приоритет имеют ключи командной строки, затем следуют настройки пользователя, а после них используются глобальные настройки клиентской части.
Параметр Host. Ограничивает множество хостов, к которым применяются последующие (до ближайшей новой директивы Host) директивы, по указанным шаблонам (хост должен соответствовать хотя бы одному шаблону). Шаблон, состоящий из одного символа *, соответствует любому хосту. Под хостом в данном контексте понимается аргумент имя_хоста передаваемый в командной строке (т.е. никаких преобразований перед сравнением не выполняется).
Параметр HostName. Устанавливает соответствие между псевдонимами, сокращениями и настоящими именами хостов. По умолчанию используется имя, передаваемое в командной строке. Допустимо непосредственное указание IP-адресов.
Параметр Port. Порт на удалённой машине, к которому следует подключаться. Значение по умолчанию — 22
Параметр User. Имя пользователя, которое следует использовать при регистрации в удалённой системе. Полезно, когда на разных серверах используются разные имена, т.к. избавляет от надобности вспоминать каждый раз нужное имя.
В качестве примера я создам файл пользовательских настроек /home/selifan/.ssh/config следующего содержания:
Host sunup
HostName sunup.aitishnik.local
Port 2203
User andrey
Host windbag
HostName windbag.nnov.ru
Port 2280
User joker
Host 212.177.65.1
HostName 212.177.65.1
Port 2222
User forester
Теперь при подключении к компьютерам sunup.aitishnik.local, windbag или по ip адресу 212.177.65.1 мне не нужно вспоминать, ни имя пользователя, ни ssh порт подключения, достаточно после ssh набрать имя сервера. Просто и удобно! Описания всех параметров, значений и некоторых примеров находятся в man ssh_config. Продолжаем настраивать SSH и читаем «Генерация ключей SSH».
Об авторе:
Меня зовут Андрей Золкин. Из более, чем пятнадцати лет работы в сфере информационных технологий, десять лет работаю с системами, базирующимися на открытом исходном коде. На страницах сайта Aitishnik.Ru веду блоги по CMC Joomla и Debian GNU/Linux.
Настройка SSH
Настройка будет происходить под выделенный сервер, VDS, VPS на Debian, Ubuntu. Конфигурационный файл располагается тут: .
Если у вас обычный хостинг, всё и так должно быть настроено как надо, переходите к разделу авторизации по ключам.
По умолчанию, демон SSHD (именно в него мы вносим изменения) не нуждается в каких-либо настройках и работает нормально. Мы внесём лишь пару небольших изменений с целью ограничить доступ нежелательных лиц к серверу.
В результате внесения неправильных изменений в конфигурационный файл вы можете потерять доступ к серверу по ssh, поэтому убедитесь, что у вас есть альтернативные варианты для доступа к нему, например, с помощью панели управления ISPManager.
Реверс-сокс-прокси
Если предыдущий пример вам показался простым и очевидным, то попробуйте догадаться, что сделает этот пример: Если вы офицер безопасности, задача которого запретить использование интернета на сервере 10.1.1.2, то можете начинать выдёргивать волосы на попе, ибо эта команда организует доступ в интернет для сервера 10.1.1.2 посредством сокс-прокси, запущенного на компьютере «А». Трафик полностью зашифрован и неотличим от любого другого трафика SSH. А исходящий трафик с компьютера с точки зрения сети «192.168.0/24» не отличим от обычного трафика компьютера А.
Туннелирование
Если к этому моменту попа отдела безопасности не сияет лысиной, а ssh всё ещё не внесён в список врагов безопасности номер один, вот вам окончательный убийца всего и вся: туннелирование IP или даже ethernet. В самых радикальных случаях это позволяет туннелировать dhcp, заниматься удалённым arp-спуфингом, делать wake up on lan и прочие безобразия второго уровня.
Подробнее описано тут: www.khanh.net/blog/archives/51-using-openSSH-as-a-layer-2-ethernet-bridge-VPN.html
(сам я увы, таким не пользовался).
Легко понять, что в таких условиях невозможно никаким DPI (deep packet inspection) отловить подобные туннели — либо ssh разрешён (читай — делай что хочешь), либо ssh запрещён (и можно смело из такой компании идиотов увольняться не ощущая ни малейшего сожаления).
Проброс авторизации
Если вы думаете, что на этом всё, то…… впрочем, в отличие от автора, у которого «снизу» ещё не написано, читатель заранее видит, что там снизу много букв и интриги не получается.
OpenSSH позволяет использовать сервера в качестве плацдарма для подключения к другим серверам, даже если эти сервера недоверенные и могут злоупотреблять чем хотят.
Для начала о простом пробросе авторизации.
Повторю картинку:
Допустим, мы хотим подключиться к серверу 10.1.1.2, который готов принять наш ключ. Но копировать его на 8.8.8.8 мы не хотим, ибо там проходной двор и половина людей имеет sudo и может шариться по чужим каталогам. Компромиссным вариантом было бы иметь «другой» ssh-ключ, который бы авторизовывал [email protected] на 10.1.1.2, но если мы не хотим пускать кого попало с 8.8.8.8 на 10.1.1.2, то это не вариант (тем паче, что ключ могут не только поюзать, но и скопировать себе «на чёрный день»).
ssh предлагает возможность форварда ssh-агента (это такой сервис, который запрашивает пароль к ключу). Опция ssh -A пробрасывает авторизацию на удалённый сервер.
Вызов выглядит так:
Удалённый ssh-клиент (на 8.8.8.8) может доказать 10.1.1.2, что мы это мы только если мы к этому серверу подключены и дали ssh-клиенту доступ к своему агенту авторизации (но не ключу!).
В большинстве случаев это прокатывает.
Однако, если сервер совсем дурной, то root сервера может использовать сокет для имперсонализации, когда мы подключены.
Есть ещё более могучий метод — он превращает ssh в простой pipe (в смысле, «трубу») через которую насквозь мы осуществляем работу с удалённым сервером.
Главным достоинством этого метода является полная независимость от доверенности промежуточного сервера. Он может использовать поддельный ssh-сервер, логгировать все байты и все действия, перехватывать любые данные и подделывать их как хочет — взаимодействие идёт между «итоговым» сервером и клиентом. Если данные оконечного сервера подделаны, то подпись не сойдётся. Если данные не подделаны, то сессия устанавливается в защищённом режиме, так что перехватывать нечего.
Эту клёвую настройку я не знал, и раскопал её redrampage.
Настройка завязана на две возможности ssh: опцию -W (превращающую ssh в «трубу») и опцию конфига ProxyCommand (опции командной строки, вроде бы нет), которая говорит «запустить программу и присосаться к её stdin/out». Опции эти появились недавно, так что пользователи centos в пролёте.
Выглядит это так (циферки для картинки выше):
.ssh/config: Host raep HostName 10.1.1.2 User user2 ProxyCommand ssh -W %h:%p [email protected]
Ну а подключение тривиально: .
Повторю важную мысль: сервер 10.1.1.2 не может перехватить или подделать трафик, воспользоваться агентом авторизации пользователя или иным образом изменить трафик. Запретить — да, может. Но если разрешил — пропустит через себя без расшифровки или модификации. Для работы конфигурации нужно иметь свой открытый ключ в authorized_keys как для [email protected], так и в [email protected]
Разумеется, подключение можно оснащать всеми прочими фенечками — прокидыванием портов, копированием файлов, сокс-прокси, L2-туннелями, туннелированием X-сервера и т.д.
Финал
Разумеется, в посте про туннели должен быть туннель, а в любой успешной статье — секретный ингредиент всеобщей популярности. Держите:
ригинал на Хабре: http://habrahabr.ru/post/122445/
Этап первый — согласование алгоритмов.
После того, как TCP соединение установлено (handshake), сервер присылает ответ с версиями поддерживаемых им протоколов. Если клиент поддерживает один из них, соединение продвигается дальше. Сервер так же предоставляет свой public host key, который клиент может использовать для проверки (known hosts).
Следующим шагом, обе стороны генерируют симметричный ключ, используя одну из модификаций алгоритма Диффи-Хеллмана (Diffie-Hellman). Алгоритм (и его вариации) дают возможность каждой стороне комбинировать свои private ключи с public ключами стороны, с которой происходит соединение. В результате чего получается один и тот же секрет для симметричного шифрования.
В целом, классический алгоритм Диффи-Хеллмана выглядит так:
- Обе стороны выбирают одинаковое больше целое число.
- Обе стороны выбирают, так называемый, генератор (обычно AES), который будет использоваться для вычислений.
- Независимо друг от друга, каждая сторона выбирает еще одно число, которое хранится в секрете. Оно используется в качестве private ключа для данной операции.
- Сгенерированный приватный ключ, генератор AES и общее число (п.1) используются для создания публичного ключа, который, в итоге, связан с приватным, но может быть передан другой стороне.
- Обе стороны меняются только что созданными публичными ключами.
- Каждая сторона использует свой приватный ключ, публичный ключ другой стороны и число из п.1, для вычисления общего секретного ключа. Хотя, процесс вычисления независимый для каждой из сторон, в итоге получаются одинаковые ключи. В этом суть алгоритма Диффи-Хеллмана.
- Затем, полученный секретный ключ используется для симметричного шифрования соединения.
Симметричное шифрование, которое используется с этого момента на протяжении всего соединения, называется бинарным пакетным протоколом (binary packet protocol). Вышеизложенный процесс, позволяет каждой стороне принимать участие в генерировании общего секретного ключа. Не позволяет одной из сторон контролировать его. Но самое главное, появляется возможность создать одинаковый ключ на каждой из машин, без его передачи через незащищенное соединение.
Получившийся ключ – симметричный. То есть используется для шифрации и дешифрации. Его назначение защитить все передаваемые данные между клиентом и сервером, создать, своего рода, туннель, содержимое которого не смогут читать третьи лица.
Пример 2: Туннель к веб-серверу
Туннель между локальным портом 8080 на локальном интерфейсе (127.0.0.1) и WWW-сервером привязан к порту 80 удаленной машины. На этот раз мы подключимся к нему, используя интерфейс loopback.
Для загрузки сайтов в браузере используется протокол HTTP.
Unix и OpenSSH
Где:
- abc – имя пользователя на сервере
- def – адрес сервера
- 8080: – порт на локальной машине, который будет открыт в интерфейсе loopback (127.0.0.1)
- 22.33.44 – IP-адрес сервера, с которым создается SSH-туннель
Windows и PuTTY
- Выберите соединение и загрузите параметры.
- Выберите Connection->SSH->Tunnels.
- Установите Forwarded ports: L8080 22.33.44:80. Поставьте галочки в Local и Auto.
- Кликните Add.
- Сохраните сессию и используйте ее для подключения.
Теоретически, перейдя к 127.0.0.1:8080 в браузере, вы должны увидеть веб-сайт, расположенный на удаленном сервере, к которому мы подключились.
Практически, HTTP 1.1 представил параметр Host для запросов. Этот параметр используется для отправки домена DNS VPS, к которому вы подключаетесь. Если он использует механизм Virtual Host, вы получите либо страницу ошибки, либо главную страницу сервера, но не через туннель.
В этом случае нужно сделать еще одно: в файле hosts на локальном ПК добавьте адрес VPS и интерфейс loopback:
Где website – это адрес сайта, к которому вы хотите подключиться (без http:// в начале и / в конце).
Файл Hosts находится в каталоге /etc/hosts (Linux) или C:\Windows\system32\drivers\etc\hosts (Windows). Чтобы отредактировать этот файл, вы должны быть администратором или иметь административные привилегии.
Важно! Если вы хотите создать туннель в Unix-системах по локальному порту с номером ниже 1024, вы должны иметь права root