Wi-Fi в Linux. Краткий курс

Загрузка ...
Wi-Fi. Linux. Краткий курс

Владимир Попов
2005.12.27

POSIX.ru

7 июня 2007 г

"А оно вам надо?"

Вполне вероятно. Уж очень неуместны бывают сетевые кабеля, когда хочется полистать какой-нибудь online-magazin в шезлонге на балконе... Тем более, что декларируемые 54 Mbit/sec OFTM "выливаются" во вполне приличные 20Mbit/sec. Не говоря уже о тех случаях, когда прокладка кабеля просто не представляется возможной или уж вовсе "лениво" дырявить очередное шлакобетонное перекрытие. С учётом нынешней стоимости оборудования Wi-Fi (~20$ за адаптер и ~70$ за аналог hub-а) ответ во многих случаях очевиден: полюбопытствовать - стоит.

802.11?

С учётом продекларированной "краткости", остановимся лишь на стандартном, в настоящее время, 802.11g (54 Mbit/sec OFTM), добавив лишь, что адаптеры 802.11g в абсолютном большинстве случаев поддерживают и 802.11b (11 Mbit/sec). При обсуждении защиты не удастся также обойти вниманием 802.11х, но об этом - ниже.

А почему, собственно, - Linux? К сожалению, реализация что поддержки устройств, что протоколов обеспечения безопасности выполнена в благородном *-nix семействе по-разному. Не пытаясь, в соответствии с рекомендациями К. Пруткова "объять необъятное", придётся ограничиться Linux. Тем более, что можно констатировать: в Linux поддержка адаптеров, для которых и не для всех-то версий m$win находятся драйвера, решена довольно успешно.

И почему - кратко? В соответствии с вышеупомянутыми рекомендациями К. Пруткова. В затронутой теме отдельного разговора заслуживают, как минимум: использование NDIS-драйверов под Linux, технические аспекты Wi-Fi, создание ip-туннелей, вопросы аутентификации и шифрования... Но, поскольку необъятное объять всё-таки не представляется возможным, то лучше быть кратким.

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

"Что есть сие?"

Для простоты и всё той же краткости будем считать, что Wi-Fi - тот же Ethernet, только без кабелей. Хотя, справедливости ради, стоило бы вспомнить, что первые устройства разрабатывались не как "расширение", а, скорее, как альтернатива последнего. Но, это - дела минувшие, а нынче адаптер с точки зрения ОС представляется как сетевой, к которому приложимы все обычные средства управления и конфигурирования "a la" ifconfig и т.д.

При ближайшем рассмотрении, однако, различия всё-таки обнаруживаются. Так, для соединения адаптеров Ethernet нужен, как минимум "кросс-кабель", а лучше - hub. То, что с Wi-Fi кабель не нужен - разумеется, но, оказывается, вместе с ним пропадает и ограничение "только два - или hub". Несколько Wi-Fi адаптеров легко могут общаться между собой. У них это называется "Ad-Hoc". Отметим этот режим как "вариант", но зададимся вопросом: а зачем тогда нужен упомянутый выше аналог hub-а? Причин несколько, и чисто физические (большая пропускная способность и лучшая, как правило, реализация радио-тракта) при этом не главные. Важнее то, что Access Point (AP - для краткости. Именно так называется этот самый аналог hub-а) - ключевой участник организации защиты сети. Режим с AP называется "Infrastructure" и имеет средства защиты, отсутствующие для режима Ad-Hoc. К тому же, хорошо бы иметь возможность объединить нашу сеть Wi-Fi с какой-нибудь локальной. Опять же: AP представляется для этого более подходящим устройством, чем IBM PC с парой сетевых карт, одна из которых - Wi-Fi.

Сложив всё необходимое для работы AP в одну коробочку, производитель задумался: а не назначить ли её ещё и роутером/файрволом "по совместительству"? Ведь, практически, всё необходимое уже внутри... Так появились Wi-Fi роутеры, которые, помимо функций AP, имеют порт для подключения модема кабельного, ADSL и прочих в этом роде, обеспечивающих соединение с Сетью. Если учесть, что такой роутер, практически, не дороже обычной AP, то решение имеет хорошие маркетинговые перспективы. Знакомимся поближе...

Включаем.

"Монтаж" PCI-, USB- или PCMCI- адаптера опускаю: по-моему, такая информация унижает читателя. Теперь нужно обеспечить поддержку данного устройства. В Linux, как известно, это достигается загрузкой соответствующего модуля. Как правило: даже нескольких, но "затребовав" с помощью modprobe нужный, можно быть уверенным в загрузке и всех, ему необходимых. Это не совсем так для PCMCI и USB: тут кое о чём нужно позаботиться самому... Однако, о чём это я? RTFM, поскольку сейчас речь о Wi-Fi.

Один из вариантов получения нужного "драйвера" я всё же упомяну - ndiswrapper. Вспомним, что производитель, как правило, снабжает свой адаптер нужным драйвером и мы даже оплачиваем его при покупке. Драйвер этот, как правило, для m$win, и уж, наверняка, в виде двоичного файла. Обидно, но делать нечего. Кроме как попытаться использовать этот драйвер. Для меня это второй известный случай успешного использования проприетарного ПО, презентуемого в двоичном виде, под Linux (первый - кодеки в mplayer). Итак:

Собственно - всё. Модуль может быть и другим, разумеется, если вы, например, - счастливый обладатель адаптера, поддерживаемого ядром Linux, но цель прежняя - получить сетевой интерфейс, идентифицируемый (следовательно: и - конфигурируемый) стандартными средствами.

Соединяемся.

Итак, сетевой интерфейс имеем. Опять, однако, придётся вспомнить, что это "не совсем ethernet". Или: ethernet, но "радио". На следующем этапе потребуются утилиты Жана Турилеса (Jean Tourrilhes), известные как "Wireless Tools". Их немного, а нам, для начала, хватит и вовсе двух: iwlist и iwconfig. Запускаем:


iwlist wlan0 scan

и, если в доступном эфире адаптером обнаруживаются сигналы Wi-Fi, то на экране можно будет прочесть достаточно подробный протокол. Источником сигнала может быть только AP или другой адаптер, разумеется. С AP, обычно, прилагается утилита конфигурации, которой можно воспользоваться , "достучавшись" до AP через сетевой интерфейс или последовательный порт (уж какой у данной AP есть). А вообще-то, какой-то сигнал AP выдаст в эфир по включению и без настройки - и достаточно для начала. Ну, а если решитесь сразу настраивать AP, то совет только один: не надо сразу включать средства защиты. Никакие.

В отсутствие AP сигнал нам может подать только другой адаптер (очевидно, что в отсутвие AP, адаптеров у вас должно быть два, как минимум). Только вот адаптер-то по умолчанию выдавать ничего не будет. Переходим к другой утилите - iwconfig. Вообще-то iwconfig - нормальная консольная утилита, первым параметром ожидающая имя интерфейса, а последующими - команду с параметрами. Команд этих сравнительно немного и с их помощью можно сделать всё необходимое (нужно только не забыть, что большая часть команд выполняют настройку адаптера, включает же его, фактически, только одна - essid. Получается: именно она должна быть последней в последовательности действий).

Привычнее, однако, настройка Wi-Fi выглядела бы при загрузке: как это вам уже, надеюсь, удалось для драйвера адаптера и сетевого интерфейса. Трудности здесь обычные: проистекающие от разнообразия дистрибутивов. Для начала стоит выяснить: а нет ли в вашем дистрибутиве этих самых "Wireless Tools"? Поскольку, если есть, то, вероятнее всего, мейнтейнер уже включил в пакет файлы настройки и скрипты, нужные для настройки и включения Wi-Fi. Если нет, то (спасибо Жану) придётся почитать DISTRIBUTION.TXT, являющийся частью source-пакета. Сложного там ничего нет: всё сводится к определению нескольких параметров в качестве переменных среды и последовательному запуску iwconfig. Параметры все описаны (man iwconfig), а на настоящем этапе потребуются совсем не многие:

