Ralink 2870 и FreeBSD — настраиваем точку доступа
Сразу предупреждаю: заработало у меня только на freebsd 8.2, на 7.4 не стало, хотя здесь утверждают, что должно работать.
Итак, есть машинка с
[cc lang=»bash»]FreeBSD selena.ski-elfa 8.2-STABLE FreeBSD 8.2-STABLE #5: Thu May 12 12:35:47 VOLST 2011 root@selena.ski-elfa:/usr/obj/usr/src/sys/selena i386[/cc]
А так же USB wifi адаптер tp-link TL-WN727N, построенный на чипе Ralink 2870. Начиная с freebsd8.1 в системе есть драйвера для этого чипа, чтобы карточка опозналась, надо подгрузить модули ядра:
[cc lang=»bash»]# kldload runfw
# kldload if_run
[/cc]
Либо добавляем их в /boot/loader.conf. Кроме того, нужен еще модуль wlan_xauth, соответственно, с ним поступаем так же.
Адаптер после этого определится как run0, однако с помощью ifconfig с ним работать не получается, надо создать виртуальное устройство wlan0, заодно сразу перевести его в режим точки доступа (hostap):
[cc lang=»bash»]# ifconfig wlan0 create wlandev run0 wlanmode hostap ssid selena[/cc]
Здесь wlanmode — режим работы (hostap — точка доступа, может быть еще BSS — режим клиента, и monitor — вообще ненужная рядовому обывателю штука. А нерядовые могут об этом почитать в man run), ssid — имя нашей сети, мы его будем видеть в списке сетей на клиенте.
Теперь надо включить аутентификацию, мы же не хотим, чтобы к нам в сеть ходили кто попало? Значит, создаем файлик /etc/hostapd.conf:
[cc lang=»bash»]interface=wlan0
debug=1
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=selena
wpa=3
wpa_passphrase=mypassphrase
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP[/cc]
ну тут понятно, указали интерфейс, который обслуживать, указали имя сети, включили wpa2 (wpa=3, как ни странно, и wpa_pairwise=CCMP). mypassphrase — ключевое слово для доступа в сеть, его будут спрашивать у клиентов. Проявите фантазию, и вообще, меняйте ее почаще, нынче ломают все подряд.
Создаем папочку, которую в конфиге объявили:
[cc lang=»bash»]# mkdir /var/run/hostapd[/cc]
теперь надо запустить демона hostapd, который как раз и занимается аутентификацией:
[cc lang=»bash»]/etc/rc.d/hostapd forcestart[/cc]
Собственно, если после этого ifconfig показывает нам что-то наподобие:
[cc lang=»bash»]wlan0: flags=8943
ether 00:11:43:54:65:76
media: IEEE 802.11 Wireless Ethernet autoselect mode 11g
status: running
ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:43:54:65:76
authmode WPA privacy MIXED deftxkey 2 TKIP 2:128-bit TKIP 3:128-bit
txpower 31.5 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250
roam:rssi11g 7 roam:rate11g 5 protmode CTS burst dtimperiod 1[/cc]
То уже почти работает. Почему почти? потому-что надо еще настроить бридж между своей внутренней сетевкой и wifi адаптером. Не, если внутренней сетевки нету, то для wlan0 с помощью ifconfig нормально настраивается обычная сеть, но у меня как раз внутренняя проводная сеть и дополнительных маршрутов я вводить не хочу, поэтому буду делать bridge, у меня там еще и dhcp до кучи, в общем, будет удобно.
Для этого грузим соответствующий модуль и создаем мост:
[cc lang=»bash»]# kldload if_bridge
# ifconfig bridge0 create
[/cc]
Объединяем в мост внутренний проводной интерфейс и беспроводной и поднимаем мост:
[cc lang=»bash»]# ifconfig bridge0 addm wlan0 addm nfe0
# ifconfig bridge0 up
[/cc]
Вместо nfe0 следует подставить имя своего интерфейса.
Все, после этого я с ноута смог подцепиться к сети, ходить в интернет и иметь доступ к локальным ресурсам.
С автоматизацией процесса, однако, у меня не заладилось. Точнее, не заладился перевод адаптера в hostap. Умные люди для этого советую в /etc/rc.conf вставтиь строчку
[cc lang=»bash»]wlans_run0=»wlan0″
ifconfig_wlan0=»ssid selena mode 11g mediaopt hostap»[/cc]
Однако моя система на подобную конструкцию обижается фразой device not configured и ничего не работает. Я бился-бился, но так и не смог совладать с чудом враждебной техники, посему просто сляпал скрипт, который поднимает интерфейс и мост:
[cc lang=»bash»]#!/bin/sh
/sbin/ifconfig wlan0 create wlandev run0 wlanmode hostap ssid selena
/sbin/ifconfig bridge0 create
/sbin/ifconfig bridge0 addm wlan0 addm nfe0
/sbin/ifconfig bridge0 up
/etc/rc.d/hostapd forcestart[/cc]
И запускаю его вручную. Собственно, то же самое можно впихать в /etc/rc.local и тогда оно поднимается автоматически, но я рассудил, что мне wifi нужно редко, и нефиг ему светить по соседям, да еще подниматься не через правильный rc.conf а откуда-то сбоку. Собственно, если кто надоумит, как сделать правильно, то буду очень благодарен.
Если бы wlan0 корректно поднимался через /etc/rc.conf, то мост надо было бы поднимать там же, вставив туда вот такое:
[cc lang=»bash»]cloned_interfaces=»bridge0″
ifconfig_bridge0=»up addm run0 addm nfe0″
[/cc]
Имя интерфейса не забываем менять.
Заодно тогда надо в /etc/rc.conf добавить
[cc lang=»bash»]hostapd_enable=»YES»[/cc]
Однако при ручной загрузке из скрипта или автоматической из /etc/rc.local эта конструкция вызывает неработоспособность системы, так что я hostapd запускаю последней строчкой в скрипте.
Модули я гружу из /boot/loader.conf:
[cc lang=»bash»]
runfw_load=»YES»
if_run_load=»YES»
wlan_xauth_load=»YES»
if_bridge_load=»YES»[/cc]
wlan0 на 8.2 и RaLink 3072 у меня вроде нормально подымается с такими строчками в rc.conf:wlans_run0=»wlan0″create_args_wlan0=»wlanmode hostap ssid FBSDap mode 11g channel 1″ifconfig_wlan0=»inet 192.168.2.1 netmask 255.255.255.0″
Спасибо огромное!Как раз то что надо, но карточка у меня TL-WN951Nпоменял интерфейс и все заработало с первого раза!!!