18 февраля 2015

Wi-Fi на BSD системах

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

Но  те, кто уже сталкивались с этой задачей, знают, что не все так гладко. Поэтому в этой статье я постараюсь описать все грабли, на которые не следует наступать и быстро настроить wi-fi сеть.

Нам понадобится обычная wi-fi карта, USB или PCI [Express].

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

Для чипов разных производителей с разными интерфейсами шин существуют отдельные драйверы. Например, для Broadcom на PCI это bwi, для Atheros  на  PCI- ath, atheros на USB - uath, Ralink на USB - run, rum и т.д.

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

Проверить поддерживаемые беспроводные адаптерв можно непосредственно на сайте в разделе GetFreeBSD>Release Information> Hardware Notes> 3.5. Wireless Network Interfaces
 
Если вашего адаптера нет в числе поддерживаемого, то можно попробовать использовать windows драйвер в обертке NDIS. Но имейте в виду, что такой драйвер  не сможет работать в режиме точки доступа!

Здесь есть полный список и поддерживаемых чипов всех производителей для BSD-систем. 
Что бы узнать на каком чипе ваша карточка, достаточно открыть ее описание на сайте wikidevi.com. Обращайте внимание, что некоторые модели имеют несколько ревизий на разных чипах, поэтому внимательно сверяйте версии. Они указываются на наклейках коробки или самих устройствах.

Так же обращайте внимание, что не все драйверы поддерживают 11n режим, даже если на самом устройстве написано, что оно работает. На текущий момент его поддерживают всего три драйвера ath, iwn и mwl.

Посмотрев, что предлагается в ближайших магазинах мой выбор пал на два адаптера D-Link DWA-140 и DWA-160, оба собраны на чипах Ralink и поддерживаются драйвером run, но пока только в 11g режиме. Их основное отличие - второй может работать в двух диапазонах 2,4 и 5 ГГц. Стоимость 580 и 850 руб соответственно.
 
Будем считать, что подходящий адаптер у вас имеется. Теперь приступаем непосредственно к настройке.

Опишем общий процесс поиска, как узнать какое устройство подключено.
После того, как вы подключили устройство, посмотрим, что оно из себя представляет.

Если это  USB устройство, то пишем
# usbconfig dump_device_desc
Находим там ваш адаптер по ключевым словам 802.11
ugen4.2: <802.11 n WLAN Ralink> at usbus4, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (450mA)

bLength = 0x0012
bDescriptorType = 0x0001
bcdUSB = 0x0200
bDeviceClass = 0x0000
bDeviceSubClass = 0x0000
bDeviceProtocol = 0x0000
bMaxPacketSize0 = 0x0040
idVendor = 0x2001
idProduct = 0x3c20
bcdDevice = 0x0101
iManufacturer = 0x0001 <Ralink>
iProduct = 0x0002 <802.11 n WLAN>
iSerialNumber = 0x0003 <1.0>
bNumConfigurations = 0x0001
Берем его idProduct и ищем в этом списке. Таким образом вы узнаете полное наименование и даже чип.

Если это PCI, то воспользуемся утилитой pciconf.
# pciconf -lv
Получите список всех PCI устройств с указанием драйвера, идентификатора производителя, наименования, класса и подкласса. Например,
rl0@pci0:0:9:0: class=0x020000 card=0x813910ec chip=0x813910ec rev=0x10 hdr=0x00
    vendor     = 'Realtek Semiconductor Co., Ltd.'
    device     = 'RTL-8139/8139C/8139C+'
    class      = network
    subclass   = ethernet
После того, как вы узнали на каком чипе ваше устройство и какой нужен драйвер. Обращаемся к справке man, там сказано, что необходимо прописать в /boot/loader.conf  для загрузки модуля драйвера. В моем случае это.
if_run_load="YES"
runfw_load="YES"
После перезагрузки у вас должно появится новое устройство.
# ifconfig
run0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
        ether ac:f1:df:01:e5:64
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
        status: running
Если нет, то дайте команду:
# ifconfig wlan0 create wlandev run0
И посмотрите создался ли у вас интерфейс wlan0.
# ifconfig wlan0
Если создался, то удалим:
# ifconfig wlan0 destroy
Дальше в /etc/rc.conf  напишем
ifconfig_wlan0="inet 192.168.0.1/24"
wlans_run0="wlan0"
create_args_wlan0="wlanmode hostap channel 7 country RU"
hostapd_enable=YES
Далее настроим WPA2 аутентификацию. 
И создадим файл
# vi /etc/hostapd.conf
С таким содержимым
interface=wlan0
hw_mode=g
ssid=Your_name
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
# 1 - WPA1; 2 - WPA2; 3 - WPA1+WPA2
wpa=3
wpa_passphrase=Password
# алгоритм управления
wpa_key_mgmt=WPA-PSK
# алгоритмы шифрования
wpa_pairwise=CCMP
Во избежание раскрытия пароля закрываем доступ на чтение файла всем кроме root.
# chmod 700 /etc/hostapd.conf
Вешаем dhcp на wlan0, прописываем в rc.conf
dhcpd_ifaces="wlan0"
Настраиваем фаервол. Для примера добавим в ipfw правило разрешающее все через интерфес wlan0.
add 1098 allow all from any to any via wlan0
Запускаем hostapd
# service hostapd forcestart
И вуаля, у вас появилась сеть  "Your_name".

Но если вдруг за место этого у вас появилось "panic: page fault" типа такого


не отчаивайтесь, у меня такое тоже наблюдалось на FreeBSD 10.1-RELEASE и исключительно на x86, на amd64 все четко. Мне помогло обновление мира до последней текущей версии, 10.1-STABLE #4 r278159.
 
Перед запуском Wi-Fi сети очень важно узнать какие частотные каналы еще не заняты и выбрать любой свободный. Иначе будут проблемы в работе. Например вы просто не сможете подключиться к вашей сети.

Если понадобится удалить точку доступа, то пишем
# ifconfig wlan0 destroy
Вручную создать
# ifconfig wlan0 create wlandev run0 wlanmode hostap ssid Your_name
Сканировать на доступные сети
# ifconfig wlan0 up scan
Или так
# ifconfig wlan0 list scan
Посмотреть, на каких каналах может работать ваш адаптер.
# ifconfig -v wlan0 list channel
И вручную установить нужный канал
# ifconfig wlan0 channel 13
Включить/выключить сеть.
 # ifconfig wlan0 down
 # ifconfig wlan0 up
Перезапустить wlan0 по настройкам из /etc/rc.conf
# service netif restart wlan0

1 комментарий: