суббота, 18 января 2014 г.

Крутой хакер. Первый опыт.

Я уже писал про свой новый внешний чудо-диск, умеющий поднимать собственную WiFi сеть. И про то, какими особенностями он обладает. В связи с длинными, новогодне-рождественскими выходными, у меня появилось свободное время, часть которого я решил посвятить исследованиям для решения вопросов, возникших в процессе использования этого устройства. Собственно, об этом и хочу рассказать.

Прежде всего, хочу оговориться, что я ни разу не гуру в операционных системах семейства *nix. В основном, опыт работы с ними сложился из использования всевозможных устройств, имевших на борту урезанные версии Linux. Тут и плеер WD TV, и домашний NAS WD MyBook Live, и роутер ASUS RT-N56U, а теперь вот Seagate Wireless Plus. Да и то, обычно, работа эта сводилась к перепрошивке перечисленных выше устройств (сами прошивки, конечно же, собирал не я), или в применении каких-то решений, найденных на всевозможных форумах в интернете. Но тут я столкнулся с проблемой, решение которой найти не удалось. 

То ли устройство от Seagate относительно новое, то ли оно не слишком популярно, но на форумах я встретил лишь несколько сообщений, в которых пользователи жаловались на ту же проблему, которая возникла и у меня, но все эти сообщения оставались без ответа. Напомню, что проблема эта была связана с использованием тринадцатого канала для домашней точки доступа. Seagate Wireless Plus (в дальнейшем, для краткости, я буду называть его SWP) умеет цепляться к внешним точкам доступа. Процесс подключения состоит из выбора нужной точки из списка, и, при необходимости, указания пароля, если выбранная точка доступа защищена. Но если точка доступа использует канал после одиннадцатого, то она не появляется в списке для выбора, и, соответственно, к ней нельзя подключиться.

Так как я уже давно вожусь с WiFi сетями, и у меня перебывала куча устройств, приобретенных как в Старом, так и в Новом Свете, то проблема тринадцатого канала мне известна. Это и не проблема вовсе. Просто в некоторых странах запрещается использовать те или иные каналы для точек доступа. Так, например, в Штатах нельзя использовать каналы 12 и 13. Речь сейчас о диапазоне 2,4 ГГц. И многие устройства настроены так, чтобы этот закон не нарушать. Правда, в настройках устройств довольно часто можно сменить регион, после чего запрещенные каналы становятся на них доступными. Я обычно устанавливаю страну GB, то есть Великобританию - Россия далеко не всегда есть в списке регионов, особенно в тех устройствах, которые куплены за границей. А в Великобритании эти каналы разрешены, да и других запретов, вроде, нет.

Но сама возможность выбора региона, к сожалению, не всегда присутствует в интерфейсе по настройке того или иного устройства. Например, в первых версиях официальной прошивки для роутера ASUS RT-N56U такой настройки в интерфейсе не было. Зато была инструкция, написанная знающими людьми, описывающая необходимые действия для смены региона в ручном, так сказать, режиме. А в альтернативной прошивке, на которую я довольно быстро перешел, такая настройка была.

Но, вернемся к SWP. Возможностей по его настройке в официальной прошивке и так не очень много, поэтому отсутствие возможности смены региона меня не сильно удивила. Я быстро понял, что придется все делать на командном уровне. К счастью, к устройству можно подключиться через какой-нибудь telnet клиент, то есть доступ к этому самому командному режиму имеется. Поэтому я подключился к точке доступа SWP через putty, вбил имя пользователя - root, и пароль - goflex. Пароль, между прочим, я тоже надыбал в интернете. Ну что ж, здравствуй, командная консоль SWP.

Консоль SWP
Первый вопрос, который надо было прояснить, что именно нужно сделать, чтобы сменить регион. Ответ был найден с помощью Google довольно быстро. В одном из блогов было описано использование команды iw:

 iw reg set XX  

где XX - буквенный код страны, например, US, FR, GB или RU. Полное описание этой конфигурационной утилиты можно найти по этой ссылке.

Но это было бы слишком просто - задал вопрос, получил ответ, применил - все заработало. Я не зря упомянул, что на таких устройствах установлены обычно не совсем полноценные версии Linux. Это-то и понятно. Такие устройства довольно часто стеснены в ресурсах - памяти не очень много, еще чего-то не хватает. Вот поставщики и выпиливают из дистрибутива вещи, которые для реализации основного функционала вроде как и не нужны. 

Но даже такой профан, как я, знает,что к установленному дистрибутиву можно добавить все, что угодно, из репозитория, надо лишь знать правильный. Но и на этом пути бывают проблемы. Хотя слово "бывают" тут не подходит - я всегда, на всех своих устройствах, сталкивался с ситуацией, когда такое простое действие, как установка какого-нибудь пакета из репозитория, может привести к "окирпичиванию" устройства. Термин "кирпич" можно встретить во всех форумах, на которых обсуждаются всяческие трюки с устройствами с Linux на борту. Как можно догадаться, после некоторых манипуляций устройство просто превращается в бесполезную коробочку, или, кирпич.

Дело в том, что производители мало того, что выпиливают какие-то модули, они еще слегка оптимизируют тот дистрибутив, который служит основой для прошивки. Очень часто сами дистрибутивы уже являются устаревшими, под них не выходит обновлений. Кроме того, чтобы добиться работоспособности на своем железе, они перемешивают модули из различных версий, но, что хуже всего, зачастую добавляют свои модули. А в мире Linux существует, как я понимаю, проблема, схожая с проблемой, называемой в Windows, DLL Hell.

В мире Windows эта проблема связана с использованием в разнообразных программных продуктах различных версий одних и тех же библиотек. В чем тут проблема? Да в том, что не всегда разные версии одной библиотеки бывают совместимы друг с другом. Довольно часто разработчики библиотек оказываются настолько стесненными старыми рамками, что без их разрушения не могут реализовать новые возможности или улучшения. И тогда они идут на осознанное изменение интерфейса своих библиотек. Конечно, они стараются сохранить совместимость версий, но это удается далеко не всегда. Это осознанные изменения, о них хотя бы можно прочитать в документации, хотя, кто ж читает документацию. А ведь есть еще спонтанные, не осознанные изменения, взять хотя бы те же программные ошибки. Вот и получается ситуация, когда продукты, работающие с одними версиями, перестают работать с другими. А ведь программы устанавливаются независимо друг от друга, и должны вместе сосуществовать. Это на первый взгляд кажется, что проблема пустячная, и существует много несложных способов ее обойти. Но поверьте, ее не зря ее назвали "адской".

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

Только вот владельцам устройств с урезанными старыми дистрибутивами от этого не легче. Зачастую нужный модуль можно достать только новой версии, что может потребовать обновления зависимостей, что может привести к неработоспособности этих зависимостей в старой программной инфраструктуре, ну и, соответственно, к неработоспособности нового  модуля на конкретном устройстве. Но из-за того, что обновленные библиотеки перестали работать, неработоспособным окажется не только новый устанавливаемый модуль, но и все модули, использующие эти самые библиотеки, вернее, их старые версии. Результатом этой цепочки может явиться тот самый пресловутый "кирпич". 

Но это я немного отвлекся в область теорий. Вернемся к практике. Как, наверное, было не сложно догадаться, команда iw в той версии Linux, которая была установлена на SWP, отсутствовала. Ее можно было установить из какого-то репозитория, но я уже успел прочитать в форумах сообщения от незадачливых кулибиных о возникающих проблемах в программном обеспечении при установке из этого репозитория каких-то модулей. И пусть в этих сообщениях нигде не упоминалась команда iw, но я ведь не спец, и не знаю, какие зависимости потребуют обновления, но ведь очень может быть, что это будут какие-нибудь модули, которые работают с аппаратной частью WiFi. Понятно, что полный кирпич из внешнего винчестера получить можно, только если что-то сделать с самим жестким диском. Но вот неработоспособную точку доступа получить можно было запросто, о чем, собственно, и жаловались незадачливые экспериментаторы.

Был один очень осторожный пользователь, который полностью отказался от автоматизированной процедуры установки модулей из репозитория. Он все делал вручную: скачивал, разархивировал, копировал. Как следствие, у него было больше возможностей управлять процессом. Но и знаний такой подход требовал больше. А знания - это как раз тот ресурс, которого, в моем случае, и недоставало.

Отбросив установку модулей для работы iw, как потенциально опасную, я вернулся к поиску других решений. И снова гугл нашел вариант. На этот раз предлагалось использовать возможности модуля wpа_supplicant. В его конфигурации можно было указать требуемый регион:

 country=XX  

где XX это все тот же двух символьный код страны. Но поиски на SWP каких-либо конфигурационных файлов для wpa_supplicant не увенчались успехом. Однажды я сталкивался с этим модулем - при использовании альтернативной прошивки на плеере WD TV именно он использовался для управлением и настройки WiFi. Но на SWP я не нашел никаких признаков присутствия этого приложения.