К остальным параметрам, включая вскоре потребующийся нам "Encryption key", вернёмся чуть позднее.

iwconfig без параметров всегда покажет состояние интерфейсов Wi-Fi. После выключения настроенного адаптера (аппаратно ли, из-за "пропадания" AP в режиме Infrastructure) заново включить его можно командой:

iwconfig wlan0 essid your_essid

где wlan0 - имя сетевого интерфейса, а your_essid - имя вашей сети.

Пока - всё. Итого, на данном этапе имеем:

Надеюсь, так оно и есть. Ну, а есть ping - получите и всё остальное. В соответствии с наличием в вашей сети сетевых сервисов и настроек маршрутизации. К Wi-Fi это отношения уже не имеет.

Защищаемся

Способы защиты передаваемой информации стали неотъемлемой частью стандарта 802.11 по вполне очевидной причине: в иллюзию защищённости кабеля ethernet пользовател поверит намного охотнее, чем в защищённость данных, передаваемых через эфир. Правильно, в общем-то. Хотя более незащищённой сети, чем сегмент ethernet, охватывающий жилой дом или бизнес-центр, просто не бывает: не нужно быть хакером, чтобы знать о существовании у ethernet-адаптера "promiscuous mode", а ПО перехвата и парсинга пакетов даже писать не придётся: "бери - не хочу". Ещё один, достойный сожаления, пример - домашний компьютер, подключённый к Интернет со всеми мыслимыми и немыслимыми клиентами (в терминологии m$win), запущенными сервисами и открытыми на этом соединениипортами. Да мало ли ещё опасностей, намного более неожиданных, чем "перехват" пакета Wi-Fi, ожидает неискушённого пользователя в мире ip?... Ну, да это его проблемы. Вернёмся к 802.11.

Поскольку инженеры из IEEE, разрабатывая протокол, ориентировались всё-таки не на "самоделкиных", расставляющих hub-ы в открытых помещениях и не на win'98, нежданно-негаданно подключенную к Интернет, то о защите они были обязаны задумываться с самого начала. Однако: недостаточно, как вскоре выяснилось. Так называемый WEP (wired equivalent privacy), использующий алгоритм шифрованиф RC4 при длине ключа 40/104 бит очень скоро стал материалом для хрестоматийного примера взлома защиты. Wi-Fi Alliance опять бросился дорабатывать протокол (работа закончена в июле 2004-го), параллельно предлагая временные альтернативы, такие как WPA (Wi-Fi Protected Access). Проблема заключается в том, что новый стандарт должен стать правилом для множества производителей, поставляющих аппаратуру Wi-Fi. Перепрошивка потребуется десяткам миллионов уже существующих устройств, а тем, для которых перепрошивка невозможна, просто потребуется замена. По-моему, ребята немного "влипли"...

Что же, откажемся от таких привлекательные возможностей, пока производители не защитят Wi-Fi должным образом? Не думаю. Во-первых, возможность взлома ещё не означает его высокой вероятности. И PGP можно взломать, только для этого нужны довольно приличные вычислительные мощности. И то, что "легко" для ФБР, окажется "не по зубам" соседскому "хакеру". Нужно только прикинуть, кому может понадобиться ваша сеть и для чего. Так что, предлагаю оценить арсенал средств защиты и решить, что стоит использовать, а что - нет. Итак, имеем:

Наверняка существуют и ещё. Почему бы нет, если под Linux возможно создание виртуальных туннелей хоть для фреймов ethernet, хоть для ip-пакетов. "Твори, выдумывай, пробуй". Вот только необходимость иметь хотя бы клиентов для m$win, ограничивает это разнообразие. Что ни говори, а при обсуждении вопросов коммуникаций, игнорировать существование win-хостов глупо...

