Как стать автором
Обновить

Создаем точку доступа Wi-Fi под Linux из USB модема

Время на прочтение 7 мин
Количество просмотров 61K
image

Все началось, когда я заменил материнскую плату в своем домашнем компьютере. В старой плате был встроенный USB Wi-Fi адаптер на обычном Realtek 8187, который два года исправно работал точкой доступа под Windows. В новой плате Wi-Fi модуля не было, зато у меня появился целый сервер на замечательном Intel Atom 525 с одним маленьким недостатком — в нем было очень мало PCI слотов.

Немного поразмышляв, я решил сделать невинную, как мне сначала казалось вещь — запустить программную Wi-Fi точку доступа на обычном USB адаптере. Если бы меня предупредили что меня ожидает, я бы отказался от идеи с самого начала! Я раздобыл недорогой адаптер и, только в процессе возни с ним, стал осознавать что использование «неправильного» USB на «неправильном» чипсете это настоящее насилие для Linux! Гуру Линукса отказывались от помощи!

Тем не менее, мне удалось подружить Debian 6.0 с чипсетами Ralink 2870/3070 и Atheros 9170, и я готов раскрыть эту страшную тайну всему миру!


Предисловие


В последние годы Wi-Fi система в ядре Linux подверглась серьезной доработке. Идея была очень простой — разбить подсистему на модули, вынести повторяющиеся процедуры MAC уровня в отдельные модули ядра и отдельные демоны и переписать заново драйвера физических устройств. Так появилась пачка компонентов, про которые можно почитать на сайте разработчиков: wireless.kernel.org/en/users/Documentation

Как это часто бывает, красивые теории подверглись воздействию суровой прозе жизни. В нашем случае это выглядит так: для каждого чипсета Ralink 2870/3070 и Atheros 9170 в ядро включены две версии драйверов — «old school», которые работают из коробки, но не могут быть запущена в режиме Master (режим для запуска Access Point) и новые «net-link style» которые все умеют но не работают из коробки. По-умолчанию взаимоисключающие драйвера пытаются запуститься одновременно с печальным результатом. Но довольно сетований, скорее за дело!

Запускаем драйвера. Wi-Fi, просто Wi-Fi


Если вы обычный пользователь, и хотите просто подключаться к имеющимся Wi-Fi сетям, то на Debian 6 (и других подобных убунтариях) вам нужно сделать следующее:

Для чипсета RT2870/3070 на коем собраны популярные Dlink DWA-140, TL-WN727N рекомендую оставить драйвер старого стиля rt2870sta, к которым не забываем скачать firmware.

apt-get install firmware-ralink wireless-tools

Далее идем в /etc/modprobe.d/blacklist.conf и блокируем запуск драйверов нового стиля:

blacklist rt2x00usb
blacklist rt2x00lib
blacklist rt2800usb


После чего можно подключить USB свисток и внимательно посмотреть dmesg. Если в нем будут писать про конфликты драйверов, то вы ошиблись или не запретили все конфликтующие драйвера. Если будет написано про отсутствие firmware, значит у вас отсутствует firmware (чертовски неожиданно?). Наберите ls -l /lib/firmare должно быть что то типа такого:
-rw-r--r-- 1 root root 8192 Мар 6 22:34 rt2561.bin
-rw-r--r-- 1 root root 8192 Мар 6 22:34 rt2561s.bin
-rw-r--r-- 1 root root 8192 Мар 6 22:34 rt2661.bin
-rw-r--r-- 1 root root 8192 Мар 6 22:34 rt2860.bin
-rw-r--r-- 1 root root 8192 Мар 19 11:46 rt2870.bin
-rw-r--r-- 1 root root 4096 Янв 4 05:40 rt2870.bin.old
-rw-r--r-- 1 root root 8192 Дек 28 2009 rt2870.bin.ralink
-rw-r--r-- 1 root root 4096 Мар 6 22:34 rt3070.bin
-rw-r--r-- 1 root root 4096 Мар 6 22:34 rt3071.bin
-rw-r--r-- 1 root root 8192 Мар 6 22:34 rt3090.bin
-rw-r--r-- 1 root root 2048 Мар 6 22:34 rt73.bin

Пытливый читатель наверно заметил подвох, мы еще вспомним о нем.

Для Ar9170 аналогичная процедура. На нем собраны Dlink DWA-130, 160 а так же очень популярный в узких кругах TL-WN821N v2. В мои же руки попал Netgear WNA1000.

apt-get install firmware-atheros wireless-tools

Блеклистим carl9170 и вперед!

Потом идем в /etc/network/interfaces и пишем там нечто вроде:

iface wlan0 inet static
       address 192.168.1.1
       netmask 255.255.255.0
       network 192.168.1.0
       broadcast 192.168.1.255


Запускаем ifup wlan0. Далее какой нибудь графической утилитой можно подключиться к сети. Для окончательной настройки подойдет, например, «Network manager»

Если у тебя, уважаемый хабраюзер уже замигал Wi-Fi и больше ничего не требуется, то смело закрывай тему.

Запускаем драйвера. Сильные духом


Итак, настойчивый хабраюзер, несмотря на скепсис признанных гуру, мы все еще хотим запустить USB Wi-Fi в режиме точки доступа.

Для начала два простых совета по выбору адаптера:

Теперь вычеркнем все рекомендации из раздела «просто Wi-Fi»! 90% блогов в интернете забиты этой ерундой. Мы будем отключать драйвера старого стиля и запускать новые, которые ни черта не работают из коробки даже в новейших версиях ядер, а значит пришло время компиляции. Пока ты читаешь эту хабрастатью, разработчики наверняка исправили 1-2 бага в драйверах и добавили новый, а значит качаем самую свежую версию compat-wireless: www.orbit-lab.org/kernel/compat-wireless-2.6

Она совместима с драйверами начиная от 2.6.14
Далее следуем инструкциям: wireless.kernel.org/en/users/Download/stable
Компилируется все очень долго игнорируя флаг включения многопоточности:
declare -x CONCURRENCY_LEVEL="4"

После компиляции и инсталляции не забываем отключить старый стиль в /etc/modprobe.d/blacklist.conf
blacklist rt2870sta
blacklist ar9170usb


И конечно не забываем выгрузить ранее загруженные драйвера:
rmmod rt2870sta
rmmod ar9170usb


Драйвера нового стиля корректно выгружать так (пригодится при отладке):
rmmod rt2800usb
rmmod rt2800lib
rmmod rt2x00usb
rmmod rt2x00lib
rmmod mac80211
rmmod cfg80211


или так:
rmmod carl9170
rmmod ath
rmmod mac80211
rmmod cfg80211


Страшная тайна firmware!


Кажется все. Запускаем modprobe … и полное разочарование! В логах опять ругается на firmware. Дело в том что новые драйвера имеют и фирмваре другое. Для Ralinka идем сюда: www.ralinktech.com/support.php?s=2 и скачиваем нечто вида RT2870_Firmware_V22.
Распаковываем и пишем в /lib/firmware, удивляясь как это файл с одинаковым именем может отличаться ровно в два раза по размеру! Внимательный читатель уже отметил этот факт раньше. Дело в том, что несколько месяцев назад разработчики объединили драйвера для чипсетов rt2870 и rt3070 в один. Не мудрствуя лукаво назвали драйвера и фирмваре по имени 2870. Вы видели на странице Ралинка фирмваре 3070? И я не видел, а оно там есть! Адаптер DWA-140 сделан на чипсете 3070 и распознается драйверами rt2800usb.

С Атеросом немного проще, идем на страницу разработчиков и скачиваем свежую версию: wireless.kernel.org/en/users/Drivers/carl9170#Firmware

Чтобы точно разобраться с фирмваре, смотрим что хочет модуль драйвера, например:
modinfo carl9170 | grep firm

А потом проверяем что необходимое фирмваре есть:
ls /lib/firmware/

Далее уже привычные манипуляции с rmmod, modprobe и lsmod и ура! Мы подняли правильные драйвера, а значит пришло время набрать заветную команду
iwconfig wlan0 mode Master

Бах! Ошибка! SET failed on device wlan0 ; Invalid argument. Неужели все было проделано зря? Конечно нет. Просто у новой подсистемы свой путь, и как это часто бывает с новым и хорошим, он категорически отрицает старое и хорошее. На форумах этот вопрос обсуждают примерно так:
— Why?
— RTFM!
— Cам ты RTFW! Небо, небо не видело такого кю!

Мануал сообщает нам что отныне все настройки для точки доступа делаются через программу hostapd: wireless.kernel.org/en/users/Documentation/hostapd

Подключаем репозиторий sid в Дебиан (во всех остальных безнадежно старые версии) и ставим новые утилиты работы с радио fw и демон hostapd
apt-getinstall iw hostapd

После чего пишем iw list и видим заветные Supported interface modes: AP, а заодно и список частот.

Танцы с бубном. Hostapd


Перед началом настройки конфига нужно знать три важные вещи.
1. Внутри этого демона сидит маленький и вредный поганец, который непредсказуемым образом меняет состояние интерфейса в процессе запуска/перезапуска. Иногда wlan0 исчезает, иногда у него исчезает IP, иногда помогает ifdown ifup, иногда не помогает. Ralink в таких условиях совсем плох, Атерос чуть стабильнее. Поэтому перед любом запуске hostapd проверяем, что радиоинтерфейс поднят, и IP адрес на нем жив. Если не удается поднять интерфейс значит применяем насилие — ребутим Линукс! (Да да это не шутка!)

2. Все настройки сначала проверяем без шифрования! И не забываем проверять dhcpd, который тоже любит умирать при перезагрузке интерфейсов. Вот почему Linux + USB = ненависть! Лучше настройку hostapd проводить без dhcp, с фиксированным IP адресе на клиенте, и лишь в конце перейти к настройке dhcpd.

3. Для проверки всегда сначала запускаем hostapd -d /etc/hostapd/hostapd.conf c диагностикой в консоль.

Теперь конфиг hostapd с пояснением. ( Update: поправлены комментарии, # не работает в конце строки)
# где слушать
interface=wlan0

# линкуемся к ядру
driver=nl80211
# Если при загрузки ругается на nl80211, значит драйвер старой школы

# как увидят сеть клиенты
ssid=MyNet

# влияет на список каналов и мощность
country_code=RU
# Если хотите использовать каналы 12-14, поставьте JP ( Япония самая свободна страна в Wi-Fi), но устройство должно поддерживать эти возможности.

# включаем режим wi-fi. Hostapd версии 7+ умеет работать с N
hw_mode=g

# выбор канала, 1 обычно всегда занят, да и 11 тоже
channel=9  

# так надо!
auth_algs=1    
logger_syslog=-1
logger_syslog_level=3
logger_stdout=-1
logger_stdout_level=2
ignore_broadcast_ssid=0

# Если WPA2, то:
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=VeryLongPassword
rsn_pairwise=CCMP

# Если WPA,то
wpa=1
wpa_pairwise=TKIP
# и пароль 8 символов

После запуска прежде всего набираем ifconfig и видим что появился специальный интерфейс
mon.wlan0 Link encap:UNSPEC HWaddr 30-46-9A-00-6D-04-00-00-00-00-00-00-00-00-00-00
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:42603 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3887500 (3.7 MiB) TX bytes:0 (0.0 B)

Теперь в консоли (если запускали hostapd -d) смотрим что происходит в процессе аутентификации. Если настроен WPA и соединиение не проходит дальше фазы 2/4 значит ошибочно набран пароль. Там еще можно увидеть множество непонятных сообщений.

Лирическое отступление


Так получилось, что ковырясь с hostapd я потерял всякую надежду запустить свой Dlink DWA-140 на чипсете Ralink 3070. Мне совершенно точно удалось запустить его в работу без шифрования, но при включении шифрования или я допускал ошибку, или действительно этот модуль плохо взаимодействует с ядерными модулями шифрования ( на форумах я видел описание проблемы и одна из версий решения указывала на модули шифрования ecb и arc4).

Финальный аккорд с включением шифрования я уже реализовал на Netgear WNA1000 на чипсете Atheros 9170, который действительно лучше работает и корректно подгружает все модули шифрования.

Теперь я думаю что можно таки было запустить Ralink с шифрованием и призываю поставить жирную точку в том вопросе счастливых обладателей DWA-140. Пишите о своих успехах или проблемах в комментариях, попробуем разобраться вместе.

Вместо послесловия


Теперь у нас в кладовке или на шкафу тихо жужжит маленький сервер с USB Wi-Fi адаптером, можно насладиться проделанной работой. Но не тут то было! В современной многоэтажке нашпигованной точками доступа со всех сторон идут помехи. Чтобы выбрать канал я советую изучить эфир программой InSSIDer

Вот так выглядел выбор канала у меня вечерком у окошка:

image
Теги:
Хабы:
+96
Комментарии 47
Комментарии Комментарии 47

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн