Я уже изучал тему создания точки доступа wifi и в частности поддержки unix стандарта 802.11n в статье Обзор роутерного дистрибутива pfSense. Тогда у меня не получилось сделать wifi точку доступа, из-за ограничения железа и драйверов. И вот спустя почти год я решил снова поднять этот вопрос уже c новой сетевой wifi картой современного стандарта N. Все это делалось, чтобы заменить wifi роутер 802.11b/g стандарта с наименьшими затратами.
Чтобы не усложнять статью принял самую простую структуру сети и вводные данные:
- Один проводной интерфейс подключен к провайдеру сети интернет
- Wifi miniPCI должна подключать клиентов в режиме точки доступа
- Подключенные по wifi клиенты должны иметь возможность выходить в интернет
- Настройка сервера для других клиентов кроме wifi (например по второму проводному интерфейсу) не будет
Примечание: Данная статья ориентирована на пользователей уже знакомых с системой linux. Некоторые вещи в статье будут упущены или расписаны не так подробно. В любом случае все что неясно можно спросить в комментариях к статье.
Еще раз изучив многие документы поддержки чипов в unix я пришел к выводу, что для построения точки доступа (AP – Access Point) стандарта 802.11n лучше других поддерживаются чипы ralink и atheros. Насчет atheros смотрите чтобы была поддержка в ядре модулем ath9k или carl9170 и ни в коем случае не берите чипы atheros, которые поддерживаются драйверами madwifi!
Т.к. у меня аппаратная часть компьютера накладывала ограничения по высоте карты, то после долгих поисков была куплена карта EWM-W130M (также ее еще продают под названием Delock WLAN MiniPCI Modul 2T2R 300Mbps) на чипсете ralink 3062. Мне все это обошлось в 22€ и 1,5недели ожидания 🙂
Характеристики карты показать
Итак, карта вставлена, дистрибутив – мой любимый Slackware версии 13.37.
Поддержка чипсета ralink в ядре Linux
Не зная что меня ждет впереди 3 вечера чтения мануалов и танцев с бубном вокруг компьютера я радостно набрал команду
lspci -v
увидел, что сетевая карта определилась
01:06.0 Network controller: Ralink corp. Device 3062
Subsystem: Ralink corp. Device 3062
Flags: bus master, slow devsel, latency 32, IRQ 19
Memory at e8120000 (32-bit, non-prefetchable) [size=64K]
Capabilities: [40] Power Management version 3
Kernel driver in use: rt2800pci
Kernel modules: rt2800pci
Модуль ядра rt2800pci был загружен, но дальше ничего не заработало. Интерфейс карты не хотел подниматься, т.к. он не был создан. Я вручную выгрузил-загрузил модуль rt2800pci, но интерфейс сетевой так и не появился. Погуглив я понял, что в моем ядре 2.6.37.6 чипсет 3062 не поддерживается, а в ядре 2.6.39.4 поддержка чипсета уже была.
На конец 2011 года модулем rt2800pci официально поддерживаются следующие чипы:
RT2760, RT2790, RT2860, RT2890, RT3060, RT3062, RT3090, RT3091, RT3092, RT3390, RT3562, RT3592, RT5390
Насчет, что в каком ядре появилось не могу сказать, надо смотреть changelog ядер. Если у вас ядро 2.6.39 или новее и в dmesg нет никаких ошибок по загрузке модулей, то можете смело переходить к настройке программ hostapd, dhcpd, iptables.
Но если вы видите в syslog или dmesg
phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
то надо поставить firmware wifi карточки. Например для ubuntu это пакет firmware-ralink
sudo apt-get install firmware-ralink
после установки в каталоге /lib/firmware должны появиться файлы rtXXXX.bin.
Файлы последних firmware можно скачать отдельно для вашей карты с сайта ralink или найти ссылку на сайте http://wireless.kernel.org. После скачиваний firmware их достаточно скопировать в каталог /lib/firmware и перегрузить модуль ядра rt2800pci.
Выложил firmware для ralink, которые использовал у себя.
Установка модулей ядра ralink
К несчастью мне не повезло, да еще я пошел не в том направлении 🙂 Решив не обновлять ядро, я скачал драйвера чипсета с сайта ralink версии 2.4.1.1.
Забегая вперед скажу – это было ошибкой и построить точку доступа у меня не получилось.
После компиляции модуля ядра rt3062sta и его загрузки, интерфейс сетевой ra0 поднялся без проблем. Чтобы старый модуль rt2800pci не загружался при старте системы я его прописал в файл /etc/modprobe.d/blacklist.conf.
Фактически дальше этого у меня дело не сдвинулось. После детального изучения инструкций, шаманства с настройками компиляции модуля rt3062sta сетевая не хотела работать в режиме точки доступа. Максимум что можно сделать на этом модуле это поднять режим Ad-Hoc. Но данный режим строго ограничен по скорости и скоростей выше 802.11b/g из него не получить, плюс выяснилось что данный модуль даже в режиме Ad-Hoc не работает с шифрованием.. Подключаемые компьютеры просили пароль сети, но он не распознавался. А если делать Ad-Hoc с открытым доступом, то все подключалось.. Работа модуля rt3062sta в режиме клиента к другим точкам доступа не проверялась.
Вывод по работе rt3062sta (rt3562sta):
- Нет возможности работы сетевой в режиме AP
- Скорость работы Ad-Hoc только в режиме 802.11b/g
- Не работает режим шифрования в режиме Ad-Hoc
На этом выводе мой первый вечер настройки закончился 🙂 Специально описал все пункты здесь, т.к. информации в сети по этому делу я встречал крайне мало.
В итоге если ядро у вас старое, то надо либо его обновить до 2.6.39 и выше, либо поставить скомпилировать модули ядра из пакета compat-wireless. Самые последние (возможно нестабильные) драйвера compat-wireless можно скачать по ссылке. Но эти драйвера тоже имеют ограничение на версии ядра, не ниже 2.6.26, иначе они просто не соберутся.
Важно! Перед компиляцией compat-wireless требуется установить исходники (kernel-devel) своего ядра.
Распаковываем compat-wireless-2.6.tar.bz2 и собираем только модули нужного чипсета. Для моего случая rt2x00. Посмотреть все модули, которые включены в compat-wireless можно через скрипт
root@lex:/usr/src/compat-wireless-2011-12-13# ./scripts/driver-select
Вывод скрипта показать
компилируем и устанавливаем модули ядра rt2x00
root@lex:~# cd /usr/src/compat-wireless-2011-12-13
root@lex:/usr/src/compat-wireless-2011-12-13# ./scripts/driver-select rt2x00
root@lex:/usr/src/compat-wireless-2011-12-13#make
root@lex:/usr/src/compat-wireless-2011-12-13#make install
У меня модули ядра и их зависимости установились в папку /lib/modules/<версия текущего ядра>/updates. Старые модули ядра так и остались лежать на прежних местах.. Не знаю правильно ли я сделал, но я из папки updates заменил все старые модули на новые и выполнил команду
root@lex:depmod -a
Теперь в полной уверенности, что старые модули вычищены из системы можно перегрузиться, или вручную выгрузить старые модули и загрузить новые.
Обязательно смотрите ошибки в dmesg. Если ошибка про firmware, то в начале статьи я написал как это исправить.
Теперь при загрузке системы у меня стартуют модули
root@lex:~# lsmod | grep rt2
rt2800pci 7716 0
rt2800lib 37177 1 rt2800pci
crc_ccitt 1087 1 rt2800lib
rt2x00pci 4120 1 rt2800pci
rt2x00lib 30281 3 rt2800pci,rt2800lib,rt2x00pci
mac80211 325653 3 rt2800lib,rt2x00pci,rt2x00lib
cfg80211 151514 2 rt2x00lib,mac80211
eeprom_93cx6 1699 1 rt2800pci
а по команде iwconfig стал виден wifi интерфейс
wlan0 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Теперь можно в конфигах прописать ip и все что необходимо для интерфейса wlan0
В slackware прописываю в /etc/rc.inet1.conf
#Для Ralink3062
IFNAME[4]="wlan0"
IPADDR[4]="192.168.3.7"
NETMASK[4]="255.255.255.0"
USE_DHCP[4]=""
WLAN_WPADRIVER[4]="nl80211"
Теперь интерфейс будет подниматься с указанным ip при старте системы.
Настройка hostapd, dhcpd, iptables
Для организации точки доступа используется программа hostapd. На сайте hostapd можно найти последнюю версию. Я использовал последнюю на сегодняшний момент версию 0.7.3.
UPD Проверил работу этих конфигов на самой последней версии 1.0, которая вышла 10 мая 2012г. Так что все, что написано ниже применимо и к hostapd 1.0
Перед установкой программы требуется чтобы в системе стояли пакеты:
- libnl версии 1.1 (на последней версии 3.x hostpad выдавал ошибку при сборке)
- libnl-devel
- openssl-devel
Программу hostapd ставил из исходников, т.к. надо быть уверенным, что программа собрана с поддержкой нужных драйверов nl80211 и стандарта 802.11n (внимательно смотрите на описание пакета, если будете ставить из репозиториев). Также будет нелишним прочитать статью про установку и настройку hostapd.
Скопируем дефолтный файл defconfig в файл .config в папке hostapd
root@lex:/usr/src/hostapd-1.0/hostapd#cp defconfig .config
Затем раскоментируем строки в файле .config насчет драйверов и стандарта 802.11n.
CONFIG_DRIVER_NL80211=y
CONFIG_IEEE80211N=y
В итоге .config для hostapd у меня получился такой показать
Компилируем, собираем пакет, инсталлируем 🙂
Создаем файл конфигурации /etc/hostapd.conf.
interface=wlan0
driver=nl80211
macaddr_acl=0
logger_stdout=-1
logger_stdout_level=2
dump_file=/tmp/hostapd.dump
ssid=MY_SSID
channel=11
country_code=RU
hw_mode=g
wmm_enabled=1
ieee80211n=1
ht_capab=[HT40-][GF][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC2]
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=Password_wifi_key
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
Итак, небольшие комментарии к конфигу:
driver=nl80211 – так называется тип драйвера относящийся к типу mac80211. В таблице можно посмотреть кто подходит под этот тип. Чипсеты ralink подходят..
macaddr_acl=0 – точка принимает всех клиентов, если их mac адресов нет в “черном списке”. Файл “черного списка” по умолчанию находится в файле /etc/hostapd.deny. Также файл можно переопределить в конфиге переменной deny_mac_file=/etc/имя_файла. Если указать macaddr_acl=1, то будем отклонять каждого клиента кто не задан в файле accept_mac_file=/etc/hostapd.accept.
ssid=MY_SSID – имя точки доступа.
channel=11 – тут всем понятно что это :), но обратите особое внимание на канал. Не все знают что в частоте 2.4ГГц всего 3 основных канала – 1,6 и 11, вокруг которых надо и плясать. Теорию можно прочитать тут. Есть наглядная программа под windows inSSIDer для диагностики wifi сетей вокруг вашего подключения. Выбирайте наименее забитые каналы и каналы где присутствует наибольшее отрицательное dBm.
Для выбора канала под linux, окружающие ваш сети можно посмотреть командой:
root@lex:/etc# iw dev wlan0 scan
В выводе команды смотрите на номер канала и наибольший отрицательный dBm (мощность точки сигнала). Делайте выводы 🙂
hw_mode=g – Режим работы точки в IEEE 802.11g. Вот не знаю зачем при стандарте N это надо указывать, если не указать, то по умолчанию эта переменная будет ставить вообще IEEE 802.11b.. Просто задайте как я значение g, а стандарт 802.11n укажем ниже в конфиге.
wmm_enabled=1– режим приоритета мультимедиа трафика.
ieee80211n=1 – вот и указываем стандарт N нашей точки.
ht_capab=[HT40-][GF][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC2] – опции wifi карточки от которых зависит быстрота нашей точки доступа, узнаются по команде
root@lex:/etc# iw list
У меня команда выводит следующее: показать
Расписывать что значит каждый элемент в строке ht_capab я не буду, т.к. сам всего не знаю 🙂 Просто сравните вывод моей команды iw list и то что я указал в ht_capab. Что указывать в вашем случае думаю догадаетесь.. Если какого-то параметра нет, то просто не указываем.
auth_algs=1 – определяем, что нашей wifi точке будет требоваться аутентификация по ключу. Если указать 0, то будет открытая точка доступа.
ignore_broadcast_ssid=0 – SSID сети виден всем, 1 – скрывать.
wpa=2 – опции WPA шифрования. При значении 2 можно использовать, только WPA2, если wpa=3 – то WPA или WPA2.
wpa_passphrase=password_wifi_key – наша парольная фраза
wpa_key_mgmt=WPA-PSK – принимаемые алгоритмы управления ключами шифрования. Можно задавать WPA-PSK WPA-EAP одновременно.
wpa_pairwise=CCMP TKIP – принимаемые алгоритмы шифрования.
Запускаем hostpad командой
#hostapd /etc/hostapd.conf
для отладки можно первый раз запустить с ключом -d. Как один из критериев успешного запуска, можно опять посмотреть вывод команды iwconfig. Интерфейс wlan0 должен перейти в режим Master и должен появиться еще интерфейс mon.wlan0.
root@lex:/etc# iwconfig
skip...
wlan0 IEEE 802.11bgn Mode:Master Frequency:2.462 GHz Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:off
mon.wlan0 IEEE 802.11bgn Mode:Monitor Frequency:2.462 GHz Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:off
skip...
Убедившись в нормальном запуске hostpad, прописываем программу в автозагрузку при старте системы. В slackware это делается добавлением в файл /etc/rc.d/rc.local.
Все, самое важное позади 🙂 Устанавливаем программу для выдачи ip адресов подключаемым по wifi клиентам.
У меня dhcpd уже стояла, я только внес mac адреса в конфиг и стартанул демон dhcpd.
Мой конфиг /etc/dhcpd.conf:
default-lease-time 3600;
max-lease-time 9000;
authoritative;
log-facility local7;
subnet 192.168.3.0 netmask 255.255.255.0 {
interface wlan0;
# range 192.168.3.1 192.168.3.254;
option domain-name-servers 192.168.0.1, 8.8.8.8;
option routers 192.168.3.7;
option broadcast-address 192.168.3.0;
host android {
hardware ethernet 38:16:d1:02:73:d6;
fixed-address 192.168.3.4;}
host mik {
hardware ethernet 00:11:6b:60:4c:b7;
fixed-address 192.168.3.17;}
host linksys {
hardware ethernet 98:fc:11:c5:81:ea;
fixed-address 192.168.3.19;}
}
Ip адреса выдаются только тем, кто забит в конфиге dhcp сервера. Также можно расскоментировать одну строку для выдачи адресов всем кто правильно авторизуется на точке доступа..
Стартуем dhcpd, вносим изменения в стартовые скрипты системы.
Осталось настроить iptables, чтобы клиенты wifi могли выходить в интернет.
Тут я буду совсем краток. Приведу самый простой и примитивный конфиг для nat wifi адресов в интернет. Интернет висит на интерфейсе eth0.
# отключить перенаправление IP
echo 0 > /proc/sys/net/ipv4/ip_forward
# Сбрасываем цепочки правил
iptables -F
iptables -F FORWARD
iptables -F -t nat
iptables -X
# Устанавливаем политики по умолчанию
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#разрешение неограниченного через LOOPBACK
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# NAT для всех запросов
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
# включить перенаправление IP
echo 1 > /proc/sys/net/ipv4/ip_forward
Добавляем конфиг iptables в стартовые скрипты.
Настройка закончена, подключаемся..
Клиенты и работа точки доступа
У меня клиенты только в ОС Windows + телефон на Android.
В windows указываем тип подключения WPA2-Personal, шифрования AES, наш секретный ключ сети и подключаемся.
В моем ноутбуке dell 1720 стоит сетевая карта dell 1505 стандарта n. С него я и начал тестировать новую точку доступа.. Каково же было мое разочарование, когда ни при каких условиях wifi соединение нотебука было не выше 54Mbit/s. Обновление драйверов и даже подключение без шифрования, когда я сделал открытую точку доступа, успеха не приносило. Телефон при этом соединялся на скорости 62 или 72Mbit/s – я сделал вывод, что точка все-таки работает и дело в сетевой нотебука. На тестирование сетевой нотебука ушел последний 3 вечер, я был разочарован 🙁 В первую очередь для нотебука и планировался переход на N стандарт. Я думаю причиной такого поведения нотебука был так называемый стандарт 802.11n draft сетевой dell 1505, а сейчас выпускаются сетевые стандарта 802.11n draft2. Про совместимость этих стандартов на уровне N сети я не нашел.
Пришлось купить wifi usb linksys AE1000. И вот сразу же устанавливается соединение 300Mbit/s.
На линуксе была сделана тестовая шара для проверки реальной скорости сети.
Копирование файла с точки доступа – 11-12Mb/s:
Исходящая связь с нотебука почему-то немного меньше – 9-10Mb:
Также скорость доступа можно проверить программой iperf. Программу для windows версий 1.7.0 и 2.0.5 можно скачать тут. У меня тесты скорости не отличались от копирования в шары..
Мониторить подключенных клиентов на точке доступа можно командой
iw dev wlan0 station dump
В целом я доволен, что у меня все получилось 🙂 хотя и пришлось потратиться еще на одну wifi сетевую, которая кстати тоже на чипсете ralink.
Доброго времени 🙂
Настроил, подключился, но в инет выйти не удаётся. Предполагаю, что фаервол настроен не правильно. Tcpdump показывает, что обмена с подсетью wi-fi вообще нет, хотя в hostapd складывается “starting accounting session”, то есть подключение вроде нормальное.
В tcpdump часто сыпется “LCP, Echo-Reply (0x0a), id 228, length 14”. Доступ в инет с linux’а есть (проводной), а с Андроида нет. Уже неделю разбираюсь и всё никак понять не могу как раздать инет.
Настройки все почти такие же, но в ip-адресах заменил тройку на единицу. С другими цифрами он даже подключаться отказывается.
Правил фаервола лишних нет, все таблицы перед добавлением очищаю.
ок, давайте тогда по порядку..
Андроидом проверять подключение не очень удобно, но можно. Вы самое главное не сообщили, андроид хоть подключается к точке доступа? интернета пусть и не будет, но соединиться и получить ip адрес телефон должен.
если с этим все в порядке, то выложите показания ifconfig и правила firewall.
А еще лучше поставьте на андроид какой нибудь linux терминал и попробуйте с телефона сделать ping точки wifi..
К wi-fi андроид подключается нормально, с андроида ping проходит.
http://alligator.ipq.co/ifconfig
http://alligator.ipq.co/iptables
http://alligator.ipq.co/dhcpd.conf
Думал, что пингую точку доступа, а оказалось, что пинговал себя, то есть ip, который был присвоен при подключении. Естественно пинг проходил нормально. Как только увидел, что присвоен ip 192.168.1.1 понял, что сетка настроена не верно. Поправил, добавил маскарадинг и инет успешно раздаётся.
Спасибо за статью и прошу прощения, что зря отнял время 🙂