Как настроить беспроводную точку доступа на FreeBSD
Важно: предполагается, что команды выполняются от root. Если вы не уверены в шагах по подключению к upstream (интернет‑провайдеру), сначала ознакомьтесь с разделом «Network Communication» в FreeBSD Handbook.
Введение и назначение
Этот документ дополняет FreeBSD Handbook и описывает практическую настройку FreeBSD в роли беспроводной точки доступа (Access Point). Исходная задача: обеспечить клиентам доступ в локальную сеть и в Интернет через один внешний интерфейс.
Определения в одну строку:
- hostapd — демон, реализующий режим точки доступа для WLAN.
- pf — OpenBSD Packet Filter, используемый как фаервол и NAT.
- isc‑dhcpd — DHCP‑сервер ISC для раздачи IP клиентам.
Целевая аудитория: системные администраторы и опытные пользователи FreeBSD, знакомые с базовыми командами shell и работой сетевых интерфейсов.
Требования к оборудованию и заметки
- Один сетевой интерфейс для подключения к upstream (ext_if) — в примере fxp0.
- Один беспроводной интерфейс для клиентов (wifi_if) — в примере ath0. Рекомендуются Atheros‑карты, но подойдёт любая поддерживаемая FreeBSD карта.
- Опционально: второй проводной интерфейс для LAN (lan_if) — в примере fxp1.
Скачиваемые примеры конфигураций: http://tun0.net/ascii/config/freebsd_access_point/ (ссылка оставлена автором).
План действий (вкратце)
- Убедиться, что установлены hostapd, named (BIND) и isc‑dhcpd.
- При необходимости перекомпилировать ядро для поддержки pf.
- Настроить сетевые интерфейсы (ext_if, lan_if, wifi_if).
- Настроить pf для NAT и базового фильтра.
- Настроить DHCP и hostapd.
- Обеспечить автозапуск через /etc/rc.conf и /boot/loader.conf.
- Запустить службы и проверить работоспособность.
Подготовка: проверки установленных компонентов
Проверка наличия BIND
Выполните:
which namedЕсли ответ “named not found”, установите BIND:
sudo pkg_add -r bind9Проверка наличия hostapd
Проверьте:
which hostapdЕсли hostapd отсутствует, возможно, у вас минимальная установка. Добавьте недостающие наборы через инсталлятор или обновите систему из исходников.
Проверка исходников ядра
Для сборки кастомного ядра нужны исходники:
ls -l /usr/src/sysЕсли каталога нет — синхронизируйте исходники (см. FreeBSD Handbook: Synchronizing Your Source).
Перекомпиляция ядра для PF
Короткая методика:
cd /usr/src/sys/uname -m/conf cp GENERIC CUSTOM
Добавьте в конфигурацию устройства PF и, при необходимости, ALTQ:
echo “device pf
device pflog
device pfsync” >> CUSTOM
Опционально добавить опции ALTQ:
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
options ALTQ_NOPCC # Required for SMP buildСобираем и устанавливаем ядро:
cd /usr/src
make buildkernel KERNCONF=CUSTOM
make installkernel KERNCONF=CUSTOMПерезагрузите систему:
shutdown -r nowПримечание: перекомпиляция ядра требует времени и понимания опций. При сомнениях сначала протестируйте в виртуальной среде.
Схема сети — пример
В примерах далее используются имена интерфейсов:
- fxp0 — ext_if — внешний интерфейс, получает адрес от upstream (DHCP).
- fxp1 — lan_if — проводной LAN, статический IP 192.168.0.1/24.
- ath0 — wifi_if — беспроводной интерфейс, статический IP 192.168.1.1/24.
Если нужен только WLAN — пропустите fxp1/lan_if. Для проводной сети — уберите wifi_if/ath0.
Настройка интерфейсов
Получим IP для внешнего интерфейса:
dhclient fxp0Назначим статический IP для lan_if:
ifconfig fxp1 inet 192.168.0.1 netmask 255.255.255.0Загрузим драйверы для Atheros (пример для ath):
for d in {if_ath,ath_rate,ath_hal}; do kldload $d; doneЗагрузим модули WLan:
for d in {wlan_wep_load,wlan_tkip_load,wlan_ccmp_load,wlan_xauth_load,wlan_acl_load}; do kldload $d; doneНазначим IP для wifi_if и включим hostap режим:
ifconfig ath0 inet 192.168.1.1 netmask 255.255.255.0 ssid YOURSSID mediaopt hostapСовет: для удобства перенесите загрузку модулей в /boot/loader.conf, чтобы они подгружались автоматически при загрузке.
Настройка NAT и pf
Включим маршрутизацию и запустим pf:
sysctl -w net.inet.ip.forwarding=1
pfctl -eСоздайте /etc/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
Загрузим конфигурацию pf:
pfctl -Fa -f /etc/pf.confСовет по безопасности: по умолчанию в примере разрешён полный исходящий трафик. Для более жёсткой политики сузьте набор разрешённых исходящих портов.
Установка и настройка ISC DHCP сервера
Установите пакет:
pkg_add -r isc-dhcp3-serverОтредактируйте /usr/local/etc/dhcpd.conf (файл приведён ниже — сохраните как есть, он описывает два подсети и примеры закреплённых адресов):
###
### GLOBAL SETTINGS
###
ddns-update-style none;
always-broadcast on;
default-lease-time 7200;
max-lease-time 7200;
authoritative;
option domain-name-servers 192.168.1.1;
option domain-name "localnet.localdomain";
option netbios-name-servers 192.168.1.1;
###
### WIRED LOCAL AREA NETWORK
###
subnet 192.168.0.0 netmask 255.255.255.0 {
#
# NOTES:
# (1) allocation of endings 100-199 by DHCP is
# inteded for clients that are not specified
# later in this file.
# (2) allocation is done in increments of 10
# and this is done intentionally.
#
range 192.168.0.100 192.168.0.199;
option broadcast-address 192.168.0.255;
option subnet-mask 255.255.255.0;
option routers 192.168.0.1;
}
###
### WIRELESS NETWORK
###
subnet 192.168.1.0 netmask 255.255.255.0 {
# NOTE: See: wired->range.notes
range 192.168.1.100 192.168.1.199;
option broadcast-address 192.168.1.255;
option subnet-mask 255.255.255.0;
option routers 192.168.1.1;
}
###
### ASSIGN SPECIFIC IP ADDRESSES TO SPECIFIC HOSTS BASED ON MAC ADDRESS
### (optional)
###
## host foo
#host foo {
# hardware ethernet XX:XX:XX:XX:XX:XX;
# fixed-address 192.168.0.XYZ;
#}
## host bar
#host bar {
# hardware ethernet XX:XX:XX:XX:XX:XX;
# fixed-address 192.168.1.XYZ;
#}
Запустите dhcpd и проверьте логи на предмет ошибок.
Настройка hostapd
Отредактируйте /etc/hostapd.conf следующим образом (пример конфигурации ниже). Заполните YOURSSID и wpa_passphrase своими значениями:
interface=ath0
driver=bsd
logger_syslog=-1
logger_syslog_level=0
logger_stdout=-1
logger_stdout_level=0
debug=3
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
#### IEEE 802.11 related config ####
ssid=YOURSSID
macaddr_acl=0
auth_algs=1
#### IEEE 802.1X related config ####
ieee8021x=0
#### WPA/IEEE 802.11i config #####
wpa=1
wpa_passphrase=ENTER_YOUR_PASSPHRASE_HERE
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP
Рекомендации по безопасности для пароля: длина не менее 12 символов, смешение букв, цифр и символов.
Автозапуск через rc.conf и loader.conf
Пример /etc/rc.conf (внесите свои значения SSID/пароль при необходимости):
### 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
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:
wlan_wep_load="YES"
wlan_tkip_load="YES"
wlan_ccmp_load="YES"
wlan_xauth_load="YES"
wlan_acl_load="YES"Запуск демонов и проверка
Самый простой способ: перезагрузить машину:
shutdown -r nowИли запустить службы вручную:
/etc/rc.d/pflog start
/etc/rc.d/named start
/etc/rc.d/dhcpd start
/etc/rc.d/hostapd startПроверка: подключитесь беспроводным клиентом к YOURSSID и убедитесь, что он получает IP из диапазона 192.168.1.100–199 и имеет доступ во внешнюю сеть.
Отладка и частые проблемы
- Клиенты не получают IP: проверьте, что dhcpd работает и слушает нужный интерфейс; проверьте /var/log/messages и логи dhcpd.
- Нет NAT/интернета у клиентов: убедитесь, что sysctl net.inet.ip.forwarding=1 и что pf загружен с корректным правилом nat on $ext_if.
- hostapd не запускается: проверьте права /var/run/hostapd, корректность ctrl_interface и поддерживается ли драйвер bsd для вашего WLAN‑адаптера.
- Интерфейс ath0 не поднимается в hostap режиме: проверьте, загружены ли модули if_ath и ath_hal, и что ваша карточка поддерживает hostap.
Совет по логам: используйте tcpdump для мониторинга трафика на интерфейсах и pflog для анализа сработавших правил pf.
Когда этот подход не подходит
- Если у вас проприетарная WLAN‑карта без поддержки hostap в FreeBSD — придётся использовать другой драйвер или внешний точечный роутер.
- Для сложных сценариев корпоративной Wi‑Fi с 802.1X/EAP лучше применять специализированное решение (RADIUS, контроллер AP).
- Если на вашей сети уже есть сложная маршрутизация, VPN или фрагментированное addressing, простая NAT‑настройка pf может оказаться недостаточной.
Альтернативные подходы
- Использовать ipfw или ipfilter вместо pf — синтаксис и возможности отличаются, но тоже подходят для NAT/фильтрации.
- Заменить hostapd на аппаратный роутер/точку доступа и использовать FreeBSD только как шлюз.
- Для малых домашних сетей проще использовать готовые маршрутизаторы с OpenWrt/LEDE.
Руководство — чек-листы по ролям
Администратор установки:
- Проверил наличие пакетов hostapd, named, isc‑dhcpd
- Получил/синхронизировал исходники ядра
- Перекомпилировал и загрузил кастомное ядро с PF
Сетевой инженер:
- Настроил ifconfig для ext_if, lan_if, wifi_if
- Настроил pf.conf с nat и базовой политикой
- Проверил маршрутизацию (sysctl net.inet.ip.forwarding)
Безопасность и эксплуатация:
- Настроил WPA2/PSK с надежной passphrase
- Ограничил исходящие порты при необходимости
- Настроил логирование pflogd и ротацию логов
Безопасность и hardening
- Всегда используйте WPA2 (или современную защиту, если поддерживается) с длинной фразой‑ключом.
- Отключите ненужные сервисы (ftp, telnet и т.п.).
- Закройте входящие на внешнем интерфейсе все порты, кроме необходимых.
- Включите регулярное обновление системы и мониторинг уязвимостей для драйверов WLAN.
- По возможности используйте RADIUS для аутентификации корпоративных клиентов.
Критерии приёмки
- Точка доступа поднята, клиент получает IP из диапазона 192.168.1.100–199.
- Клиент пингуется с шлюза и имеет доступ в Интернет.
- pf запущен и в логах нет ошибок при загрузке конфигурации.
- При перезагрузке все сервисы стартуют автоматически через rc.conf/loader.conf.
Короткая методология развертывания (5 шагов)
- Проверить пакеты и исходники, собрать ядро с pf.
- Назначить интерфейсы и загрузить модули WLAN.
- Настроить pf.conf с NAT и базовой фильтрацией.
- Настроить isc‑dhcpd и hostapd (WPA).
- Обеспечить автозапуск и протестировать клиентов.
Небольшой справочник команд (факт‑бокс)
- Получить IP от upstream: dhclient fxp0
- Выдать IP локально: ifconfig fxp1 inet 192.168.0.1 netmask 255.255.255.0
- Включить форвардинг: sysctl -w net.inet.ip.forwarding=1
- Загрузить pf конфиг: pfctl -Fa -f /etc/pf.conf
- Загрузить модули: kldload if_ath
- Запустить службы вручную: /etc/rc.d/hostapd start
Краткий глоссарий
- AP — точка доступа, устройство, предоставляющее WLAN.
- NAT — трансляция сетевых адресов для выхода локальных клиентов в Интернет.
- WPA/WPA2 — протоколы защиты Wi‑Fi сетей.
Советы по миграции и совместимости
- При переходе с Linux/OpenWrt на FreeBSD проверьте поддержку драйверов вашей WLAN карты в FreeBSD.
- Настройки pf не полностью совместимы с iptables; при миграции потребуется переписать правила.
- Для стабильности на старом железе тестируйте режим hostap в лабораторных условиях.
Короткое объявление (100–200 слов)
FreeBSD теперь можно использовать как полноценную беспроводную точку доступа: этот гид описывает практическую настройку hostapd, pf и isc‑dhcpd для организации WLAN и проводного LAN с NAT. Вы узнаете, как подготовить систему, перекомпилировать ядро для pf, загрузить драйверы WLAN, настроить DHCP и hostapd с WPA‑защитой, а также как обеспечить автозапуск служб. Приведены примеры конфигураций, чек‑листы по ролям, рекомендации по безопасности и список типичных ошибок с методами их устранения. Гид подходит для домашних и небольших офисных сетей; для крупных корпоративных решений рассмотрите централизованные контроллеры и RADIUS.
Завершение
Поздравляем — после выполнения всех шагов у вас должна быть рабочая беспроводная точка доступа на базе FreeBSD. В случае проблем возвращайтесь к разделу отладки, проверяйте логи и по возможности тестируйте изменения на изолированной машине перед применением в продакшне.
Важно: регулярно обновляйте систему и следите за безопасностью Wi‑Fi.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента