Как использовать FreeBSD в качестве Wireless Access Point [2009]
В этом документе описывается, как настроить 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:
Создадим файл 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: