Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> Wi-FI роутер + DHCP + DNS

Wi-Fi роутер Freebsd 8 + DNS сервер + DHCP сервер

Автор: zentarim.


Wi-fi роутер с DHCP и DNS серверами FreeBSD 8.2

Что хотим получить:
- чтобы Wi-Fi клиенты были в одной подсети с проводными.
- чтобы проводные и беспроводные клиенты получали адреса автоматически по DHCP
- чтобы был кэширующий DNS
- само собой хотим, чтобы все ходили в интернет
- чтобы был доступ по RDP на внутренний сервер

В общем хотим получить что-то схожее по функционалу с роутером Dlink DIR-300

Что имеем:
Celeron 700, 256 мб RAM, IDE винт на 80 гб и странную мамку, которая вменяемо работает только с отключенным ACPI
сетевые карты:
LAN - rl0  (10\100 какой-то реалтек, найденный за шкафом на работе)
rl0@pci0:1:8:0:class=0x020000 card=0x813910ec chip=0x813910ec rev=0x10 hdr=0x00
  vendor   = 'Realtek Semiconductor'
  device   = Realtek RTL8139 Family PCI FastEthernet NIC RTL-8139/8139C/8139D
  class    = network
  subclass = ethernet

WAN - stge0 (10\100\1000 asus адаптер)
stge0@pci0:1:5:0:class=0x020000card=0x81801043chip=0x102313f0 rev=0x41 hdr=0x00
  vendor   = 'Sundance Technology Inc'
  device   = 'IC Plus IP1000 Family Gigabit Ethernet Adapter'
  class    = network
  subclass = ethernet

WLAN - ral0 (дешевая Wi-Fi карточка от Dlink)
ral0@pci0:1:10:0:class=0x028000card=0x3a711186chip=0x03021814 rev=0x00 hdr=0x00
  vendor   = 'Ralink Technology, Corp.'
  device   = 'wireless a/b (RT2525 2.4GHz transceiver + RT2560 MAC/BBP)'
  class    = network

предоставленный провайдером белый IP адрес:
IP     9.9.9.9
маска  255.255.255.0
шлюз   9.9.9.1
DNS1   9.9.9.254
DNS1   9.9.9.253
настройки отличаются от реально существующих, но сути это не меняет

диапазон локальной сети: 192.168.0.0 с маской 255.255.255.0

установлена ОС FreeBSD 8.2:
[root@GATE ~]# uname -a
FreeBSD GATE 8.2-RELEASE FreeBSD 8.2-RELEASE #0:Sat Apr  9 20:13:28 OMSST 2011 
    root@GATE:/usr/src/sys/i386/compile/GATE  i386

содержимое /etc/rc.conf:
keymap="ru.koi8-r"
hostname="GATE"
gateway_enable="YES"
defaultrouter="9.9.9.1"
sshd_enable="YES"
ifconfig_stge0="inet 9.9.9.9 netmask 255.255.255.0"
ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"

содержимое /etc/resolv.conf (DNS сервера):

nameserver 9.9.9.254
nameserver 9.9.9.253

Начинаем подготовку:

убираем из ядра все ненужные драйвера (ну или не убираем, кому как удобно) при этом оставляя все драйвера для беспроводных устройств. Если вы знаете, какой драйвер подходит для вашей карточки, то оставляете его, а остальные можете убрать.Я не знал, какой подойдет мне, поэтому оставил все. Пересобираем ядро с опциями:
device   if_bridge   # Модуль для работы моста
device   wlan      # поддержка 802.11 (Wi-fi)

# не знаю что это, подгружается автоматически
device   wlan_amrr   # AMRR transmit rate control algorith 

device   wlan_xauth   # Модуль поддержки авторизации для режима точки доступа
device   wlan_wep   # Модуль поддержки алгоритма безопасности WEP
device   wlan_tkip   # модуль поддержки шифрования TKIP
device   wlan_ccmp   # модуль поддержки шифрования CCMP



device      pf      # в качестве фаервола я использую Packet Filter
# поддержка алгоритма очередей (приоритезация трафика)
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

собираем и устанавливаем ядро:
[root@GATE ~]# cd /usr/src
[root@GATE /usr/src]# make buildkernel KERNCONF=GATE && \
make installkernel KERNCONF=GATE

Перезагружаемся и смотрим, что получилось:
[root@GATE ~]# ifconfig
stge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,
LINKSTATE>
  ether 01:01:01:01:01:01
  inet 9.9.9.9 netmask 0xffffff00 broadcast 9.9.9.255
  media: Ethernet autoselect (100baseTX <full-duplex>)
  status: active
rl0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
   options=3808<VLAN_MTU,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
   ether 00:50:fc:ef:4d:75
   inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
   media: Ethernet autoselect (100baseTX <full-duplex>)
   status: active
ral0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 2290
   ether 00:26:5a:77:38:ba
   media: IEEE 802.11 Wireless Ethernet autoselect (autoselect)
   status: no carrier
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
   options=3<RXCSUM,TXCSUM>
   inet 127.0.0.1 netmask 0xff000000

Wi-fi карточка определилась как ral0. Уже хорошо. Можно еще раз пересобрать ядро и убрать ненужные драйвера для беспроводок.

Редактируем /etc/hostapd.conf до такого состояния:
interface=wlan0
logger_syslog=-1
logger_syslog_level=0
logger_stdout=-1
logger_stdout_level=2
debug=3
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=<SSID вашей беспроводной сети>
macaddr_acl=0
# 1 - WPA1; 2 - WPA2; 3 - WPA1+WPA2
wpa=2
wpa_passphrase=<Пароль к беспроводной сети>
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP

#можно заморочится с допустимыми MAC адресами, но я не стал
#macaddr_acl=1
#accept_mac_file=/etc/hostapd.accept

Редактируем /etc/rc.conf:
keymap="ru.koi8-r"
hostname="GATE"
gateway_enable="YES"
defaultrouter="9.9.9.1"
sshd_enable="YES"
ifconfig_stge0="inet 9.9.9.9 netmask 255.255.255.0"
# настраиваем беспроводную карту как точку доступа
wlans_ral0="wlan0"
create_args_wlan0="wlanmode hostap"
ifconfig_wlan0="up mediaopt hostap"
# убираем IP адрес с интерфейса rl0
#ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"
# создаем мост между беспроводной и проводной локальными сетями
# и вешаем на него IP адрес шлюза локальной сети
cloned_interfaces="bridge0"
ifconfig_bridge0="inet 192.168.0.1 netmask 255.255.255.0 \
                                            addm wlan0 addm rl0 up"
ifconfig_rl0="up"
# включаем функционал точки доступа
hostapd_enable="YES"

Перезагружаемся. Смотрим, что получилось:
[root@GATE ~]# ifconfig
stge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,
LINKSTATE>
       ether 01:01:01:01:01:01
       inet 9.9.9.9 netmask 0xffffff00 broadcast 9.9.9.255
       media: Ethernet autoselect (100baseTX <full-duplex>)
       status: active
rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
       options=3808<VLAN_MTU,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
       ether 00:50:fc:ef:4d:75
       media: Ethernet autoselect (100baseTX <full-duplex>)
       status: active
ral0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 2290
       ether 00:26:5a:77:38:ba
       media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
       status: running
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
       options=3<RXCSUM,TXCSUM>
       inet 127.0.0.1 netmask 0xff000000
bridge0:flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
       ether a6:09:ed:c1:23:38
       inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
       id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
       maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
       root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
       member: rl0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
               ifmaxaddr 0 port 2 priority 128 path cost 200000
       member: wlan0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
               ifmaxaddr 0 port 6 priority 128 path cost 370370
wlan0:flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
       ether 00:26:5a:77:38:ba
       media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
       status: running
       ssid <SSID вашей сети> channel 1 (2412 MHz 11g) bssid 00:26:5a:77:38:ba
       country US authmode WPA2/802.11i privacy MIXED deftxkey 2
       AES-CCM 2:128-bit AES-CCM 3:128-bit txpower 0 scanvalid 60
       protmode CTS dtimperiod 1 -dfs

Все хорошо, Wi-fi и проводная карточки обьединены мостом и на этом мосту висит IP адрес

Приступаем к настройке PF. PF позволяет включить приоритезацию трафика. Краткое описание смотрим тут:
http://www.freebsd.org/doc/ru/books/handbook/firewalls-pf.html
создаем файлик /usr/local/etc/pf.conf и доводим его до такого состояния:
# Тут я определяю переменные, при помощи которых мне удобнее писать скрипт.
WAN="stge0"
LAN="bridge0"
LAN_POOL="192.168.0.0/24"
WANIP="9.9.9.9"
SERVER="192.168.0.3"
ADMIN="192.168.0.2"
RDP_PORT="3389"
EXTRDP_PORT="33389"
# трафик на эти порты и от них будет запрещен на внешнем интерфейсе
DROP_PORTS="{135:139,445}"

# Что делать после попадания какого-либо пакета в блокирующее правило (block)
# set block-policy drop - отбросить пакет и ничего не предпринимать
# set block-policy reject - отбросить пакет и отправить сообщение об ошибке 
# хосту, который его отправил.
set block-policy drop
# Не проверять трафик на lo0
set skip on lo0
# Не проверять трафик на интерфейсе bridge0 (внутренних ограничений у нас нет)
set skip on $LAN

# "Нормализация" пакетов. Описания этой опции, на мой взгляд, достаточно 
# расплывчаты, но поидее должна помогать против некоторых видов сетевых атак.
scrub in all

#У меня скорость ~5000 кбит\с, а вам надо тут вписывать свою скорость
altq on $WAN priq bandwidth 5000Kb  queue { priv, other }

# У меня пристутствуют 2 очереди
# Для более приоритетного трафика (RDP от сервера)
queue priv qlimit 25 priority 14 priq(red)
# Для всех остальных
queue other qlimit 30 priority 10 priq(default)
# Размеры очередей взяты, можно сказать, с потолка :( Не слишком
# ориентируйтесь на них, пожалуйста. Попробуйте подобрать размер очереди сами

# включаем NAT на внешнем интерфейсе для LAN сети
nat on $WAN from $LAN_POOL to any -> ($WAN)

# Пробрасываем порт на сервер.Пробрасываем отличающийся от стандартного порт 
# для защиты от сканирующих стандартные порты обезьян с брутфорсом
rdr on $WAN proto tcp from any to $WANIP \ 
                                  port $EXTRDP_PORT -> $SERVER port $RDP_PORT

# Обрубаем ping запросы до нашего адреса
block quick on $WAN proto icmp from any to $WANIP icmp-type 8
# На внешнем интерфейсе не должно быть трафика от NETBIOS
block quick on $WAN proto { tcp udp } from any to any port $DROP_PORTS
# включаем антиспуфиг на WAN интерфейсе
# Цитирую http://openbsd.corebsd.or.id/faq/pf/ru/filter.html:
# Адреса спуфятся(spoofing), когда злоумышленник подделывает исходные 
# IP адреса в пакетах, они передаются либо в оболочку своих реальных адресов,
# либо изображают другой узел в сети.После того, как пользователь был заспуфен
# они смогут запустить сетевую атаку без разоблачения реального источника
# атаки или попробовать получить доступ к сетевым сервисам, которые
# ограничены на определённые IP адреса.
antispoof quick for $WAN

#Запрет всего явно не разрешенного трафика
block all

# ### Входящий трафик
# Привилегированный трафик
pass in quick on $WAN proto tcp from any to $WANIP port $EXTRDP_PORT queue priv
# Обычный трафик
pass in quick on $WAN from any to $WANIP keep state queue other

# Вообще-то на входящем трафике приоритезация в PF не работает,но правила я 
# все-таки написал.

# ### Исходящий трафик
# Привилегированный трафик
pass out quick on $WAN proto tcp from $WANIP \
                                 port $EXTRDP_PORT to any keep state queue priv
# Обычный трафик
pass out quick on $WAN from $WANIP to any keep state queue other

Добавляем в /etc/rc.conf строки:
pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"

и рестартуем pf:
[root@GATE ~]# /etc/rc.d/pf restart

Проверяем корректность создания правил при помощи команд:

pfctl -sn Cуществующие правила NAT
pfctl -sr Существующие правила трансляции
pfctl -ss Установленные соединения
pfctl -si Различные счетчики
pfctl -sa Все вышеперечисленное сразу
pfctl -sq -vvv Показывает состояние очередей

Обновляем порты при помощи portsnap:
[root@GATE ~]# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... 5 mirrors found.
Fetching snapshot tag from portsnap5.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Wed Jun 15 14:21:31 MSD 2011 to Thu Jul 21 11:37:27 MSD 2011.
Fetching 3 metadata patches.. done.
Applying metadata patches... done.
Fetching 3 metadata files... done.
Fetching 9656 patches.....10....
<Часть вывода удалена>
...........9650... done.
Applying patches... done.
Fetching 1282 new ports or files... done.
[root@GATE ~]# portsnap extract
/usr/ports/.cvsignore
/usr/ports/CHANGES
.................
<Часть вывода удалена>
.................
/usr/ports/x11/yelp/
/usr/ports/x11/zenity/
Building new INDEX files... done.

В качестве кэширующего DNS-сервера используем dnscache из пакета djbdns, так как он ест меньше памяти и считается более безопасным, чем входящий в поставку FreeBSD DNS-сервер BIND.

устанавливаем djbdns:
[root@GATE ~]# cd /usr/ports/dns/djbdns && make install clean

Собираем и устанавливаем с такими опциями:
[ ] DUMPCACHE        persistent cache for dnscache
[ ] IPV6             IPv6 support by Felix von Leitner
[ ] IGNOREIP         ignoreip2 patch by Russell Nelson
[ ] JUMBO            jumbo patch by Claudiu Costin
[X] MAN              manual pages by Gerritt Pape
[ ] PERSISTENT_MMAP  persistent mmap patch by Lennert Buytenhek
[X] SRV              SRV record patch by Michael Handler

djbdns также потянет за собой порт daemontools. daemontools предназначен для запуска демонов и наблюдения за их работой. То есть если какой-то демон под его управлением "упадет", то daemontools перезапустит его.

создаем группу dnsusers, в которую будут входить пользователи, под которыми будут запускаться сам dnscache и dnslog (логгер для djbdns):
[root@GATE ~]# pw groupadd dnsusers

создаем пользователя для dnscache:
[root@GATE ~]# pw useradd dnscache -s /sbin/nologin -d /dev/null -G dnsusers

создаем пользователя для dnslog:
[root@GATE ~]# pw useradd dnslog -s /sbin/nologin -d /dev/null -G dnsusers

создаем папку, с содержимым которой работает daemontools:
[root@GATE ~]# mkdir /var/service/

добавляем в /etc/rc.conf запуск damontools:
[root@GATE ~]# echo 'svscan_enable="YES"' >> /etc/rc.conf

запускаем daemontools:
[root@GATE ~]# /usr/local/etc/rc.d/svscan start

производим начальное конфигурирование dnscache, задавая ему адрес, на котором он будет висеть. В моем случае адрес 192.168.0.1:
[root@GATE ~]# dnscache-conf dnscache dnslog /usr/local/etc/dnscache 192.168.0.1

так как конфигурация dnscache находится в /usr/local/etc/djbdns, а daemontools работает с папкой /var/service, делаем ссылку:
[root@GATE ~]#  ln -s /usr/local/etc/dnscache /var/service/dnscache

В папке /usr/local/etc/dnscache/env находятся файлы с более расширенной конфигурацией dnscache, но в данном случае нас вполне устроят значения по умолчанию.

Для нормальной работы сервера нужно задать ему адреса вышестоящих серверов. За каждую зону отвечает файл с таким же, что и имя зоны, именем, находящийся в /usr/local/etc/dnscache/root/servers. В каждый файл вписываются ip адреса серверов, ответственных за эту зону. Так как мы любые запросы перенаправляем на DNS-сервера провайдера, мы пишем их имена в файл с именем "@" (ответственный за корневую зону).
[root@GATE ~]# cat /usr/local/etc/dnscache/root/servers/@
9.9.9.254
9.9.9.253

Защищаем наш сервер от обращений с не наших IP адресов. Создаем в папке /usr/local/etc/dnscache/root/ip файлы с именами сетей. То есть для нашей сети (префикс 24) нужно создать файл 192.168.0
[root@GATE ~]# touch /usr/local/etc/dnscache/root/ip/192.168.0

Перезапускаем dnscache:
[root@GATE ~]# svc -t /var/service/dnscache

Проверяем, все ли нормально:
[root@GATE ~]# svstat /var/service/dnscache
/var/service/dnscache: up (pid 11085) 141 seconds

[root@GATE ~]# sockstat -l | grep dnscache
dnscache dnscache   11085 3  udp4   192.168.0.1:53       *:*
dnscache dnscache   11085 4  tcp4   192.168.0.1:53       *:*

все нормально, заставляем фряху обращаться к своему DNS-серверу. Для этого пишем в файл /etc/resolv.conf адрес, на котором висит dnscache:
[root@GATE ~]# echo "nameserver 192.168.0.1" > /etc/resolv.conf

Устанавливаем DHCP сервер (я его собрал с такими опциями):

[root@GATE ~]# cd /usr/ports/net/isc-dhcp41-server && make install clean

  Options for isc-dhcp41-server 4.1.e_1,2   

[ ] DHCP_IPV6      Enable support for IPv6
[X] DHCP_PARANOIA  Enable support for chroot
[ ] DHCP_LDAP      Experimental LDAP backend support
[ ] DHCP_LDAP_SSL  Support LDAP connection over SSL/TLS

Доводим конфиг DHCP сервера (/usr/local/etc/dhcpd.conf) до такого состояния:
local-address 192.168.0.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
ddns-update-style interim;
log-facility local7;
subnet 192.168.0.0 netmask 255.255.255.0 {
   range 192.168.0.10 192.168.0.250;
   option routers 192.168.0.1;
# Если у вас поднята SAMBA, то вы можете попробовать отдавать клиентам
# еще и значение WINS-сервера.
#   option netbios-name-servers 192.168.0.1;

# у нас уже поднят свой DNS-сервер, поэтому отдаем его адрес
option domain-name-servers 192.168.0.1;
                                }
# "привязываем" определенные MAC адреса к определенным IP адресам
        host admin {
            hardware ethernet 03:03:03:03:03:03;
            fixed-address 192.168.0.2;
        }
        host server {
             hardware ethernet 04:04:04:04:04:04;
             fixed-address 192.168.0.3;
        }

Добавляем в /etc/rc.conf строки:
dhcpd_enable="YES"
dhcpd_ifaces="bridge0"   #интерфейс, на котором будет работать DHCP-сервер
# в нашем случае и для проводной и для беспроводной сети

и стартуем DHCP сервер:
[root@GATE ~]# /usr/local/etc/rc.d/isc-dhcpd start

Проверяем, запустился или нет:
[root@GATE ~]# sockstat -l | grep dhcpd
dhcpd    dhcpd      1047  7  udp4   192.168.0.1:67       *:*

Все нормально. Функционал простейшего dir-300 достигнут.



размещено: 2011-08-14,
последнее обновление: 2013-09-24,
автор: zentarim

Aler, 2011-08-16 в 6:45:25

а про \"- чтобы проводные и беспроводные клиенты получали адреса автоматически по DHCP\"?

zentarim, 2011-08-17 в 9:33:34

исправил

nero777, 2011-08-21 в 9:25:31

молодец,как-будто мои мысли прочитал.попробую с WN-321G

ufs, 2011-08-23 в 12:58:51

Товарищ zentarim, а как это вы шейпинг строите таким методом

#У меня скорость ~5000 кбит\с, а вам надо тут вписывать свою скорость
altq on $WAN priq bandwidth 5000Kb  queue { priv, other }

ИМХО на практике такой шейпинг не будет работать, ибо рекомендовано 8-12% реальной полосы брать, а если канал загружен на 98% - начинает дропаться трафик.
Думайте сами, решайте сами - иметь или не иметь (с)

zentarim, 2011-08-23 в 20:44:45

Не пугайте, пожалуйста, народ такими дикими цифрами. Почему не 5%, например? Приведите ссылку на ваши 8-12%. Откуда взялись 98% мне так же непонятно. У этой статьи есть тема для обсуждения. Пишите ваши соображения туда.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0607 секунд
Из них PHP: 50%; SQL: 50%; Число SQL-запросов: 76 шт.
У Вас отключено GZIP-сжатие в браузере. Размер страницы 68992