Короче: выбрать есть из чего. И выбрать - нужно. Даже при полном пренебрежении к вопросам защиты не стоит всё-таки уподобляться оператору кабельных сетей, который вместо прокладки кабеля предлагает применить Wi-Fi (за "не слабые", кстати, $200). И только месяц спустя вы обнаруживаете, что к установленной на лестничной площадке AP ЛЮБОЙ Wi-Fi клиент подключается АВТОМАТИЧЕСКИ. Оператору-то всё равно: трафик оплатит подписавший договор, а вам?

Практикум

Ну, и несколько примеров...

Приведенные примеры - лишь иллюстрация того факта, что имеется довольно много способов применить Wi-Fi с пользой. Не исключено, что для кого-нибудь - уже сейчас.

Wi-Fi. Linux. Краткий курс — 2

Владимир Попов

7 июня 2007 г

Intro

Нижеследующее можно считать продолжением "Краткого курса" (Wi-Fi. Linux. Краткий курс), написанного полтора года назад. Поэтому, во-первых, не буду повторяться и, во-вторых, постараюсь остаться в рамках продекларированной краткости.

Итак, исходим из того, что wi-fi адаптер мы подключили, Wireless Tools Жана Турилеса (Jean Tourrilhes) пользоваться научились и даже связали два компьютера в режиме Ad-Hoc. Используемая защита при этом — WEP, поскольку никакой другой в данном режиме и не бывает. Теперь предположим, что то ли Access Point-ы резко подешевели, то ли благосостояние повысилось, то ли очередное "окабеление" в офисе решено заменить переходом на wi-fi — мало ли. Но дальнейшие наши упражнения будут касаться этих самых AP.

WPA

И первое преимущество, которое мы получаем вместе с AP, это то, что можем использовать WPA (Wi-Fi Protected Access) — усовершенствованный протокол безопасности, пришедший на смену WEP (Wired Equivalent Privacy). Если быть точным, то этих WPA даже два: WPA и WPA2 (промежуточная и окончательная реализации стандарта IEEE 802.11i). Говорить кратко о методах защиты — неблагодарное занятие. В рамках "Краткого курса" достаточно знать, что всё крутится вокруг того, как шифровать трафик и как генерировать для этого шифрования ключи. Выбор будут ограничивать AP, которая, как и я "не может объять необъятное" и всегда имеет конечную функциональность, и ваши ресурсы, которые могут позволить иметь независимые генераторы ключей и сервера аутентификации или — нет.

Если с AP мы в общем-то ничего особенного сделать не можем (рассчитывать на upgrade только что купленного устройства, как правило, не приходится), то с компьютерами — просто обязаны, поскольку далеко не все дистрибутивы Linux включают в себя поддержку WPA по умолчанию. Пакет, который нам нужен уже упоминался: wpa_supplicant. А будете вы его собирать сами или воспользуетесь прекомпилированным — дело ваше.

Дальнейшие действия сводятся к настройке wpa_supplicant, разнообразной настолько, насколько разнообразны методы защиты wi-fi соединения. К счастью, пакет включает в себя подробную документацию и примеры, практически полностью вышеупомянутое разнообразие покрывающие. И всё бы хорошо, если бы не разнообразие дистрибутивов. Часть дистрибутивов (преимущественно sorce based, c BSD-стилем загрузки) используют wpa_supplicant примерно так, как рекомендуют авторы (конфигурационный файл /etc/wpa_supplicant.conf и запуск при загрузке в режиме демона: wpa_supplicant -eth0 -c/etc/wpa_supplicant.conf -d). Остальные (преимущественно прекомпилированные, с загрузкой в стиле Sys V) используют, как правило, свои конфигурационные файлы и скрипты, запускающие, в свою очередь wpa_supplicant и wpa_cli (консольный фронтенд к wpa_supplicant).

При всей симпатии к дистрибутивам sorce based и нежелании изучать причудливую логику создателей дистрибутивов прекомпилированных, не могу не заметить, что Linux уже популярен настолько, что программисты и администраторы, для которых знание "почему и как" — обязанность, нынче явно в меньшинстве. Так что придётся и мне "отступить от принципов" и иллюстрировать сказанное на примере Ubuntu (6.10 LTS Dapper).

Африка...

Конечно, хорошо бы такому "дружественному к пользователю" дистрибутиву и настраиваться без его [пользователя] участия. Тогда и говорить было бы не о чем, но... Первый же ноутбук с Ubuntu, попавший ко мне для настройки wi-fi, оказался к автоконфигурированию этого самого wi-fi не способным. Вот возможные причины, кратко:

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

Оптимистический взгляд на происходящее состоит, однако, в том, что хотя для "простого пользователя" wi-fi под Linux ещё не скоро станет "само собой разумеющимся", любитель "поковыряться" в ПО увидит в этом захватывающее развлечение. Ну, чем хуже преферанса (не говоря уже о шахматах)?

Так вот, для вышеупомянутого ноутбука потребовалось:

Если вы ещё не забыли, то на сей раз мы говорим об AP и, соответственно, о режиме Managed, а не Ad-Hoc. Тогда соответствующий фрагмент /etc/network/interfaces булет выглядеть как:

iface eth1 inet dhcp
wpa-driver wext
wpa-ssid *your_wpa_essid*
wpa-ap-scan 1
wpa-proto WPA
wpa-pairwise TKIP
wpa-group TKIP
wpa-key-mgmt WPA-PSK
wpa-psk *your_HEX_passcode*

Как нетрудно заметить, на сей раз используется dhcp, входящий в состав AP. А вот что означают параметры, передаваемые wpa_supplicant:

Поскольку wpa_supplicant — демон (в отличие от утилит из состава Wireless Tools), то трудности с асинхронным аппаратным включением адаптера снимаются: загрузка с выключенным адаптером проходит нормально, аппаратное включение инициирует получение ip-адреса, выделяемого DHCP сервером вне зависимости от того происходила загрузка с включённым или выключенным адаптером. Я бы сказал, что такой вариант — наиболее близкий аналог поведения ОС семейства MS Windows: настраиваем "ручками" — пользуемся "полуавтоматом" (переключение между сетями — вручную).

А — попроще?

Можно. Даже — нужно. Потому как затем и wi-fi у ноутбука, чтобы можно было им воспользоваться дома, на работе, в аэропорту, гостинице и т.п. Создавать соединение описанным выше способом где-нибудь в интернет-кафе выглядит явным извращением. И попытки упростить, если не полностью автоматизировать этот процесс ведутся.

Прежде всего, в рамках "unix-way" напрашивается создание надстроек над безукоризненными, в общем-то, в своём качестве Wireless Tools и wpa_supplicant. По этому пути пошли создатели wifi-radar. Python и Gtk-2 — вполне подходящие для этой задачи инструменты. Мне, правда, пришлось немного повозиться, пока я добился от wifi-radar работоспособности, но — возможно. Знай, следи за "эфиром" и подключайся к наиболее подходящей в данный момент сети. Некоторые трудности, однако, остаются. Всё то же асинхронное аппаратное включение, например. Есть, одним словом, над чем работать.

И — работают. В недрах Gnome разрабатывается так называемый NetworkManager — демон, задачей которого является поддержание активного сетевого соединения при любых условиях. NetworkManager использует wpa_supplicant, но уже не использует Wireless Tools. Демон этот ориентирован исключительно на десктопы (на ноутбуки — прежде всего), интегрирован с hal и dbus (что не позволяет ему работать в "чистой" консоли), и, вообще... специфичен. Не unix-boy, я бы сказал. Но и задача — специфична. Приходится считаться.

NetworkManager настолько специфичен, что обычной инсталляцией отделаться не удастся. Загрузив пакет (а заодно и его фронтенды: апплет network-manager-gnome для Gnome или knetworkmanager для KDE), потребуется:

Интеграция с hal/dbus не всегда обеспечивает желаемый результат. Так, вполне может оказаться, что, после загрузки с аппаратно выключенным адаптером, NetworkManager ни одной Wireless Network вам не предложит: сколько этот адаптер ни включай/выключай. Разумеется, sudo /etc/init.d/dbus restart спасает положение, но это значит, что и при наличии NetworkManager опять потребуется иконка-запускатель и редактирование /etc/sudoers (рано или поздно вам надоест вводить пароль при каждом включении сети).

Несколько огорчают бессмысленные попытки поиска "пропавшей" сети, после того, как вы аппаратно выключаете адаптер, но продолжается это сравнительно недолго. При повторном включении адаптера соединение автоматически не восстанавливается (как можно было бы ожидать): приходится "вручную" выбирать нужную сеть. Из этого можно сделать вывод, что аппаратное включение адаптера не является событием для hal а, следовательно, и dbus нечего передавать апплету NetworkManager-а. Подход wpa_supplicant (периодической опрос) оказался в данном случае более эффективным.

Ещё одна неприятная мелочь — это то, что ключ доступа к сети nm-applet хранит в так называемых "брелоках" (keyrings), для доступа к которым тоже нужно пройти идентификацию. Так что даже избавившись от запроса пароля на выполнение необходимого каждый раз после аппаратного выключения адаптера (sudo /etc/init.d/dbus restart), По крайней мере один раз (при первом включении) потребуется идентифицироваться для доступа к своему keyrings. Справедливости ради отмечу, что в следующей версии Ubuntu (7.04) уже имеется достаточно известный пакет pam_keyrings (известный в Debian и его клонах как libpam-keyring), который автоматически выдаёт пароль регистрации пользователя в ответ на запрос идентификации к keyring. Для Ubuntu Dapper (6.10) можно самому странслировать pam_keyrings, но только исходники нужно взять версии 0.8.

На этом этапе можно попытаться сохранять работоспособность NetworkManager при переходе в suspend или hibernate. Для этого нужно создать файл /etc/acpi/suspend.d/07-network-manager.sh с содержимым:

#!/bin/sh
/etc/dbus-1/event.d/25NetworkManager stop
и файл /etc/acpi/resume.d/63-network-manager.sh с содержимым: #!/bin/sh
/etc/dbus-1/event.d/25NetworkManager start

Наибольшим же недостатком NetworkManager, является, на мой взгляд то, что он не обеспечивает соединение в режиме Ad Hoc. И, хотя, по оценкам экпертов этот режим используют менее 10% провайдеров wi-fi сервиса, лишиться в аэропорту доступа к Сети только потому, что сеть зала ожидания попала в эти 10% — обидно.

Проблема известна. Желающие могут даже воспользоваться патчем, предлагаемым Роберотом Лав (Robert Love) и, будем надеяться, что в очередной версии NetworkManager соединение в режиме Ad Hoc не будет проблемой.

А пока NetworkManager не вполне соответствует нашим пожеланиям для запрета его работы (без деинсталляции) нужно сначала остановить его командами:

sudo /etc/dbus-1/event.d/26NetworkManagerDispatcher stop
sudo /etc/dbus-1/event.d/25NetworkManager stop
А затем создать два файла: /etc/default/NetworkManager
/etc/default/NetworkManagerDispatcher
Поместив в них по одному слову: exit. Coda

Выводы из этого всего достаточно обычны при оценке Linux-ПО:

Последнее, кстати, не означает невозможности появления как бесплатных, так и коммерческих продуктов, использующих идеи или конкретные разработки, зародившиеся в мире open source.