Документация по ОС FreeBSD Четверг, 05.12.2024, 04:23
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Net

Wi-Fi роутер Freebsd 8 + DNS сервер + DHCP сервер [2011]
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 карточка определилась. Уже хорошо.

Редактируем /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 перезапустит его.

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

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

создаем пользователя для dnscache:
[root@GATE ~]# pw useradd dnscache -s /bin/nologin -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 ~]# cat /etc/resolv.conf
192.168.72.1

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



Источник: http://www.lissyara.su/?id=2204
Категория: Net | Добавил: oleg (12.08.2011) | Автор: zentarim
Просмотров: 1540 | Рейтинг: 4.0/1 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024