Далее гугл выдавал ссылки на использование CRDA, еще какие-то модули, например, на якобы устаревший iwconfig. Все глубже погружаясь в описание модулей, драйверов и  приложений я стал понимать, что мне начинает очень не хватать элементарных, базовых знаний, тех самых основ, которые совсем не упоминались в документации, но владение которыми предполагалось.

В какой-то момент я словил себя на том, что просто бегаю по кругу. Тогда я решил сменить тактику. Я решил, что пора бросать попытки найти на устройстве программы, описываемые в интернете, а поискать, что есть на самом устройстве, и уже после попытаться по этим модулям найти помощь в интернете.

И я стал изучать, что есть на SWP. Ход мыслей был достаточно прост. Применение всевозможных параметров должно происходить при старте системы. Поэтому надо найти какие-нибудь командные файлы, выполняемые при старте системы. Можно еще поискать файлы с говорящими названиями, ну, вдруг, есть какой-то файл, отвечающий за подключение к внешней точке доступа, и название у него очень незамысловатое, например, connect_to_external_ap. 

Для начала, я решил прояснить для себя вопрос, а где, собственно, следует искать те самые файлы, содержимое которых выполняется при старте операционной системы. Про каталог init.d я был в курсе еще по работе с роутером ASUS RT-N56U. Я начал исследование с него.

Затем, читая всевозможные статьи в интернете, я узнал, что есть еще каталоги rcX.d, где X - некоторый порядковый номер, который ассоциируется с параметром runlevel. Этот параметр определяет уровень, или состояние, до которого дошла система в процессе своей загрузки, и на котором будут выполняться команды, хранящиеся в соответствующем каталоге. Ну, по крайней мере, я так понял описание этого параметра. Самый нижний уровень имеет номер 1 и это такое состояние системы, на котором определен только однопользовательский доступ, текстовый интерфейс, только базовая конфигурация. Наиболее старший уровень имеет номер 5, и такое значение параметра runlevel определяет самое продвинутое состояние системы - многопользовательский доступ, сетевые возможности, работа с графическим интерфейсом пользователя. Есть еще уровни 0 и 6, но они связаны с остановкой и перезагрузкой системы.

Что самое неприятное, в статьях было отмечено, что одно и то же значение runlevel для разных дистрибутивов может означать различное состояние системы. Таким образом, единственным способом понять, как работает система в моем случае - самому посмотреть внутрь этих каталогов и попытаться понять, для чего предназначены те или иные командные файлы.

Так выглядит содержимое некоторых  каталогов на SWP

К счастью, разработчики прошивки называли эти файлы согласно той функции, для которой они предназначались. Так мне удалось довольно быстро найти в каталоге rc5.d файл с именем S85network_start. В общем, я стал изучать эти файлы, одни из них вызывали другие, и я шел по этой цепочке, сбивался, и снова шел. В конце концов, мне удалось выцепить две команды, которые так или иначе взаимодействовали с WiFi - это были iwpriv и wl. iwpriv мне очень нравилась, так как в ней было что-то от команды iw. Но я довольно быстро понял, что от нее будет очень тяжело добиться чего бы то ни было - уж больно расплывчатое у нее было описание, да и использование ее в командных файлах ясности не добавляло.

С командой wl мне повезло больше. Начнем, хотя бы, с того, что по ней удалось найти какое-никакое описание. Правда, на сайте dd-wrt, но какое это имеет значение? Среди многочисленных операций, которые могла выполнять эта софтина, нашлась одна, которая вселила в меня надежду на положительный исход моих изысканий - это операция установки страны или региона country. Как человек осторожный, я решил сначала проверить, установка каких стран поддерживается, для чего, в полном соответствии с документацией, ввел команду:

 wl country list  

Ответ меня немного напряг - точный текст я не помню, но слово unsupported в нем точно присутствовало. Тогда я набрал другую команду:

 wl country  

В ответ на экране появилось всего две буквы, но какие - US. То есть, команда не просто работала, она еще и подтвердила мои предположения - регион WiFi установлен в США, и, следовательно, каналы 12 и 13 диапазона 2,4 ГГц, запрещены. Тогда, с замиранием сердца, я вбил следующую команду:

 wl country GB  

Система молча проглотила команду. Ну, по крайней мере, не выдала сообщение об ошибке. Тогда, для проверки, я вновь набрал:

 wl country  

Вот теперь все OK
И получил ответ - GB. Ура! Я только что сменил регион WiFi. Дело теперь оставалось за малым - проверить, как смена региона повлияет на возможность подключиться к моей домашней точке доступа, работающей на 13-ом канале. Я запустил браузер, нажал кнопку подключения и, через пару-тройку секунд напряженного ожидания, вздохнул с облегчением - моя точка доступа появилась в списке. Кое-что мне, конечно, не понравилось - не смотря на то, что я был совсем недалеко от роутера, сигнал моей точки показывался почти как нулевой, хотя, для соседских точек были указаны вполне нормальные уровни сигнала, обычные для них.

Но нам ли быть в печали. Я только что сам докопался до решения проблемы на Linux! Надо подключиться к моей точке доступа. Но для этого надо было кое-что изменить в ее настройках. Дело в том, что я не использовал роутер в качестве DHCP сервера, я вообще отключил этот компонент и всем своим домашним устройствам назначал статические адреса. Но с SWP дело несколько осложнялось. Мне понадобилось довольно много времени только для того, чтобы вбить три слова - wl country GB. Сколько же времени мне потребуется для того, чтобы разобраться, как назначить статический адрес этому устройству, когда он подключится к внешней точке доступа? При одной мысле о том, что снова придется ковыряться во всех этих хитросплетениях, мне стало не по себе. Конечно, это очень позновательно и интересно, но... И я смалодушничал - решил, что лучше, хотя, правдивее, конечно, сказать, проще, я изменю немного конфигурацию своего роутера. И включил на нем DHCP сервер, выделил небольшой диапазон, из которого сервер мог выбирать и назначать подключающимся клиентам адреса. После этого я вернулся в браузер, показывающий интерфейс моего SWP, выбрал свою домашнюю сеть, вбил пароль (она же у меня защищена) и... все прошло гладко, SWP подключился, стал виден другим клиентам сети, а подключённый к нему ноут смог выйти в интернет. То есть, все заработало.

Вот он, мой SWP
Все, да не все. Я смог подключить SWP к своей домашней сети. Но согласитесь, каждый раз входить через telnet чтобы переключить регион, это не очень красивое решение. В идеале было бы здорово, если перед подключением к внешней точке доступа WiFi драйвер SWP уже был переведен в режим нужного региона. Я нашел, как мне кажется, командный файл, который отвечал за подключение к внешней точке доступа. Но затем я подумал, что в перед каждым подключением тоже нет необходимости изменять регион, ведь, будучи один раз измененным, он уже самостоятельно не вернется в первоначальное значение. Только после перезагрузки. Поэтому изменить регион надо именно в процессе загрузки, по принципу: изменил - и забыл.

И снова поиск в интернете, куда лучше добавить нужную команду, чтобы во время загрузки получить необходимый эффект. Сначала я попробовал создать файл rc.local и поместить в него нужную команду. Но ничего не вышло. Я не стал разбираться, почему не получилось. Просто потому, что понял - место, куда надо добавить команду, на самом деле уже давно мною найдено. Это тот самый файл S85Network_start, который был обнаружен мной еще в начале пути. Не долго думая, я просто добавил в него команду по смене региона. Вот, что получилось:

Содержимое файла после редактирования
Подключенный SWP
в браузере
Само изменение этого файла тоже представляло из себя целое приключение. На SWP есть только один текстовый редактор - это vi. Мне довелось с ним работать году наверное 88 или 89. Да-да, еще в прошлом веке. И если бы не интернет с гуглом, вряд ли я вспомнил, как этим редактором пользоваться. Но и это препятствие было преодолено. Потом я установил свою домашнюю сеть в качестве предпочтительной для подключения - есть такая настройка у SWP, и перегрузил устройство. Дождался, когда синий диод перестанет моргать и будет гореть постоянно - это признак того, что загрузка завершена и точка доступа SWP поднята. К своему удовлетворению, я увидел и саму точку доступа внешнего диска, и нового клиента в своей домашней сети, и смог просмотреть публичные каталоги на нем с ноутбука, так же подключенного к домашней сети.

Содержимое SWP в
Total Commander

В общем, все получилось. Напоследок, я отписался на официальном форуме, в треде, автор которого просил внести возможность выбрать регион для WiFi в прошивку. Может, ему удастся повторить мой путь.

Вот такие вот дела...

Комментариев нет:

Отправить комментарий