Ralink 2870 и FreeBSD — настраиваем точку доступа
Сразу предупреждаю: заработало у меня только на freebsd 8.2, на 7.4 не стало, хотя здесь утверждают, что должно работать.
Итак, есть машинка с
1 | 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 |
А так же USB wifi адаптер tp-link TL-WN727N, построенный на чипе Ralink 2870. Начиная с freebsd8.1 в системе есть драйвера для этого чипа, чтобы карточка опозналась, надо подгрузить модули ядра:
1 2 | # kldload runfw # kldload if_run |
Либо добавляем их в /boot/loader.conf. Кроме того, нужен еще модуль wlan_xauth, соответственно, с ним поступаем так же.
Адаптер после этого определится как run0, однако с помощью ifconfig с ним работать не получается, надо создать виртуальное устройство wlan0, заодно сразу перевести его в режим точки доступа (hostap):
1 | # ifconfig wlan0 create wlandev run0 wlanmode hostap ssid selena |
Здесь wlanmode — режим работы (hostap — точка доступа, может быть еще BSS — режим клиента, и monitor — вообще ненужная рядовому обывателю штука. А нерядовые могут об этом почитать в man run), ssid — имя нашей сети, мы его будем видеть в списке сетей на клиенте.
Теперь надо включить аутентификацию, мы же не хотим, чтобы к нам в сеть ходили кто попало? Значит, создаем файлик /etc/hostapd.conf:
1 2 3 4 5 6 7 8 9 | 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 |
ну тут понятно, указали интерфейс, который обслуживать, указали имя сети, включили wpa2 (wpa=3, как ни странно, и wpa_pairwise=CCMP). mypassphrase — ключевое слово для доступа в сеть, его будут спрашивать у клиентов. Проявите фантазию, и вообще, меняйте ее почаще, нынче ломают все подряд.
Создаем папочку, которую в конфиге объявили:
1 | # mkdir /var/run/hostapd |
теперь надо запустить демона hostapd, который как раз и занимается аутентификацией:
1 | /etc/rc.d/hostapd forcestart |
Собственно, если после этого ifconfig показывает нам что-то наподобие:
1 2 3 4 5 6 7 8 | wlan0: flags=8943<up,broadcast,running,promisc,simplex,multicast> metric 0 mtu 2290 ether 00:11:43:54:65:76 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> 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 |
То уже почти работает. Почему почти? потому-что надо еще настроить бридж между своей внутренней сетевкой и wifi адаптером. Не, если внутренней сетевки нету, то для wlan0 с помощью ifconfig нормально настраивается обычная сеть, но у меня как раз внутренняя проводная сеть и дополнительных маршрутов я вводить не хочу, поэтому буду делать bridge, у меня там еще и dhcp до кучи, в общем, будет удобно.
Для этого грузим соответствующий модуль и создаем мост:
1 2 | # kldload if_bridge # ifconfig bridge0 create |
Объединяем в мост внутренний проводной интерфейс и беспроводной и поднимаем мост:
1 2 | # ifconfig bridge0 addm wlan0 addm nfe0 # ifconfig bridge0 up |
Вместо nfe0 следует подставить имя своего интерфейса.
Все, после этого я с ноута смог подцепиться к сети, ходить в интернет и иметь доступ к локальным ресурсам.
С автоматизацией процесса, однако, у меня не заладилось. Точнее, не заладился перевод адаптера в hostap. Умные люди для этого советую в /etc/rc.conf вставтиь строчку
1 2 | wlans_run0="wlan0" ifconfig_wlan0="ssid selena mode 11g mediaopt hostap" |
Однако моя система на подобную конструкцию обижается фразой device not configured и ничего не работает. Я бился-бился, но так и не смог совладать с чудом враждебной техники, посему просто сляпал скрипт, который поднимает интерфейс и мост:
1 2 3 4 5 6 | #!/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 |
И запускаю его вручную. Собственно, то же самое можно впихать в /etc/rc.local и тогда оно поднимается автоматически, но я рассудил, что мне wifi нужно редко, и нефиг ему светить по соседям, да еще подниматься не через правильный rc.conf а откуда-то сбоку. Собственно, если кто надоумит, как сделать правильно, то буду очень благодарен.
Если бы wlan0 корректно поднимался через /etc/rc.conf, то мост надо было бы поднимать там же, вставив туда вот такое:
1 2 | cloned_interfaces="bridge0" ifconfig_bridge0="up addm run0 addm nfe0" |
Имя интерфейса не забываем менять.
Заодно тогда надо в /etc/rc.conf добавить
1 | hostapd_enable="YES" |
Однако при ручной загрузке из скрипта или автоматической из /etc/rc.local эта конструкция вызывает неработоспособность системы, так что я hostapd запускаю последней строчкой в скрипте.
Модули я гружу из /boot/loader.conf:
1 2 3 4 | runfw_load="YES" if_run_load="YES" wlan_xauth_load="YES" if_bridge_load="YES" |
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поменял интерфейс и все заработало с первого раза!!!