Page 1 of 17 12311 ... LastLast
Results 1 to 15 of 244

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

  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 07: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 14:18.

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



    http://habrahabr.ru/post/116214/
    Last edited by Omega; 17-12-2012 at 10: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
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    Это смотря какое у Вас соединение. Среднестатистический ADSL использует на полную.
    Уточняю. Скорость передачи от wl500gP составляет порядка 4Мбит/с ( проверялось с помощью SFTP ).
    Last edited by al37919; 04-02-2008 at 08:48.

  8. #8

    Thumbs up

    Отличный мануал!! Тема раскрыта полностью, можно прикреплять! Давно хотел поэкспериментировать с туннелями с завтрашнего дня начну! Огромное спасибо за такую подробную выжимку!

  9. #9

    Thumbs up

    Присоединяюсь - отличное описание. Самое главное - подана отличная идея, дальше уже можно самостоятельно начать прорабатывать.

    Спасибо!

  10. #10
    Есть вопрос по Remote Port Forwarding.
    Клиент ssh позволяет указать интерфейс на сервере, для которого открывается порт на прослушку. Однако у меня почему-то этого не происходит, привязка идёт только на 127.0.0.1.
    Клиент: Windows Vista SP1 + SUA + InteropSecShell_4.6r1, OpenSSL 0.9.8e 23 Feb 2007.
    Сервер: штатный dropbear sshd v0.50 из .10, запускающийся из xinetd.
    Задача: пробросить порт RDP с ПК, находящегося за натом. По причине недостуности в данный момент этого ПК тестирую на своих.

    Строка запуска клиента:
    ssh -R :3389:192.168.1.3:3389 192.168.1.1 -N
    ssh -R \*:3389:192.168.1.3:3389 192.168.1.1 -N
    ssh -R 192.168.1.1:3389:192.168.1.3:3389 192.168.1.1 -N
    Выдержка из мана:
    -R [bind_address:]port:host:hostport
    Specifies that the given port on the remote (server) host is to
    be forwarded to the given host and port on the local side. This
    works by allocating a socket to listen to port on the remote
    side, and whenever a connection is made to this port, the connec-
    tion is forwarded over the secure channel, and a connection is
    made to host port hostport from the local machine.

    Port forwardings can also be specified in the configuration file.
    Privileged ports can be forwarded only when logging in as root on
    the remote machine. IPv6 addresses can be specified by enclosing
    the address in square braces or using an alternative syntax:
    [bind_address/]host/port/hostport.

    By default, the listening socket on the server will be bound to
    the loopback interface only. This may be overriden by specifying
    a bind_address. An empty bind_address, or the address `*', indi-
    cates that the remote socket should listen on all interfaces.
    Specifying a remote bind_address will only succeed if the serv-
    er's GatewayPorts option is enabled (see sshd_config(5)).
    Пробовал также проброс в SecureCRT - аналогично биндится к 127.0.0.1.
    Last edited by djet; 04-04-2008 at 18:10.

  11. #11
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    Только почему -R? Должно быть -L!
    PHP Code:
    ssh -L 3389:192.168.1.3:3389 192.168.1.1 -
    Или я не понял задачу? C RDP могу себе представить только один вариант --- доступ извне к компу за NAT.

  12. #12
    Нужно пробросить порт RDP от клиента к серверу, поэтому -R.

    Допустим, вариант с привязкой на нужный интерфейс не работает, и нужно через nat самом на роутере пробросить локально открытый сервером ssh порт. Делаю так:
    iptables -A INPUT -p tcp --dport 3389 -d 127.0.0.1 -j ACCEPT
    iptables -t nat -A VSERVER -p tcp -m tcp --dport 3389 -j DNAT --to-destination 127.0.0.1:3389
    Но и эта схема не работает, порт остаётся недостижим извне.
    Last edited by djet; 04-04-2008 at 19:48.

  13. #13
    Кажется, вопрос решён с опцией "-a Allow connections to forwarded ports from any host".
    Странно, однако, что открытый dropbear порт не отображается в netstat -na.

  14. #14
    Join Date
    Feb 2007
    Location
    Moscow, Russia
    Posts
    3,805
    я по прежнему не понимаю о чем речь идет. Однако, могу отметить, что туннелирование через ssh никакого отношения к пробросу портов не имеет. И iptables тут явно ни при чем. И "открытый" порт доступен только в рамках конкретного открытого ssh соединения. Открыт должен быть только ssh порт

    Стандартная задача использования RDP заключается в том, чтобы получить доступ с компа в инете на комп, сидящий за натом.

    Для этого, сначала открываем туннель следующим образом:
    PHP Code:
    ssh -L 3389:192.168.1.3:3389 user@ROUTER'S-WAN-IP 
    далее подключение по RDP к адресу: 127.0.0.1:3389

    Что еще можно выдумать с RDP я не знаю.

  15. #15
    Поясню: есть предприятие, сервер которого подключен посредством nat от сети других арендаторов здания. Чтобы получить к нему доступ извне, требуется полное взаимопонимание с арендаторами, достигнуть которого пока затруднительно из-за репутации бывших сисадминов и загаженной локальной сети (с этим мы будем бороться). Однако, это не мешает нам достигать своих целей, одной из которых является управление сервером из дома и не только. Идея очень проста: сервером поднимается ssh, либо vpn-туннель до статического внешнего хоста (asus), после чего он становится доступен полностью (vpn) или частично (ssh port forwarding). Remote Port Forwarding нужен для подключения к клиентским портам со стороны сервера (задача, обратная обычному Local Port Forwarding).
    //Осталось найти клиент win32, максимально красиво выполняющий свои функции в win32, либо работающий pptp/l2tp-сервер для asus'a.
    Last edited by djet; 04-04-2008 at 22:27.

Page 1 of 17 12311 ... LastLast

Similar Threads

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