... точку доступа на базе FreeBSD? Их есть у меня!
Если у вас (Сам собой, разумеется!) вдруг завелся Домашний Сервер (На FreeBSD, разумеется) - ну там торренты покачать, домашние странички повертеть, интернеты среди домашних пораздавать, ну и прочее разное в меру вашей испорченности - рано или поздно захочется прикнутить к нему wifi (Зачем держать дома два устройства, если можно обойтись одним?) - нуу... мне, по крайней мере, захотелось.
WARNING! Чтение следующего текста может вызвать повреждение неподготовленного мозга!
И все бы хорошо, но - у nettop'а на atom'е своего вайфуя нет, и с PCI-слотами тоже не так, чтоб радостно (Нету их, в общем!) - впрочем, это горе не беда, ибо с USB у железки все очень даже нормально. Осталось посмотреть что же можно таким образом подключить...
less /usr/src/sys/i386/conf/GENERIC, ищем USB Wireless:
device rum # Ralink Technology RT2501USB wireless NICs
device uath # Atheros AR5523 wireless NICs
device ural # Ralink Technology RT2500USB wireless NICs
device zyd # ZyDAS zb1211/zb1211b wireless NICs
Мнда. Не густо, но и не так, чтобы совсем ничего. Глядим man'ы по девайсам:
режим hostap поддерживают только rum и ural, с остальными ловить нечего. Мндя. Ладно, теперь бы еще найти конкретные железки на этих чипсетах... смотрим в release notes к соответствующему выпуску FreeBSD и видим там туеву хучу железок, большинство из которых, судя по всему, ни разу не пересекало границы России - а то, что за них когда-то проникало найти... ну не то, чтобы нереально, но трудно, да. Впрочем, тех же notes к 8.1 обнаружился новый драйвер для USB Wireless -
device run, причем в man'ах, что удивительно, ни словечка про него нет, но Google намекает, что этот Ralink тоже поддерживает hostap, да и с железками на RT2870 на рынке как-то проще - мне без особых проблем достался Dlink DWA-125.stap
Ну, поехали!
Грузим драйвер:
kldload runfw
kldload if_run
Подключаем свисток и создаем интерфейс:
ifconfig wlan0 wlandev run0 wlanmode hostap ssid testap mode 11g -powersave pureg country RU up
Угу. Вроде как поднялся.
На букваре:
ifconfig wlan0 create wlandev wpi0 wlanmode sta mode 11g ssid testap country RU -powersave up scan
работает. Правда ни аутентификации ни шифрования в таком варианте не присутствует, ну-да дело наживное.
Настраиваем включение точки доступа при запуске сервера:
Загрузку драйверов в loader.conf
Строчку с параметрами интерфейса в rc.conf, /etc/rc.d/netif restart - авотхрен.
man rc.conf |grep wlan - ага, ага.
Сталбыть:
wlans_run0="wlan0"
ifconfig_wlan0="wlanmode hostap ssid testap mode 11g -powersave country RU 192.168.81.1 netmask 255.255.255.0 pureg"
/etc/rc.d/netif/restart - и опять фиг. Смотрим в man внимательней и исправляемся:
wlans_run0="wlan0"
create_args_wlan0="wlanmode hostap"
ifconfig_wlan0="ssid testap mode 11g -powersave country RU 192.168.81.1 netmask 255.255.255.0 pureg"
Работает. Переходим к аутентификации. Настраивать WPA_PSK как-то "нипапацански" - будем рожать WPA2+EAP_TLS! Handbook дает хороший пример настройки wpa_supplicant для EAP_TLS, но с hostapd там сильно хуже. Родной man hostapd.conf тоже не горит желанием помочь, зато в /usr/share/examples/hostapd/hostapd.conf мы (Вроде как!) находим все нужное.
Генерим все нужные сертфикаты (CN=fqdn железки, x509 extensions - nsClient), кладем их в требуемую папочку на сервере, создаем hostapd.conf плюс-минус следующего содержания:
interface=wlan0
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
logger_syslog=-1
logger_syslog_level=2
debug=2
#802.11 section
ssid=testap
country_code=US
hw_mode=g
max_num_sta=10
#ignore_broadcast_ssid=0
ap_max_inactivity=300
#Authentification section
eapol_version=2
eap_reauth_period=3600
eap_server=1
eap_user_file="/etc/hostap/eap_user.conf"
ca_cert="/etc/hostap/CAcert.pem"
server_cert="/etc/hostap/Cfbhostap.pem"
private_key="/etc/hostap/Kfbhostap.pem"
private_key_passwd=ПАРОЛЬ
check_crl=0
dh_file=/etc/hostap/fbapdh.pem
wpa=2
wpa_key_mgmt=WPA-EAP
rsn_pairwise=CCMP
Запускаем - /etc/rc.d/hostapd start
Гхым. Говорит, что не знает, что такое ca_cert и далее по тексту. Лезем в жужель - ага, ага. Во фрюхе по дефолту hostapd собран без EAP-сервера. Приплыли. Ладно, временно рисуем WPA_PSK, проверяем... первые грабли - wpa_psk=пароль в hostapd.conf задается БЕЗ кавычек, а в wpa_supplicant.conf'e - с ними, а в остальном handbook не врет .
Смотрим Makefile в /usr/src/usr.sbin/wpa/hostapd на предмет того, что же ему надо. Создаем /etc/src.conf, закидываем туда HOSTAPD_CFLAGS=-DEAP_TLS -DEAP_SERVER, пересобираем hostapd: make clean && make obj && make depend && make, проверяем результат - /usr/obj/usr/src/usr.sbin/wpa/hostapd/hostap -dd /etc/hostapd.conf - опять не слава Б-гу. Не может открыть файлы с сертификатами-ключами. Напрягаем мозги, вспоминаем про первые грабли и убираем кавычки из строк с путями - вроде больше не ругается. Делаем make install && /etc/rc.d/hostapd restart.
Копируем файлы с сертификатами на клиентскую машину (Не забываем про права!), рисуем wpa_supplicant.conf (... и про кавычки!):
network={
ssid="testap"
scan_ssid=0
bssid=
proto=RSN
pairwise=CCMP
group=CCMP
eap=TLS
key_mgmt=WPA-EAP
identity="fqdn"
ca_cert="/etc/ssl/CAcert.pem"
client_cert="/etc/ssl/Cfscwork.pem"
private_key="/etc/ssl/Kfscwork.pem"
private_key_passwd="ПАРОЛЬ"
}
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf - dd - не выходит каменный цветок у Данилы-мастера. Точка доступа видится, пишутся однообразные словеса про phase 1/2 Authentification, но SSL-handshake не идет от слова "совсем". Запускаем hostapd в режиме отладки - hostapd -dd -K /etc/hostapd.conf - видим, в общем-то, ту же дулю. tcpdump -i wlan0 -vvv ясности тоже не добавляет. Начинаем думать - читаем хэндбук, экзамплы - и бьем себя по голове. Identity в wpa_supplicant.conf'е мы задали, а пользователя в buildin-RADIUS'е hostapd не завели! Исправляемся:
eap_user_file=/etc/hostap/eap_user.conf - в hostapd.conf
А в сам eap_user.conf добавляем пользователя (Кавычки, сюрприз! Обязательны!):
"fqdn" TLS
Перезапускаем, проверяем... "не взлетело". Приходится прибегнуть к Старому Доброму Методу Околонаучного Тыка - добавлению "плюс-минус" подходящих параметров из /usr/share/examples/hostapd/hostapd.conf и-или man wpa_supplicant.conf в нужные файлы. "Правильный" результат нашелся за 17 минут до полного разряда букваря - добавление ieee8021x=1 (REQUIRE 802.1x authentification - а то без этого, блин, не понятно что использовать если обе, ОБЕ стороны настроены на ее использование!) приводит к нужному результату. Уф.
Таким образом, "рабочий" вариант hostapd.conf приобрел следующий вид:
interface=wlan0
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
logger_syslog=-1
logger_syslog_level=2
#debug=2 DEPRECATED
#802.11 section
ieee8021x=1
ssid=testap
country_code=US
hw_mode=g
max_num_sta=10
#ignore_broadcast_ssid=0
ap_max_inactivity=300
#Authentification section
eapol_version=2
eap_reauth_period=3600
eap_server=1
eap_user_file=/etc/hostap/eap_user.conf
ca_cert=/etc/hostap/CAcert.pem
server_cert=/etc/hostap/Cfbhostap.pem
private_key=/etc/hostap/Kfbhostap.pem
private_key_passwd=ПАРОЛЬ
Последняя задачка - настроить этот самый WPA_EAP на телефоне. Первое, что делаем - преобразуем CA сертификат из PEM в DER:
openssl x509 -in ./CAcert.pem -out ./CAcert.cer -outform DER
Дальше, преобразуем сертификат устройства и его закрытый ключ в pkcs12:
openssl pkcs12 -export -inkey ./keys/Ke71.pem -certfile ./certs/Ce71.pem -out ./e71.p12, задаем пароль для экспорта и перекидываем получившиеся файлы на телефон. Запускаем корневой сертификат из телефонного "проводника" и соглашаемся с его установкой. В настройки-общие-защита-сертификаты-доверенные корневые сертификаты находим импортированный сертификат и определяем для него параметры доверия - "проверка сертификатов". После этого запускаем e71.p12 - создаем пароль для хранилища ключей и устанавливаем сертификат.
Переходим в связь - настройки Wlan, осуществляем поиск и определяем точку доступа. Переходим к ее свойствам - параметры защиты WLAN - WPA/WPA2 ставим в EAP переходим к параметрам EAP - снимаем все галки, включаем EAP-TLS, открываем свойства метода и задаем сертификат ЦС и персональный сертификат (То, что наимпортировали), имя и область берем из сертификата - проверяем... работает!
Осталось добавить "вишенку на торте" - отключить к чертям собачачьим broadcasting ssid'а (Мы-то понимаем, что получившийся результат "хренсломаишь" - но соседу-то об этом знать неоткуда! Так что нефиг ему видеть, что у нас за точка доступа появилась). Для этого, в точном соответствии с example'ом добавляем в hostapd.conf ignore_broadcast_ssid=1 (legacy-устройств у меня лично нет, так что двойка мне без надобности) и меняем scan_ssid в wpa_supplicant.conf'е на 1, вытираем пот со лба и начинаем думать - а нафига оно нам сдалось?
А вот кому...
... точку доступа на базе FreeBSD? Их есть у меня!
Если у вас (Сам собой, разумеется!) вдруг завелся Домашний Сервер (На FreeBSD, разумеется) - ну там торренты покачать, домашние странички повертеть, интернеты среди домашних пораздавать, ну и прочее разное в меру вашей испорченности - рано или поздно захочется прикнутить к нему wifi (Зачем держать дома два устройства, если можно обойтись одним?) - нуу... мне, по крайней мере, захотелось.
WARNING! Чтение следующего текста может вызвать повреждение неподготовленного мозга!
Если у вас (Сам собой, разумеется!) вдруг завелся Домашний Сервер (На FreeBSD, разумеется) - ну там торренты покачать, домашние странички повертеть, интернеты среди домашних пораздавать, ну и прочее разное в меру вашей испорченности - рано или поздно захочется прикнутить к нему wifi (Зачем держать дома два устройства, если можно обойтись одним?) - нуу... мне, по крайней мере, захотелось.
WARNING! Чтение следующего текста может вызвать повреждение неподготовленного мозга!