Page 1 of 6 123 ... LastLast
Results 1 to 15 of 244

Thread: Использование ssh-тунелей для безопасного доступа к ресурсам LAN

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805

    Lightbulb Использование ssh-тунелей для безопасного доступа к ресурсам LAN

    Цитата из википедии:
    Большинство программ для установления соединения используют TCP, который можно передавать через безопасный туннель используя протокол SSH. Так можно устанавливать множество дополнительных TCP соединений внутри одного ssh соединения. Это удобно для сокрытия соединений и шифрования протоколов, которые являются небезопасными и для обхода фаерволов. UDP соединения иногда тоже возможно туннелировать с помощью дополнительных программ, например, netcat.

    Поясню мысль в слегка упрощенном виде. Большинство используемых протоколов (telnet, http, ftp, pop3, imap4, smtp, smb, rdp и т.д.) передают данные и параметры аутентификации в текстовом виде без шифрования. Это значит, что нехороший человек (впрочем необходимо отметить, что довольно квалифицированный) может проанализировать пакеты передающиеся по интернету и извлечь ваши логины и пароли, читать Вашу почту и т.д. Именно поэтому крайне не рекомендуется открывать в WAN лишние порты (и лучше всего вообще никакие).

    Все данные, передаваемые по протоколу ssh (включая явки и пароли), зашифрованы с использованием стойкой криптографии. В протоколе ssh заложена возможность создать защищенное соединение и передавать внутри него данные по незащищенным протоколам, причем извне весь траффик будет выглядеть как зашифрованный. Это и есть ssh туннели, использование которых позволяет получить доступ к ресурсам LAN путем установления защищенного соединения.Для этого требуется открыть только один порт в WAN , а именно порт на котором слушает ssh сервер (по умолчанию 22).

    Организовать ssh туннель --- легко. В англоязычной википедии я встретил такой термин применительно к ssh туннелям: "poor man's VPN". Похоже это устоявшийся термин, и поиск по нему дает немало примеров настройки подобных туннелей.

    Что требуется:

    1) наличие внешнего IP адреса. Либо статического, тогда вообще все просто, либо динамического, тогда требуется зарегистрироваться на каком-нибудь сервисе, предоставляющем доменное имя (например, http://www.dyndns.org) и запустить на роутере клиент, обеспечивающий обновление вашего IP на этом сервере (в прошивках Олега где-то от версии 8 и выше достаточно установок в веб-морде)
    2) ssh сервер должет быть запущен на роутере. Оптимальный выбор для нашего роутера --- dropbear , встроенный в прошивку. Установка dropbear описана во всех инструкциях по установке с нуля (wengi, marcnesium, OlegI). Вкратце:
    a) должно быть однократно выполнено следующее (с сохранением результата в flashfs):
    PHP Code:
    mkdir -/usr/local/etc/dropbear
    dropbearkey 
    -t dss -/usr/local/etc/dropbear/dropbear_dss_host_key
    dropbearkey 
    -t rsa -/usr/local/etc/dropbear/dropbear_rsa_host_key 
    б) файл /usr/local/sbin/post-boot должен содержать строку
    PHP Code:
    dropbear 
    dropbear может быть запущен и не только на порту по умолчанию (т.е. 22), но и на любом другом. Для запуска на порту 24853 строка в post-boot должна выглядеть так:
    PHP Code:
    dropbear -p 24853 
    3) ssh сервер должен быть доступен из WAN. Опять же обсуждено немеряное количество раз. Напоминаю минимальный вариант:
    добавить в /usr/local/sbin/post-firewall следующее (при этом Internet firewall --> Basic Config --> Logged packets type в веб-морде должен быть выставлен в NONE):
    PHP Code:
    #! /bin/sh
    # set default policy
    iptables -P INPUT DROP
    # remove last default rule
    iptables -D INPUT -j DROP
    iptables 
    -A INPUT -p tcp --syn --dport 22 -j ACCEPT 
    Развернутый вариант post-firewall, включающий защиту от назойливых попыток подбора пароля к ssh аккаунту предложен здесь: http://wl500g.info/showpost.php?p=69964&postcount=63
    4) ssh клиент на удаленной машине с которой мы имеем желание воспользоваться благами через ssh туннель.
    Если на этом компе используется windows, то отличным выбором будет putty (желательно последней версии, т.к. поддержка ssh туннелей там сейчас, похоже, дорабатывается).
    Если на удаленном компе стоит *nix, то все еще проще, т.к. ssh туннель может быть установлен с помощью программы ssh из состава openssh.

    Итак, что нужно сделать, чтобы создать ssh туннель после того, как все вышеуказанные пререквизиты выполнены.

    Для примера подготовка туннеля в putty для доступа к веб-интерфейсу роутера из WAN:
    1) в putty идем в Connection --> SSH --> Tunnels и в поле Source port указываем любой порт (например 8080), далее в Destination пишем следующее: 127.0.0.1:80 (80 --- это порт под которым веб-морда доступна из LAN). Галка по умолчанию должна стоять Local (это так для всех нижеприведенных примеров если не указано обратное). Нажимаем кнопку Add (обязательно!). Отлично --- туннель добавлен.
    2) далее, идем в Session, в поле Host name (or IP address) указываем внешний IP роутера, либо имя присвоенное через dyndns (например, router.dyndns.org ); Connection type --- SSH ; Port --- 22 (либо тот, что был указан при запуске dropbear). Далее в поле Saved sessions задаем имя, под которым данные настройки будут сохранены и нажимаем кнопку Save.
    3) Если сессия уже была создана ранее, то добавить к ней еще один туннель можно следующим образом: Выбираем сессию, нажимаем Load, выполняем пункт 1, возвращаемся в Session и нажимает Save.

    Использование туннеля.

    1а) если используем putty, то запускаем сохраненную сессию, вводим имя и пароль
    1б) если на удаленной машине используется *nix , то все еще проще:
    PHP Code:
    ssh -L 8080:127.0.0.1:80 username@router.dyndns.org:port 
    здесь username может быть опущено, если ssh запускается из под того же юзера, что и на удаленном сервере, port может быть опущен, если он 22.
    ВАЖНО! окно putty или ssh должно оставаться открытым во время работы через туннель.
    2) запускаем броузер и вводим следующий адрес:
    http://localhost:8080
    В результате попадаем в веб-интерфейс роутера

    Примеры настройки туннелей:

    Доступ к веб-интерфейсу устройств, находящихся в LAN, например, VoIP адаптер:
    Source port 8081
    Destination 192.168.1.200:80 (здесь, 192.168.1.200 --- IP адрес VoIP адаптера в LAN)
    В результате веб-интерфейс VoIP адаптера будет доступен по адресу http://localhost:8081

    Доступ к веб-интерфейсу устройств, находящихся в MAN, например, ADSL модем:
    Source port 8082
    Destination 192.168.2.1:80 (здесь, 192.168.2.1 --- IP адрес ADSL модема MAN)
    В результате веб-интерфейс ADSL модема будет доступен по адресу http://localhost:8082

    Доступ к веб-интерфейсам других приложений живущих на роутере (ADOS, transmission, seaky-sctcs, ntorrent, wtorrent и т.д.)
    по сути настраивается так же как и доступ к веб-интерфейсу роутера, только порты указываются те, на которых висят соответствующие веб-интерфейсы

    Вместо всех приведенных до настоящего момента примеров локальных http туннелей можно сделать один единственный динамический туннель, при этом ssh сервер будет выполнять функции socks proxy:
    putty:
    Source port 1080
    ставим галку около Dynamic и добавляем туннель. Естественно, устанавливаем ssh соединение.

    *nix:
    PHP Code:
    ssh -D 1080 user@router.dyndns.org 
    После этого в firefox указываем SOCKS5 proxy: localhost:1080 и мы внутри локалки (т.е. нам должны быть доступны адреса типа http://192.168.1.10:80 )

    Доступ к Remote Desktop Windows XP+ компьютеров в LAN
    Source port 8089
    Destination 192.168.1.10:3389 (здесь, 192.168.1.10 --- IP адрес WinXP PC в LAN)
    В результате Remote Desktop данного WinXP PC будет доступен по адресу localhost:8089

    Доступ к X-серверу *nix
    Source port 6000
    Destination 192.168.1.10:6000 (здесь, 192.168.1.10 --- IP адрес PC в LAN с запущенным на нем X сервером)

    В результате выполнение на удаленном PC, скажем,
    PHP Code:
    netscape -display localhost:0.0 
    должно отобразить вывод netscape на PC сидящем внутри LAN.
    Кстати, именно этот вариант я все же не тестировал --- ибо смысла в нем особого нет --- разве что ребенку мультики запускать находясь изрядно далеко, хотя это явно можно и попроще реализовать. Однако, следующий пример --- гораздо более реалистичный.

    Доступ X-клиентов, запущенных либо на роутере, либо в на компьютерах из LAN к X-серверу запущенному на удаленном PC (за которым сидит оператор)
    Вот тут есть некоторая особенность. Дело в том, что туннели могут работать в две стороны.
    В большинстве случаев мы хотим получить доступ к удаленным сервисам, но в случае использования системы X-client/server все наоборот. Сервер запускается на машине перед которой сидит оператор, а удаленные клиенты к нему могут присоединяться. Делается это так:

    putty:
    Source port 6000
    Destination 127.0.0.1:6000
    Переключаем кнопку, которая до сих пор по умолчанию стояла в Local на Remote и нажимаем Add (как и во всех предшествовавших примерах)
    *nix:
    PHP Code:
    ssh -R 8080:127.0.0.1:80 user@router.dyndns.org 
    Данный вариант успешно работал когда у меня стоял дебиан на роутере. Я выполнял
    PHP Code:
    xosview -display localhost:0.0 
    и получал картинку на удаленном PC, на котором, естественно, был запущен Х-сервер.
    Соответственно, если вместо 127.0.0.1 указать адрес *nix PC, находящегося в LAN, то задачи можно запускать на нем, а видеть результат и управлять на удаленном PC.
    Last edited by al37919; 12-03-2009 at 06:48.

  2. #2
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    Далее следуют несколько возможностей, которые я пока не тестировал

    Доступ к внутренним ресурсам, например, по протоколу ftp без их открытия в WAN
    Скорее всего должно быть так:
    Source port 8021
    Destination 127.0.0.1:21
    Однако, в этом варианте скорее всего доступ будет только в пассивном режиме. Для активного режима скорее всего надо второй туннель открывать. Я ftp извне никогда не пробовал, т.к. из WAN пользовался scp/sftp для копирования данных по протоколу опять таки SSH (см. http://wl500g.info/showthread.php?t=12357 )

    Доступ к SMB шарам
    пишут что можно сделать через ssh туннель. Не пробовал.

    Доступ к rtorrent через xmlrpc
    любопытный вопрос, который пока не тестировал

    Печать на удаленном принтере
    Как видим, туннели могут использоваться не только в броузере, но и в любой другой программе. Почему бы не сделать следующее:
    Source port 9100
    Destination 127.0.0.1:9100
    Далее создать на удаленном PC TCP порт принтера с адресом 127.0.0.1:9100 и печатать в него с выводом на принтере подключенном к нашему роутеру.

    И, наконец, еще два классических примера несомненного удобства использования ssh-туннелей, правда не совсем относящийся к нашему роутеру:
    SMTP сервер через ssh туннель
    1) есть ноут, который возится с места на место и подключается через разных провайдеров.
    2) есть корпоративный/университетский почтовый сервер с ssh аккаунтом
    С получением почты, обычно проблемы нет, а с отправкой все не так просто, т.к. придется забивать в каждом месте новый SMTP сервер. В данном случае, идеальным решением является использование ssh туннеля --- назначаем порту 8025 --- localhost:25; в почтовом клиенте настраиваем в качестве SMTP сервера localhost:8025; заходим по ssh на почтовый сервер и отправляем почту хоть с любого конца планеты без лишнего гемора.

    Доступ к ресурсам с ограничением по IP
    Собственно данный пример аналогичен вышеприведенному способу доступа в LAN с использованием SSH сервера в качестве SOCKS proxy.
    1) Есть опять же корпоративный/университетский сервер с ssh аккаунтом.
    2) С этого сервера имеется доступ к ресурсам интернета, контроль доступа к которым осуществляется по IP адресу (например, ситуация типична для наличия подписок на организации на определенную литературу).
    3) Запускаем
    PHP Code:
    ssh -D 1080 user@router.dyndns.org 
    либо в putty ставим галку около Dynamic и задаем порт, например, 1080.
    Аналогично вышесказанному в firefox указываем SOCKS5 proxy: localhost:1080 и если мы идем на сайт с ограничением доступа по IP, то он определяет наш IP как IP SSH сервера к которому мы подключены!
    Я нарыл эту фичу, удобный способ осуществить которую я искал вот уже несколько лет, в процессе написания этой статьи. Чему безмерно счастлив!

    На всякий случай привожу скриншоты задания прокси в firefox


    В вышеприведенном варианте трафик идет через тунель, но DNS запросы резолвятся через основной DNS. Этого вполне достаточно если ставится задача именно подмены IP адреса, однако, если целью является сокрытие того кто куда ходит (см. следующий пример), то можно и DNS запросы направить через SOCKS. Для этого в firefox в строке адреса набираем:
    Code:
    about:config
    и в списке параметров включаем следующий:
    Code:
    network.proxy.socks_remote_dns = true
    Еще один пример из википедии, может кого то наведет на полезную мысль
    SSH туннели обеспечивают средство преодоления файрволов, которые запрещают определенные интернет сервисы, при условии, что исходящие соединения на 22-м порту разрешены. Например, многие организации запрещают пользователям доступ к веб-страницам напрямую без предварительного анализа прокси/фильтром. Однако, если юзеры способны подключиться к внешнему ssh серверу, то ssh туннель может быть создан для проброса 80-го порта внешнего веб-сервера на некоторый порт (например 80-й) на локальной машине и, таким образом, иметь доступ к внешнему веб-серверу по адресу http://localhost . В более общем случае, пользователи могут установить собственный прокси сервер (например, squid) дома и создать туннель от рабочего PC до прокси. Далее путем конфигурирования броузера на исползование localhost вместо корпоративного прокси сервера, пользователи могут получить доступ к любой веб странице в обход корпоративного прокси и файрвола.

    От себя добавлю, что конторы бывают разные --- иногда админ или идиот, или параноик, а все страдают, но бывают, конечно, конторы из которых лучше не организовывать зашифрованные каналы неизвестно куда.

    В заключение, хотелось бы еще раз подчеркнуть следующее. SSH туннели --- это простой, эффективный и в значительной степени безопасный способ организации доступа к внутренним ресурсам LAN из WAN, в отличие от почти всех альтернативных вариантов (пожалуй исключая https сервер, но я пока не встретил популярного изложения как его запустить на роутере, и VPN). По сути это действительно VPN, но не требующий усилий для настройки. Одно слово --- "poor man's VPN", хотя, по моему, "lazy man's VPN" --- ему как то больше к лицу.

    ЗЫ Хороший англоязычный тьюториал: http://souptonuts.sourceforge.net/sshtips.htm
    ЗЗЫ Спасибо АВАТАРА за дополнение о перенаправлении DNS запросов в SOCKS прокси
    Last edited by al37919; 01-03-2010 at 13:18.

  3. #3
    а где веселые картинки?



    http://habrahabr.ru/post/116214/
    Last edited by Omega; 17-12-2012 at 09:39. Reason: fixed
    vim имеет два режима - бибикать и все портить (с) не мое

  4. #4
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    а что показывать то... ? скриншоты одной страницы putty? вроде несерьезно...

  5. #5
    Quote Originally Posted by al37919 View Post
    а что показывать то... ? скриншоты одной страницы putty? вроде несерьезно...
    да нормально, я для себя инструкции пишу с картинками, чтоб в следующий раз мозг не перенапрягать
    особенно на работе.
    vim имеет два режима - бибикать и все портить (с) не мое

  6. #6
    Скорость через эти туннели - никакая, проще tcppm или socks из 3proxy заюзать...

  7. #7
    Join Date
    Jun 2008
    Location
    Russia, Perm
    Posts
    476

    SSH-туннель из-под NAT

    Cитуация такая : я хочу поднять ssh туннель от своего роутера с нереальным ip до компа с реальным... Внятной инструкции пока не нашел... Комп - только Windows, роутер - wl500gp с прошивкой Олега (-10). Как такое реализовать?
    Интересует, такое : я стучусь удаленному компу на определенный порт с помощью putty, попадаю в туннель, и дохожу до роутера (и авторизуюсь уже на нем)

  8. #8
    Join Date
    Feb 2007
    Location
    Moscow RF
    Posts
    355
    Google поломался? Первая ссылка по заппросу ssh server for windows http://www.n-admin.com/n27-5110.html
    вторая http://sshwindows.sourceforge.net/

  9. #9
    Join Date
    Jun 2008
    Location
    Russia, Perm
    Posts
    476
    Я нашел freeSSHd через wikipedia. Но не в этом суть.... Интересует именно такой туннель...

  10. #10
    Join Date
    Feb 2007
    Location
    Moscow RF
    Posts
    355
    Quote Originally Posted by DemonGloom View Post
    Я нашел freeSSHd через wikipedia. Но не в этом суть.... Интересует именно такой туннель...
    Если я правильно понял, то алгоритм такой - поднимаем на виндовой машине SSH server, коннектимся клиентом SSH c роутера к этой машине, ну а дальше вроде как http://wl500g.info/showthread.php?t=12833 начиная с 10-го поста. Так?

  11. #11
    Join Date
    Jun 2008
    Location
    Russia, Perm
    Posts
    476
    спасибо, буду пробовать...

  12. #12

    ftp

    В первую очередь хотелось бы сказать огромное спасибо al37919 за понятный мануал! Все работает как надо!
    Во вторую очередь хотелось бы задать вопрос: У меня на роутере висит внешний диск на 2 терабайта через Ethernet интерфейс(ссылка на описание диска http://ishop.sunrise.ru/goodsDescrip...id=0075796&b=1). Так вот я бы хотел, чтобы можно было бы обращаться к этому диску как к сетевому диску через ssh тунель? Как мне это сделать?! Или возможно мне нужно на роутере поднять Server FTP? И что мне с этим FTP делать?!
    Помогите пожалуйсто! Очень нужна помощь! Сам уже весь инет излазил!
    Большое спасибо!

  13. #13
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    все зависит от возможностей коробки с винчестером.

    ftp через туннель --- задача не совсем тривиальная. Возможно, я бы выбрал такой вариант: расшаривание диска на роутер через nfs и доступ к роутеру через sftp

    p.s. постить одно и то же малосодержательное сообщение трижды в разных ветках является нарушением правил конференции "Place a topic only once in one forum (no double or cross posting)" и, мягко говоря, раздражает.

  14. #14
    Прежде всего, спасибо за подробную инструкцию.
    Пытаюсь это все освоить... Установил и запустил dropbear, разобрался с putty.
    Не пойму как мне настроить post-firewall, т.к. не понимаю ничего
    У меня в нем сейчас такие правила(не помню уже для чего, но вроде для DC++ сделан проброс портов)
    #!/bin/sh
    iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
    iptables -A FORWARD -j DROP
    iptables -I SECURITY -p udp --dport 16000:16254 -j RETURN

    Если я добавлю Ваши :
    # set default policy
    iptables -P INPUT DROP
    # remove last default rule
    iptables -D INPUT -j DROP
    iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT

    ничего я не испорчу?

  15. #15
    Join Date
    Feb 2008
    Location
    Moscow, Tver
    Posts
    3,962
    Quote Originally Posted by ghost38 View Post
    Прежде всего, спасибо за подробную инструкцию.
    Пытаюсь это все освоить... Установил и запустил dropbear, разобрался с putty.
    Не пойму как мне настроить post-firewall, т.к. не понимаю ничего
    У меня в нем сейчас такие правила(не помню уже для чего, но вроде для DC++ сделан проброс портов)
    #!/bin/sh
    iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
    iptables -A FORWARD -j DROP
    iptables -I SECURITY -p udp --dport 16000:16254 -j RETURN

    Если я добавлю Ваши :
    # set default policy
    iptables -P INPUT DROP
    # remove last default rule
    iptables -D INPUT -j DROP
    iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT

    ничего я не испорчу?
    Надо примерно так чтобы было:
    Code:
    #!/bin/sh
    # set default policy
    iptables -P INPUT DROP
    # remove last default rule
    iptables -D INPUT -j DROP
    iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
    iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
    iptables -A FORWARD -j DROP
    iptables -I SECURITY -p udp --dport 16000:16254 -j RETURN

Page 1 of 6 123 ... LastLast

Similar Threads

  1. Тестирование скорости чтения/записи USB-HDD.
    By ABATAPA in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 87
    Last Post: 20-06-2013, 13:11

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •