среда, 16 февраля 2011 г.

Как использовать FreeBSD в качестве Wireless Access Point

В этом документе описывается, как настроить 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:

        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 - получает адрес по DHCP

     * fxp1 - lan_if - статический IP, 192.168.0.1; сеть 192.168.0.0/24;
       клиенты получают адреса по DHCP

     * ath0 - wifi_if - статический IP, 192.168.1.1; беспроводная сеть
       диапазона 192.168.1.0/24; клиенты получают адреса по DHCP

   Конфигурируем интерфейсы

    Поднимаем внутренний и внешние интерфейсы:

        dhclient fxp0
        ifconfig fxp1 inet 192.168.0.1 netmask 255.255.255.0

    Убедимся в том, что драйвера беспроводного адаптера загружены. Для
   карт на базе Atheros, выполните команду:

        for d in {if_ath,ath_rate,ath_hal}; do kldload $d; done

    Для всех карт, включая Atheros, необходимо убедиться в том, что
   загружены вспомогательные модули :

        for d in {wlan_wep_load,wlan_tkip_load,wlan_ccmp_load,wlan_xauth_load,wlan_acl_load}; do kldload $d; done

    Конфигурируем адрес на интерфейсе:

        ifconfig ath0 inet 192.168.1.1 netmask 255.255.255.0 ssid YOURSSID mediaopt hostap

   Конфигурируем 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:

        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;
        }

   Конфигурируем hostapd  Редактируем /etc/hostapd.conf :

        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

   Вносим изменения в 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:

        wlan_wep_load="YES"
        wlan_tkip_load="YES"
        wlan_ccmp_load="YES"
        wlan_xauth_load="YES"
        wlan_acl_load="YES"

   Демоны!
    Демоны будут стартовать после перезагрузки. Если ребутиться вам

   неохота, то:

        /etc/rc.d/pflog start
        /etc/rc.d/named start
        /etc/rc.d/dhcpd start
        /etc/rc.d/hostapd start

Комментариев нет:

Отправить комментарий