Results 1 to 15 of 244

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

Threaded 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.

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
  •