Как использовать FreeBSD в качестве Wireless Access Point [2010]
В этом документе описывается, как настроить FreeBSD в качестве точки доступа беспроводной сети. Данная статья ни в коем случае не заменяет собой FreeBSD Handbook, а лишь дополняет его.
Для достижения желаемого результата, нам необходимо убедиться в выполнении следующих условий:
* Установлены hostapd и named (BIND) * Ядро скомпилировано с поддержкой pf (так же возможно использование ipfw/ipfilter) * Сконфигурирован NAT и правила пакетной фильтрации * Установлен isc-dhcp3-server * Вышеуказанные демоны сконфигурированы и запущены
Аппаратное обеспечение:
* Одна сетевая карта подключается к провайдеру. Это наш внешний интерфейс, обозначаемый ext_if. В данном примере fxp0 и может отличаться от сетевой карты, имеющейся у вас.
* Беспроводная карта построена на чипсете Atheros и используется для предоставления беспроводного доступа третьим устройствам. В данном примере ath0 и может отличаться от сетевой карты, имеющейся у вас.
* Дополнительная сетевая карта, которая подключена к локальной сети (int_if)
Тестовая конфигурация доступна по этому адресу.
Начало
Хорошей идеей будет подключить нашу машину к Интернет. Как это сделать, вы можете прочитать в разделе Network Communication FreeBSD Handbook.
Для простоты, все действия выполняются с правами пользователя root, хотя это моветон.
Проверяем наличие BIND
Хотя BIND идет в поставке FreeBSD, неполохо было бы убедиться в его наличии:
which named
Если вы вдруг получили сообщение named not found, установим его:
sudo pkg_add -r bind9
Проверяем наличие hostapd
Наличие hostapd можно проверить командой:
which hostapd
hostapd идет в соcтаве FreeBSD. Если он вдруг не обнаружен, то, возможно, у вас установлен минимальный набор сетов и вам придется с помощью программы установки добавить сеты или обновить систему из исходных текстов.
Проверяем наличие исходных текстов ядра
Посмотрите наличие каталога исходных текстов с помощью команды:
ls -l /usr/src/sys
Если вы получили сообщение No such file or directory, то обратитесь к главе Synchronizing Your Source FreeBSD Handbook.
Перекомпилируем ядро
Процесс компиляции ядра с поддержкой pf очень хорошо описан в FreeBSD Handbook. Приведем выжимки из этого документа. Перейдем в каталог файлов конфигурации ядра и создадим новую конфигурацию, базируясь на файле GENERIC:
cd /usr/src/sys/`uname -m`/conf cp GENERIC CUSTOM
Вы можете отредактировать файл конфигурации по своему усмотрению. Некоторые данные поопциям ядра можно обнаружить в файле /usr/src/sys/conf/NOTES. Нам же требуется просто добавить поддержку PF:
Конфигурируем NAT и правила пакетной фильтрации Разрешим маршрутизацию пакетов и поднимем pf:
sysctl -w net.inet.ip.forwarding=1 pfctl -e
Создадим файл pf.conf, содержащий правила NAT и простейший набор правил фильтрации:
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # This configuration is set for use on a machine that is a router with # three (3) network cards: # ext_if - connects to the upstream link (cable/dsl modem, WAN, etc.) # wifi_if - wireless card for internal network # (if none present, remove all references to it in this file) # lan_if - wired card for internal network # (if none present, remove all references to it in this file) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #------------------------------------------------------------------------ # macros #------------------------------------------------------------------------ logopt = "log" # interfaces ext_if = "fxp0" wifi_if = "ath0" lan_if = "fxp1" # publically accesible services (transport layer neutral) pubserv = "{ 22, 443 }" # internally accessible services (transport layer neutral) lanserv = "{ 22, 53, 67, 80, 443 }" # samba ports (transport layer neutral) samba_ports = "{ 137, 138, 139 }" # externally permitted inbound icmp types icmp_types = "echoreq" # internal network lan_net = "{ 192.168.0.0/24, 192.168.1.0/24 }" # hosts granted acces to samba (cifs/smb) shares smb_net = "{ 192.168.0.0/27, 192.168.1.0/27, 192.168.0.90, 192.168.1.90 }" # block these networks table { 0.0.0.0/8, 10.0.0.0/8, 20.20.20.0/24, 127.0.0.0/8, \ 169.254.0.0/16, 172.16.0.0/12, 192.0.2.0/24, 192.168.0.0/16, \ 224.0.0.0/3, 255.255.255.255 } #------------------------------------------------------------------------ # options #------------------------------------------------------------------------ # config set block-policy return set loginterface $ext_if set skip on lo0 # scrub #scrub all reassemble tcp no-df #scrub in all fragment reassemble scrub out all random-id #------------------------------------------------------------------------ # redirection (and nat, too!) #------------------------------------------------------------------------ # network address translation nat on $ext_if from $lan_net to any -> ($ext_if) #------------------------------------------------------------------------ # firewall policy #------------------------------------------------------------------------ # restrictive default rules block all block return-rst in $logopt on $ext_if proto tcp all block return-icmp in $logopt on $ext_if proto udp all block in $logopt on $ext_if proto icmp all block out $logopt on $ext_if all # trust localhost pass in quick on lo0 all pass out quick on lo0 all # anti spoofing block drop in $logopt quick on $ext_if from to any block drop out $logopt quick on $ext_if from any to antispoof for { $lan_if, $wifi_if, $ext_if } # anti fake return-scans block return-rst out on $ext_if proto tcp all block return-rst in on $ext_if proto tcp all block return-icmp out on $ext_if proto udp all block return-icmp in on $ext_if proto udp all # toy with script kiddies scanning us block in $logopt quick proto tcp flags FUP/WEUAPRSF block in $logopt quick proto tcp flags WEUAPRSF/WEUAPRSF block in $logopt quick proto tcp flags SRAFU/WEUAPRSF block in $logopt quick proto tcp flags /WEUAPRSF block in $logopt quick proto tcp flags SR/SR block in $logopt quick proto tcp flags SF/SF # open firewall fully # warning: insecure. 'nuff said. #pass in quick all #pass out quick all # allow permitted icmp pass in inet proto icmp all icmp-type $icmp_types keep state # allow permitted services pass in on $ext_if inet proto tcp from any to any port $pubserv flags S/SA keep state pass in on {$lan_if $wifi_if} inet proto {tcp udp} from $lan_net to any port $lanserv keep state pass in on {$lan_if $wifi_if} inet proto {tcp udp} from $smb_net to any port $samba_ports keep state # permit access between LAN hosts pass in from $lan_net to $lan_net keep state pass out from $lan_net to $lan_net keep state # permit full outbound access # warning: potentially insecure. you may wish to lock down outbound access. pass out from any to any keep state
Загружаем созданную конфигурацию командой:
pfctl -Fa -f /etc/pf.conf
Устанавливаем и конфигурируем сервер ISC DHCP Для раздачи клиентам адресов, нам необходим DHCP:
Вносим изменения в rc.conf: Чтобы настройки сетевых интерфейсов не пришлось вбивать заново после перезагрузки, внесем их в /etc/rc.conf:
### GENERAL SETTINGS gateway_enable="YES" hostname="wifiap" ### CONFIGURATION FOR EXTERNAL INTERFACE (UPSTREAM LINK) ### example: link to cable/dsl modem ifconfig_fxp0="DHCP" ### CONFIGURATION FOR INTERNAL WIRED NETWORK ifconfig_fxp1="inet 192.168.0.1 netmask 255.255.255.0" ### CONFIGURATION FOR INTERNAL WIRELESS NETWORK ifconfig_ath0="inet 192.168.1.1 netmask 255.255.255.0 ssid YOURSSID mediaopt hostap" ### CONFIGURATION FOR PACKET FILTER ### requires kernel recompile, see: ### http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-pf.html pf_enable="YES" # Set to YES to enable packet filter (pf) pf_rules="/etc/pf.conf" # rules definition file for pf pf_program="/sbin/pfctl" # where the pfctl program lives pf_flags="" # additional flags for pfctl pflog_enable="YES" # Set to YES to enable packet filter logging pflog_logfile="/var/log/pflog" # where pflogd should store the logfile ### DAEMONS FOR LAN hostapd_enable="YES" # wireless services (clients use wpa_supplicant) named_enable="YES" # dns for clients dhcpd_enable="YES" # dhcp configure clients sshd_enable="YES" # so we can remotely access this box
Для автоматической загрузки модулем, внесем соответствующие строки в /boot/loader.conf: