LXF162:Raspberry Pi
|
|
|
Raspberry Pi. Начните знакомство с Linux и новым карманным компьютером.
Raspberry Pi: SSH-туннель
Пользуйтесь публичным Wi-Fi безопасно и одолейте цензоров: Джонатан Робертс рассказывает об SSH-тунеллировании.
Большинство из нас сталкивались с блокировкой интернет-соединения, не позволяющей делать нам то, что мы хотим – обычно в виде брандмауэра, ограничивающего доступ к сервисам, таким как SMTP или XMPP, или в виде фильтрации содержимого сайтов. Каким бы ни было ограничение, приятного здесь мало.
Большинство из нас также пользовались публичным Wi-Fi, и если у вас есть здравый смысл, то вы наверняка чувствовали себя не очень комфортно. В статье «Изучите взлом» из LXF154 было показано, как легко пользователи из той же самой сети могут шпионить за вами и даже влиять на ваши действия. С публичным Wi-Fi вы не представляете, кто еще пользуется вашим подключением и что создатели подключения делают с вашим трафиком!
На этом уроке мы покажем вам, как создать SSH-туннель в Paspberry Pi. Эта технология поможет вам одолеть цензоров и шпионов! Raspberry Pi прекрасно подходит для этого. Так как он стоит недорого и работает бесшумно, его можно просто держать на полке, пока он не понадобится.
Raspbian
Если вы следите за этой серией с самого начала, возможно, у вас еще остался исходный образ Debian, которым мы пользовались в первой статье. Однако Raspberry Pi Foundation не стоит на месте и недавно выпустила новую операционную систему на основе дистрибутива Raspbian.
Raspbian – новая версия Debian, оптимизированная для работы с Raspberry Pi. Она не только работает «прямо из коробки» и заметно быстрее (некоторые тесты показали прирост производительности от 4 до 40 %, в зависимости от рода деятельности), но и содержит удобную утилиту автоматизированной настройки, вызываемую при первом запуске Raspberry Pi. Она значительно упрощает многие задачи, решенные нами в предыдущих статьях, в том числе расширение раздела на весь диск, отключение overscan, включение SSH и изменение раскладки клавиатуры.
Советуем обновить вашу систему. Самый простой способ это сделать – загрузить последнюю версию образа с www.raspberrypi.org/downloads, распаковать ее и записать образ на SD-карту командной dd так же, как мы делали это ранее.
Советуем очистить все содержимое диска, так как мы столкнулись с какими-то странными проблемами, когда этого не сделали – поскольку старые файлы настройки и программы сохранились. Воспользуйтесь следующей командой:
sudo dd if=/dev/zero of=/dev/mmcblk0 bs=1M
Здесь mmcblk0 – устройство, соответствующее SD-карте. Перед запуском команды заранее создайте резервную копию, так как команда записывает нули на весь диск, делая все существующие данные невосстановимыми.
Порты
Прежде чем воспользоваться SSH-туннелем, объясним идею, лежащую в его основе.
При создании соединения между двумя компьютерами – для передачи web-документов, открытия защищенной оболочки или обмена файлами по NFS – компьютеру, инициирующему соединение, должны быть известны IP-адрес компьютера, к которому нужно подключиться, и номер порта сервиса (web, SSH, NFS и т. д.), к которому нужно обратиться.
Большинство из вас знают, что такое IP-адрес. Это число (например, 192.168.133.20), которое является уникальным идентификатором компьютера в сети, точно так же, как почтовый адрес идентифицирует ваш дом. Но порты знакомы нам чуть хуже.
Задаем порт
Так же как в одном доме обычно живет несколько человек, и каждый из них ждет свою почту, на каждом компьютере есть много разных сервисов, ожидающих подключения непосредственно к ним. В реальном мире мы адресуем почту конкретному человеку, положив ее в конверт с его именем, а в компьютерной сети мы указываем конкретный порт, к которому намереваемся подключиться.
Каждый порт задается номером от 0 до 65535, и каждый сервис, предоставляемый компьютером, слушает соединения на одном из этих портов. Есть список портов по умолчанию, которые слушают все популярные сервисы. Этот список поддерживается IANA (Internet Assigned Numbers Authority – Администрация адресного пространства Интернета) и покрывает порты с 0 по 1023 (web-трафик проходит через порт 80, FTP – через порт 20, SSH – через порт 22 и т.д).
Ничто не мешает вам настроить сервис на другой порт, и если вы знаете, на каком порту запущен сервис, можно указать клиенту подключаться к этому порту, а не к порту по умолчанию.
Хорошо, но какое отношение это имеет к SSH-туннелям?
На практике SSH-тунеллирование сводится к искусному перенаправлению портов.
Лучше всего объяснить это на примере. Представьте, что у нас два компьютера: ноутбук в кафе (laptop), где доступ к Интернету ограничен прокси-сервером (программой, которая умеет фильтровать интернет-трафик) и нельзя зайти на сайт example.com, и pi – Raspberry Pi с неограниченным доступом в Интернет дома. У ноутбука есть доступ к pi.
Туннелируем соединение
Чтобы открыть example.com с ноутбука, понадобится создать туннель, т. е. перенаправить наше подключение через pi. SSH-туннель такое позволяет.
Обычно SSH создает защищенное соединение между двумя компьютерами на порту 22. Но при использовании SSH-туннеля она перенаправит весь трафик с указанного порта laptop по зашифрованному соединению на порт 22 pi (или на любой другой указанный нами компьютер и порт).
У такого подхода два преимущества. Во-первых, как и при обычном SSH-соединении, трафик теперь направляется по защищенному соединению, то есть никто в локальной сети не сможет подсмотреть за нами и украсть имена пользователей и пароли. Достоинство туннелирования в том, что оно позволяет делать это с любым видом web-трафика, не только с оболочками. Во-вторых, это позволяет обойти фильтрацию содержимого сайтов в локальной сети. Если маршрутизатор, за которым находится локальная сеть, фильтрует трафик на example.com, перенаправляя соединение через неотфильтрованный порт на неотфильтрованный компьютер, в локальной сети такие ограничения можно обойти. Для этого нужно убедиться, что SSH установлен и запущен в виде сервиса на laptop и pi. На pi для этого достаточно открыть утилиту raspi-config и выбрать опцию SSH (если у вас последняя версия Raspbian).
На ноутбуке настройка зависит от дистрибутива. Для настройки SSH в Fedora выполните команды:
su -c “yum -y install openssh”
su -c “systemctl enable sshd.servive”
su -c “systemctl start sshd.service”
А в Debian или Ubuntu –
sudo apt-get install openssh-server openssh-client
sudo service ssh start
sudo insserv ssh
Если на ноутбуке стоит Windows, понадобится Putty или Cygwin, но обе эти программы выходят за рамки нашей статьи.
Создание туннеля
Сделав это, выполните следующую команду для создания туннеля:
ssh -L 1080:example.com:80 pi-user@pi -f
Разберем ее, чтобы вы поняли, что происходит. Параметр -L сообщает SSH, что мы будем использовать его для перенаправления порта.
Следующий фрагмент строки разбит на три части двоеточиями. Первое число – порт на локальном компьютере (laptop), который мы хотим перенаправить. Все порты с номером больше 1024 можно перенаправлять без прав root. Весь трафик, который мы направим на этот порт, будет перенаправлен. Средний фрагмент – компьютер, куда мы хотим перебросить трафик, а последнее число – порт на этом компьютере, к которому мы хотим подключиться. Компьютер и порт могут быть любыми – если у pi есть к ним доступ, все будет работать. Так как мы хотели открыть сайт example.com, то указали порт 80 – по умолчанию он используется для web-трафика. В конце указываются имя пользователя и компьютер, через которые мы хотим пропустить туннель. Здесь это компьютер pi и пользователь pi-user.
Эта часть работает как в стандартной команде ssh, и здесь можно пользоваться всеми обычными приемами: например, указать другие порты, использовать IP-адреса вместо имен компьютеров и т. д. (помните, что компьютер должен быть доступен для laptop, т. е. у него должно быть доменное имя или публично доступный IP-адрес; советы, как добиться этого при домашнем подключении, приведены во врезке «Динамический DNS»).
Параметр -f велит ssh перейти в фоновый режим и не занимать терминал в pi.
Теперь, чтобы открыть сайт example.com на laptop, нужно лишь открыть в браузере адрес http://localhost:1080, и все должно получиться. Двоеточие в конце адреса означает, что нужно использовать указанный порт вместо порта по умолчанию 80. “localhost” означает, что нужно обратиться к порту 1080 на том же компьютере – это «адрес вашего компьютера в Интернете».
Можно легко изменить настройки, чтобы пользоваться и другими сервисами, а не только web-трафиком. Например, если на pi есть собственный почтовый сервер (SMTP), можно изменить example.com на localhost и 80 на 25, и все будет готово. Затем, вместо того, чтобы вводить специальный адрес в браузере, нужно изменить некоторые настройки в почтовом клиенте.
Обратные туннели
SSH умеет создавать и другие туннели. Кратко рассмотрим их. Если в предыдущем примере у нас было перенаправление локального порта (-L), следующий можно назвать перенаправлением удаленного порта.
Представим себе несколько иной сценарий. У нас опять же два компьютера – laptop и pi. Ноутбук находится дома, но на нем нужно открыть внутренний сайт internal.example.com какой-то другой сети, который блокируется для внешних подключений брандмауэром. А pi подключен ко внутренней сети.
Чтобы обойти этот брандмауэр снаружи, можно создать обратный туннель с pi на laptop. Затем с помощью этого туннеля ноутбук может проникнуть внутрь защищенной брандмауэром сети через pi и обратиться к internal.example.com.
Для этого на pi выполняется команда
ssh -R 1080:internal.example.com:80 laptop-user@laptop -f
Параметр -R означает обратный [reverse] или удаленный [remote] туннель. В следующем фрагменте текста первый параметр задает не локальный порт на pi, с которого нужно перенаправлять подключения, а порт ноутбука для той же цели.
Все остальное работает как раньше. Чтобы извлечь максимум из этой уловки, туннель нужно создать заранее, так как у вас не будет доступа к pi с ноутбука, и поддерживать SSH-соединение активным. Для этого вместо обычного SSH можно установить и воспользоваться autossh, оберткой, поддерживающей соединение активным. Синтаксис команды autossh несколько иной:
autossh -M 20000 -f 1080:internal.example.com:80 laptopuser@laptop
Здесь обратите внимание на параметр -M. Указанный порт не должен использоваться другими программами, поэтому выберите номер побольше. Он используется autossh для отслеживания соединения и его восстановления, если оно пропадает.
Правда, этот полезный прием может поссорить вас с системными администраторами. Брандмауэры ставят все-таки не зря, и администраторы не любят, когда другие проделывают в них дырки!
Некоторые специалисты в области безопасности используют именно эту технологию для проверки корпоративных сетей на прочность. С помощью методов социальной инженерии они проносят в здания компаний маленькие коробочки (и Raspberry Pi идеально подходит для этого), находят незанятые сетевые разъемы и подключают их к ним. Коробочки настраиваются на автоматическое создание SSH-туннеля (например, с помощью скрипта /etc/network/if-up.d), через который можно будет проникнуть в сеть компании, украсть пароли и поработать с файлами!
Динамические туннели
Вот последняя и, пожалуй, самая полезная из технологий туннелирования SSH. Можно не указывать конкретные порты или сервисы для обмена информацией, а создавать динамические туннели, способные собирать и отправлять данные всем сервисам. Команда в этом случае гораздо проще:
ssh -D 1080 pi-user@pi
Параметр -D означает, что мы хотим настроить динамический туннель, номер – используемый локальный порт, а pi-user@pi – пользователь и компьютер, к которым будет проложен туннель.
По выполнении этой команды можно настроить любую программу, поддерживающую прокси SOCKS, на отправку трафика через только что созданный SSH-туннель.
Например, в Firefox нужно зайти в Preferences > Advanced > Network [Настройки > Дополнительные > Сеть] и нажать на кнопку Settings [Настройки] в разделе Connection [Подключение]. В появившемся окне выберите ручную [Manual] настройку прокси. Затем введите в строку SOCKS host [Узел SOCKS] адрес 127.0.0.1 и порт, указанный в команде ssh.
Нажмите OK, и все должно быть готово. Если все работает правильно, сайты должны открываться как обычно, но теперь весь трафик будет передаваться через туннель SSH на компьютер pi.
Чтобы убедиться, что все действительно работает, закройте SSH-соединение (нажав Ctrl+c) и попробуйте открыть страницу снова. Если использовался туннель, то теперь в Firefox страницы открываться не будут.
В других программах, подключающихся к Интернету – например, почтовых клиентах и программах для обмена сообщениями, будут аналогичные окна с настройками. Просто заполните параметры SOCKS, и все будет работать.
На этом все. Продемонстрированные технологии очень удобны для создания защищенного и неограниченного подключения во время поездок, но для их работы сервер должен быть постоянно включен. Электроэнергия дорожает, но с Raspberry Pi в качестве сервера расходы будут невелики.
Если вам нужно сделать сервисы в локальной сети доступными удаленным пользователям, вам могут быть интересны и VPN – виртуальные частные сети (Virtual Private Network). SSH проще в настройке, но он и менее гибок. Если вам интересно это направление, почитайте вводную статью «Применим VPN» в LXF158. |